[rsyntaxtextarea] 01/08: Imported Upstream version 2.0.7

Benjamin Mesing ben at alioth.debian.org
Mon Sep 30 20:11:02 UTC 2013


This is an automated email from the git hooks/post-receive script.

ben pushed a commit to branch master
in repository rsyntaxtextarea.

commit be7ee478c86658ecbda8f9ba3c0a0bb7c0ee5a55
Author: Benjamin Mesing <bensmail at gmx.net>
Date:   Mon Sep 23 20:57:48 2013 +0200

    Imported Upstream version 2.0.7
---
 .classpath                                         |   10 +
 .project                                           |   17 +
 build.xml                                          |  116 +
 distfiles/RSyntaxTextArea.License.txt              |   24 +
 distfiles/readme.txt                               |   80 +
 .../fife/ui/rsyntaxtextarea/ErrorStrip.properties  |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_ar.properties    |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_de.properties    |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_es.properties    |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_fr.properties    |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_hu.properties    |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_in.properties    |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_it.properties    |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_ja.properties    |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_ko.properties    |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_nl.properties    |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_pl.properties    |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_pt_BR.properties |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_ru.properties    |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_tr.properties    |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_zh_CN.properties |    3 +
 .../ui/rsyntaxtextarea/ErrorStrip_zh_TW.properties |    3 +
 .../ui/rsyntaxtextarea/RSyntaxTextArea.properties  |   14 +
 .../rsyntaxtextarea/RSyntaxTextArea_ar.properties  |   14 +
 .../rsyntaxtextarea/RSyntaxTextArea_de.properties  |   14 +
 .../rsyntaxtextarea/RSyntaxTextArea_es.properties  |   14 +
 .../rsyntaxtextarea/RSyntaxTextArea_fr.properties  |   14 +
 .../rsyntaxtextarea/RSyntaxTextArea_hu.properties  |   14 +
 .../rsyntaxtextarea/RSyntaxTextArea_in.properties  |   14 +
 .../rsyntaxtextarea/RSyntaxTextArea_it.properties  |   14 +
 .../rsyntaxtextarea/RSyntaxTextArea_ja.properties  |   14 +
 .../rsyntaxtextarea/RSyntaxTextArea_ko.properties  |   14 +
 .../rsyntaxtextarea/RSyntaxTextArea_nl.properties  |   14 +
 .../rsyntaxtextarea/RSyntaxTextArea_pl.properties  |   15 +
 .../RSyntaxTextArea_pt_BR.properties               |   14 +
 .../rsyntaxtextarea/RSyntaxTextArea_ru.properties  |   14 +
 .../rsyntaxtextarea/RSyntaxTextArea_tr.properties  |   14 +
 .../RSyntaxTextArea_zh_CN.properties               |   14 +
 .../RSyntaxTextArea_zh_TW.properties               |   14 +
 .../focusabletip/FocusableTip.properties           |    1 +
 .../focusabletip/FocusableTip_ar.properties        |    1 +
 .../focusabletip/FocusableTip_de.properties        |    1 +
 .../focusabletip/FocusableTip_es.properties        |    1 +
 .../focusabletip/FocusableTip_fr.properties        |    1 +
 .../focusabletip/FocusableTip_hu.properties        |    1 +
 .../focusabletip/FocusableTip_in.properties        |    1 +
 .../focusabletip/FocusableTip_it.properties        |    1 +
 .../focusabletip/FocusableTip_ja.properties        |    1 +
 .../focusabletip/FocusableTip_ko.properties        |    1 +
 .../focusabletip/FocusableTip_nl.properties        |    1 +
 .../focusabletip/FocusableTip_pl.properties        |    1 +
 .../focusabletip/FocusableTip_pt_BR.properties     |    1 +
 .../focusabletip/FocusableTip_ru.properties        |    1 +
 .../focusabletip/FocusableTip_tr.properties        |    1 +
 .../focusabletip/FocusableTip_zh_CN.properties     |    1 +
 .../focusabletip/FocusableTip_zh_TW.properties     |    1 +
 i18n/org/fife/ui/rtextarea/RTextArea.properties    |   29 +
 i18n/org/fife/ui/rtextarea/RTextArea_ar.properties |   29 +
 i18n/org/fife/ui/rtextarea/RTextArea_de.properties |   29 +
 i18n/org/fife/ui/rtextarea/RTextArea_es.properties |   29 +
 i18n/org/fife/ui/rtextarea/RTextArea_fr.properties |   29 +
 i18n/org/fife/ui/rtextarea/RTextArea_hu.properties |   29 +
 i18n/org/fife/ui/rtextarea/RTextArea_in.properties |   29 +
 i18n/org/fife/ui/rtextarea/RTextArea_it.properties |   29 +
 i18n/org/fife/ui/rtextarea/RTextArea_ja.properties |   29 +
 i18n/org/fife/ui/rtextarea/RTextArea_ko.properties |   29 +
 i18n/org/fife/ui/rtextarea/RTextArea_nl.properties |   29 +
 i18n/org/fife/ui/rtextarea/RTextArea_pl.properties |   29 +
 .../fife/ui/rtextarea/RTextArea_pt_BR.properties   |   29 +
 i18n/org/fife/ui/rtextarea/RTextArea_ru.properties |   29 +
 i18n/org/fife/ui/rtextarea/RTextArea_tr.properties |   29 +
 .../fife/ui/rtextarea/RTextArea_zh_CN.properties   |   29 +
 .../fife/ui/rtextarea/RTextArea_zh_TW.properties   |   29 +
 src/org/fife/io/DocumentReader.java                |  209 +
 src/org/fife/io/UnicodeReader.java                 |  268 +
 src/org/fife/io/UnicodeWriter.java                 |  253 +
 src/org/fife/io/package.html                       |    5 +
 src/org/fife/print/RPrintUtilities.java            |  530 +
 src/org/fife/print/package.html                    |    5 +
 .../rsyntaxtextarea/AbstractJFlexCTokenMaker.java  |  222 +
 .../rsyntaxtextarea/AbstractJFlexTokenMaker.java   |   52 +
 .../ui/rsyntaxtextarea/AbstractTokenMaker.java     |   67 +
 .../rsyntaxtextarea/AbstractTokenMakerFactory.java |  132 +
 .../ui/rsyntaxtextarea/ActiveLineRangeEvent.java   |   68 +
 .../rsyntaxtextarea/ActiveLineRangeListener.java   |   44 +
 .../ChangeableColorHighlightPainter.java           |   67 +
 .../ui/rsyntaxtextarea/CodeTemplateManager.java    |  470 +
 .../rsyntaxtextarea/DefaultOccurrenceMarker.java   |   53 +
 .../ui/rsyntaxtextarea/DefaultTokenFactory.java    |  137 +
 .../rsyntaxtextarea/DefaultTokenMakerFactory.java  |   72 +
 .../ui/rsyntaxtextarea/DefaultTokenPainter.java    |  267 +
 src/org/fife/ui/rsyntaxtextarea/DocumentRange.java |   62 +
 src/org/fife/ui/rsyntaxtextarea/ErrorStrip.java    |  766 +
 .../fife/ui/rsyntaxtextarea/FileFileLocation.java  |  114 +
 src/org/fife/ui/rsyntaxtextarea/FileLocation.java  |  141 +
 .../rsyntaxtextarea/FoldingAwareIconRowHeader.java |  247 +
 src/org/fife/ui/rsyntaxtextarea/LinkGenerator.java |   50 +
 .../ui/rsyntaxtextarea/LinkGeneratorResult.java    |   53 +
 .../MarkOccurrencesHighlightPainter.java           |  139 +
 .../ui/rsyntaxtextarea/MarkOccurrencesSupport.java |  314 +
 .../fife/ui/rsyntaxtextarea/OccurrenceMarker.java  |   36 +
 src/org/fife/ui/rsyntaxtextarea/ParserManager.java |  707 +
 .../ui/rsyntaxtextarea/PopupWindowDecorator.java   |   68 +
 src/org/fife/ui/rsyntaxtextarea/RSTAView.java      |   62 +
 .../fife/ui/rsyntaxtextarea/RSyntaxDocument.java   |  589 +
 .../fife/ui/rsyntaxtextarea/RSyntaxTextArea.java   | 3018 +++
 .../RSyntaxTextAreaDefaultInputMap.java            |   79 +
 .../rsyntaxtextarea/RSyntaxTextAreaEditorKit.java  | 1903 ++
 .../RSyntaxTextAreaHighlighter.java                |  449 +
 .../fife/ui/rsyntaxtextarea/RSyntaxTextAreaUI.java |  256 +
 .../fife/ui/rsyntaxtextarea/RSyntaxUtilities.java  | 1332 +
 src/org/fife/ui/rsyntaxtextarea/RTfToText.java     |  227 +
 src/org/fife/ui/rsyntaxtextarea/RtfGenerator.java  |  484 +
 .../fife/ui/rsyntaxtextarea/RtfTransferable.java   |   91 +
 .../SelectRegionLinkGeneratorResult.java           |   59 +
 .../SquiggleUnderlineHighlightPainter.java         |  117 +
 src/org/fife/ui/rsyntaxtextarea/Style.java         |  192 +
 .../fife/ui/rsyntaxtextarea/SyntaxConstants.java   |  253 +
 src/org/fife/ui/rsyntaxtextarea/SyntaxScheme.java  |  675 +
 src/org/fife/ui/rsyntaxtextarea/SyntaxView.java    |  974 +
 .../fife/ui/rsyntaxtextarea/TextEditorPane.java    |  712 +
 src/org/fife/ui/rsyntaxtextarea/Theme.java         |  842 +
 src/org/fife/ui/rsyntaxtextarea/Token.java         | 1090 +
 src/org/fife/ui/rsyntaxtextarea/TokenFactory.java  |   67 +
 src/org/fife/ui/rsyntaxtextarea/TokenMaker.java    |  170 +
 .../fife/ui/rsyntaxtextarea/TokenMakerBase.java    |  298 +
 .../fife/ui/rsyntaxtextarea/TokenMakerFactory.java |  124 +
 src/org/fife/ui/rsyntaxtextarea/TokenMap.java      |  276 +
 .../fife/ui/rsyntaxtextarea/TokenOrientedView.java |   61 +
 src/org/fife/ui/rsyntaxtextarea/TokenPainter.java  |   96 +
 src/org/fife/ui/rsyntaxtextarea/TokenTypes.java    |   85 +
 .../fife/ui/rsyntaxtextarea/URLFileLocation.java   |  153 +
 .../VisibleWhitespaceTokenPainter.java             |  188 +
 .../fife/ui/rsyntaxtextarea/WrappedSyntaxView.java | 1372 ++
 .../ui/rsyntaxtextarea/WrappedSyntaxView2.java     |  157 +
 .../ui/rsyntaxtextarea/XmlOccurrenceMarker.java    |  185 +
 .../rsyntaxtextarea/focusabletip/FocusableTip.java |  344 +
 .../ui/rsyntaxtextarea/focusabletip/SizeGrip.java  |  249 +
 .../ui/rsyntaxtextarea/focusabletip/TipUtil.java   |  226 +
 .../ui/rsyntaxtextarea/focusabletip/TipWindow.java |  334 +
 .../rsyntaxtextarea/focusabletip/osx_sizegrip.png  |  Bin 0 -> 4876 bytes
 .../ui/rsyntaxtextarea/focusabletip/package.html   |    5 +
 .../rsyntaxtextarea/folding/CurlyFoldParser.java   |  317 +
 src/org/fife/ui/rsyntaxtextarea/folding/Fold.java  |  564 +
 .../ui/rsyntaxtextarea/folding/FoldCollapser.java  |  106 +
 .../ui/rsyntaxtextarea/folding/FoldManager.java    |  710 +
 .../ui/rsyntaxtextarea/folding/FoldParser.java     |   41 +
 .../rsyntaxtextarea/folding/FoldParserManager.java |  120 +
 .../fife/ui/rsyntaxtextarea/folding/FoldType.java  |   59 +
 .../ui/rsyntaxtextarea/folding/HtmlFoldParser.java |  402 +
 .../ui/rsyntaxtextarea/folding/JsonFoldParser.java |  161 +
 .../rsyntaxtextarea/folding/LatexFoldParser.java   |  108 +
 .../ui/rsyntaxtextarea/folding/LispFoldParser.java |   33 +
 .../ui/rsyntaxtextarea/folding/NsisFoldParser.java |  156 +
 .../ui/rsyntaxtextarea/folding/XmlFoldParser.java  |  148 +
 .../fife/ui/rsyntaxtextarea/folding/package.html   |    5 +
 .../modes/AbstractMarkupTokenMaker.java            |   54 +
 .../modes/ActionScriptTokenMaker.flex              |  498 +
 .../modes/ActionScriptTokenMaker.java              | 2071 ++
 .../modes/AssemblerX86TokenMaker.flex              | 1035 +
 .../modes/AssemblerX86TokenMaker.java              | 1867 ++
 .../ui/rsyntaxtextarea/modes/BBCodeTokenMaker.flex |  270 +
 .../ui/rsyntaxtextarea/modes/BBCodeTokenMaker.java |  725 +
 .../rsyntaxtextarea/modes/CPlusPlusTokenMaker.flex |  669 +
 .../rsyntaxtextarea/modes/CPlusPlusTokenMaker.java | 2319 ++
 .../ui/rsyntaxtextarea/modes/CSSTokenMaker.flex    |  413 +
 .../ui/rsyntaxtextarea/modes/CSSTokenMaker.java    |  976 +
 .../ui/rsyntaxtextarea/modes/CSharpTokenMaker.flex |  517 +
 .../ui/rsyntaxtextarea/modes/CSharpTokenMaker.java | 1600 ++
 .../fife/ui/rsyntaxtextarea/modes/CTokenMaker.flex |  643 +
 .../fife/ui/rsyntaxtextarea/modes/CTokenMaker.java | 2072 ++
 .../rsyntaxtextarea/modes/ClojureTokenMaker.flex   |  568 +
 .../rsyntaxtextarea/modes/ClojureTokenMaker.java   | 2296 ++
 .../ui/rsyntaxtextarea/modes/DelphiTokenMaker.flex |  562 +
 .../ui/rsyntaxtextarea/modes/DelphiTokenMaker.java | 1631 ++
 .../ui/rsyntaxtextarea/modes/DtdTokenMaker.flex    |  345 +
 .../ui/rsyntaxtextarea/modes/DtdTokenMaker.java    |  828 +
 .../rsyntaxtextarea/modes/FortranTokenMaker.flex   |  480 +
 .../rsyntaxtextarea/modes/FortranTokenMaker.java   | 1011 +
 .../ui/rsyntaxtextarea/modes/GroovyTokenMaker.flex |  888 +
 .../ui/rsyntaxtextarea/modes/GroovyTokenMaker.java | 5269 ++++
 .../ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex   | 1187 +
 .../ui/rsyntaxtextarea/modes/HTMLTokenMaker.java   | 2984 +++
 .../ui/rsyntaxtextarea/modes/JSPTokenMaker.flex    | 1563 ++
 .../ui/rsyntaxtextarea/modes/JSPTokenMaker.java    | 5316 ++++
 .../modes/JavaScriptTokenMaker.flex                |  888 +
 .../modes/JavaScriptTokenMaker.java                | 2130 ++
 .../ui/rsyntaxtextarea/modes/JavaTokenMaker.flex   |  754 +
 .../ui/rsyntaxtextarea/modes/JavaTokenMaker.java   | 4966 ++++
 .../ui/rsyntaxtextarea/modes/JsonTokenMaker.flex   |  260 +
 .../ui/rsyntaxtextarea/modes/JsonTokenMaker.java   |  699 +
 .../ui/rsyntaxtextarea/modes/LatexTokenMaker.flex  |  268 +
 .../ui/rsyntaxtextarea/modes/LatexTokenMaker.java  |  716 +
 .../ui/rsyntaxtextarea/modes/LispTokenMaker.flex   |  432 +
 .../ui/rsyntaxtextarea/modes/LispTokenMaker.java   | 1308 +
 .../ui/rsyntaxtextarea/modes/LuaTokenMaker.flex    |  372 +
 .../ui/rsyntaxtextarea/modes/LuaTokenMaker.java    |  967 +
 .../rsyntaxtextarea/modes/MakefileTokenMaker.flex  |  336 +
 .../rsyntaxtextarea/modes/MakefileTokenMaker.java  |  863 +
 .../ui/rsyntaxtextarea/modes/MxmlTokenMaker.flex   |  809 +
 .../ui/rsyntaxtextarea/modes/MxmlTokenMaker.java   | 2704 +++
 .../ui/rsyntaxtextarea/modes/NSISTokenMaker.flex   |  745 +
 .../ui/rsyntaxtextarea/modes/NSISTokenMaker.java   | 2979 +++
 .../ui/rsyntaxtextarea/modes/PHPTokenMaker.flex    | 2319 ++
 .../ui/rsyntaxtextarea/modes/PHPTokenMaker.java    |25424 ++++++++++++++++++++
 .../ui/rsyntaxtextarea/modes/PerlTokenMaker.flex   |  810 +
 .../ui/rsyntaxtextarea/modes/PerlTokenMaker.java   | 2106 ++
 .../rsyntaxtextarea/modes/PlainTextTokenMaker.flex |  226 +
 .../rsyntaxtextarea/modes/PlainTextTokenMaker.java |  643 +
 .../modes/PropertiesFileTokenMaker.flex            |  235 +
 .../modes/PropertiesFileTokenMaker.java            |  661 +
 .../ui/rsyntaxtextarea/modes/PythonTokenMaker.flex |  441 +
 .../ui/rsyntaxtextarea/modes/PythonTokenMaker.java | 1088 +
 .../ui/rsyntaxtextarea/modes/RubyTokenMaker.flex   |  763 +
 .../ui/rsyntaxtextarea/modes/RubyTokenMaker.java   | 1666 ++
 .../ui/rsyntaxtextarea/modes/SASTokenMaker.flex    |  675 +
 .../ui/rsyntaxtextarea/modes/SASTokenMaker.java    | 1488 ++
 .../ui/rsyntaxtextarea/modes/SQLTokenMaker.flex    |  463 +
 .../ui/rsyntaxtextarea/modes/SQLTokenMaker.java    | 1126 +
 .../ui/rsyntaxtextarea/modes/ScalaTokenMaker.flex  |  386 +
 .../ui/rsyntaxtextarea/modes/ScalaTokenMaker.java  |  995 +
 .../ui/rsyntaxtextarea/modes/TclTokenMaker.flex    |  404 +
 .../ui/rsyntaxtextarea/modes/TclTokenMaker.java    | 1075 +
 .../rsyntaxtextarea/modes/UnixShellTokenMaker.java | 1113 +
 .../modes/VisualBasicTokenMaker.flex               |  462 +
 .../modes/VisualBasicTokenMaker.java               | 1619 ++
 .../modes/WindowsBatchTokenMaker.java              |  603 +
 .../ui/rsyntaxtextarea/modes/XMLTokenMaker.flex    |  485 +
 .../ui/rsyntaxtextarea/modes/XMLTokenMaker.java    |  992 +
 src/org/fife/ui/rsyntaxtextarea/modes/package.html |    5 +
 src/org/fife/ui/rsyntaxtextarea/package.html       |    5 +
 .../ui/rsyntaxtextarea/parser/AbstractParser.java  |   95 +
 .../rsyntaxtextarea/parser/DefaultParseResult.java |  145 +
 .../parser/DefaultParserNotice.java                |  268 +
 .../parser/ExtendedHyperlinkListener.java          |   38 +
 .../ui/rsyntaxtextarea/parser/ParseResult.java     |   84 +
 src/org/fife/ui/rsyntaxtextarea/parser/Parser.java |   76 +
 .../ui/rsyntaxtextarea/parser/ParserNotice.java    |  130 +
 .../ui/rsyntaxtextarea/parser/TaskTagParser.java   |  158 +
 .../ui/rsyntaxtextarea/parser/ToolTipInfo.java     |   95 +
 .../fife/ui/rsyntaxtextarea/parser/XmlParser.java  |  229 +
 .../fife/ui/rsyntaxtextarea/parser/package.html    |    9 +
 .../templates/AbstractCodeTemplate.java            |  132 +
 .../ui/rsyntaxtextarea/templates/CodeTemplate.java |   73 +
 .../templates/StaticCodeTemplate.java              |  262 +
 .../fife/ui/rsyntaxtextarea/templates/package.html |    5 +
 .../fife/ui/rtextarea/AbstractGutterComponent.java |  114 +
 .../ui/rtextarea/BackgroundPainterStrategy.java    |   44 +
 .../BufferedImageBackgroundPainterStrategy.java    |   98 +
 .../ui/rtextarea/ChangeableHighlightPainter.java   |  440 +
 .../rtextarea/ColorBackgroundPainterStrategy.java  |  108 +
 src/org/fife/ui/rtextarea/ConfigurableCaret.java   |  722 +
 src/org/fife/ui/rtextarea/FoldIndicator.java       |  685 +
 src/org/fife/ui/rtextarea/Gutter.java              |  965 +
 src/org/fife/ui/rtextarea/GutterIconInfo.java      |   53 +
 src/org/fife/ui/rtextarea/IconGroup.java           |  245 +
 src/org/fife/ui/rtextarea/IconRowHeader.java       |  864 +
 .../rtextarea/ImageBackgroundPainterStrategy.java  |  171 +
 .../fife/ui/rtextarea/LineHighlightManager.java    |  207 +
 src/org/fife/ui/rtextarea/LineNumberList.java      |  710 +
 src/org/fife/ui/rtextarea/Macro.java               |  392 +
 src/org/fife/ui/rtextarea/RDocument.java           |   65 +
 .../fife/ui/rtextarea/RDocumentCharSequence.java   |  118 +
 src/org/fife/ui/rtextarea/RTADefaultInputMap.java  |  151 +
 .../fife/ui/rtextarea/RTATextTransferHandler.java  |  480 +
 src/org/fife/ui/rtextarea/RTextArea.java           | 1707 ++
 src/org/fife/ui/rtextarea/RTextAreaBase.java       | 1179 +
 src/org/fife/ui/rtextarea/RTextAreaEditorKit.java  | 2582 ++
 src/org/fife/ui/rtextarea/RTextAreaUI.java         |  581 +
 src/org/fife/ui/rtextarea/RTextScrollPane.java     |  236 +
 src/org/fife/ui/rtextarea/RUndoManager.java        |  251 +
 .../fife/ui/rtextarea/RecordableTextAction.java    |  289 +
 src/org/fife/ui/rtextarea/RegExReplaceInfo.java    |   85 +
 src/org/fife/ui/rtextarea/SearchContext.java       |  244 +
 src/org/fife/ui/rtextarea/SearchEngine.java        |  833 +
 src/org/fife/ui/rtextarea/ToolTipSupplier.java     |   39 +
 .../VolatileImageBackgroundPainterStrategy.java    |  136 +
 src/org/fife/ui/rtextarea/package.html             |    5 +
 src/org/fife/util/DynamicIntArray.java             |  423 +
 src/org/fife/util/package.html                     |    5 +
 src/theme.dtd                                      |   78 +
 test/org/fife/ui/rtextarea/SearchEngineTest.java   |  647 +
 test/org/fife/ui/rtextarea/text.txt                |    1 +
 themes/dark.xml                                    |   78 +
 themes/default-alt.xml                             |   78 +
 themes/default.xml                                 |   78 +
 themes/eclipse.xml                                 |   78 +
 themes/idea.xml                                    |   78 +
 themes/vs.xml                                      |   78 +
 289 files changed, 156740 insertions(+)

diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..75d073c
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="i18n"/>
+	<classpathentry kind="src" path="test"/>
+	<classpathentry kind="src" path="themes"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/.project b/.project
new file mode 100644
index 0000000..e31ac69
--- /dev/null
+++ b/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>RSyntaxTextArea</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/build.xml b/build.xml
new file mode 100644
index 0000000..0d47079
--- /dev/null
+++ b/build.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!-- 
+
+	This is the Ant build script for rsyntaxtextarea.jar.
+	Available targets include:
+	
+		1. compile:         Compiles all org.fife classes into ${class-dir}.
+		2. make-jar:        Creates the jar file.
+		3. make-source-zip: Creates a source zip file.
+		3. make-javadoc:    Creates the javadoc for RSyntaxTextArea.
+
+	Author:   Robert Futrell
+	Version:  1.4
+	Date:     20feb2009
+
+-->
+
+
+<project name="RSyntaxTextArea" default="make-jar" basedir=".">
+
+	<description>RSyntaxTextArea build file</description>
+
+
+	<!-- Set global properties for this build. -->
+	<property name="version"          value="2.0.7"/>
+	<property name="source-dir"       location="src"/>
+	<property name="class-dir"        location="ant-classes"/>
+	<property name="dist-dir"         location="dist"/>
+	<property name="doc-dir"          location="javadoc"/>
+	<property name="debug"            value="true"/>
+	<property name="debuglevel"       value="lines,vars,source"/>
+	<property name="java-level"       value="1.4"/>
+
+
+	<!-- Compiles the classes.  -->
+	<target name="compile" description="Compile the source">
+		<delete includeEmptyDirs="true" quiet="true" dir="${class-dir}"/>
+		<mkdir dir="${class-dir}"/>
+		<echo>NOTE: *** RSyntaxTextArea is built with a 1.4.2 JDK!</echo>
+		<echo>NOTE: *** If you build with Java 5 or newer, you will receive a compile error</echo>
+		<echo>NOTE: *** about an XmlParser.java method missing IOException in its throws</echo>
+		<echo>NOTE: *** clause.  This is caused by a binary incompatibility between Java</echo>
+		<echo>NOTE: *** 1.4 and Java 5.  To remedy this, either build with 1.4.2, or add</echo>
+		<echo>NOTE: *** IOException to the throws clause.</echo>
+		<javac srcdir="${source-dir}" destdir="${class-dir}"
+			deprecation="yes" debug="${debug}" debuglevel="${debuglevel}"
+			source="${java-level}" target="${java-level}" includeantruntime="false"/>
+	</target>
+
+
+	<!-- Creates the jar file. -->
+	<target name="make-jar" depends="compile"
+			description="Create RSyntaxTextArea jar">
+		<delete includeEmptyDirs="true" quiet="true" dir="${dist-dir}"/>
+		<mkdir dir="${dist-dir}"/>
+		<jar destfile="${dist-dir}/rsyntaxtextarea.jar">
+			<fileset dir="${class-dir}"/>
+			<fileset dir="i18n"/>
+			<fileset dir="${source-dir}">
+				<include name="theme.dtd"/>
+			</fileset>
+			<manifest>
+				<attribute name="Specification-Title" value="RSyntaxTextArea"/>
+				<attribute name="Specification-Version" value="${version}"/>
+				<attribute name="Implementation-Title" value="org.fife.ui"/>
+				<attribute name="Implementation-Version" value="${version}"/>
+				<section name="RTextArea">
+					<attribute name="Specification-Title" value="RTextArea"/>
+					<attribute name="Specification-Version" value="${version}"/>
+					<attribute name="Implementation-Title" value="org.fife.ui.rtextarea"/>
+					<attribute name="Implementation-Version" value="${version}"/>
+				</section>
+				<section name="RSyntaxTextArea">
+					<attribute name="Specification-Title" value="RSyntaxTextArea-Core"/>
+					<attribute name="Specification-Version" value="${version}"/>
+					<attribute name="Implementation-Title" value="org.fife.ui.rsyntaxtextarea"/>
+					<attribute name="Implementation-Version" value="${version}"/>
+				</section>
+			</manifest>
+		</jar>
+		<copy todir="${dist-dir}">
+			<fileset dir="distfiles"/>
+		</copy>
+	</target>
+
+
+	<!-- Builds the source zip file. -->
+	<target name="make-source-zip" description="Builds the source zip file">
+		<zip destfile="./rsyntaxtextarea_${version}_Source.zip">
+			<fileset dir=".">
+				<include name="distfiles/**"/>
+				<include name="src/**"/>
+				<include name="i18n/**"/>
+				<include name="test/**"/>
+				<include name="themes/**"/>
+				<include name="build.xml"/>
+				<include name=".project"/>
+				<include name=".classpath"/>
+			</fileset>
+		</zip>
+	</target>
+
+
+	<!-- Builds the javadoc.  -->
+	<target name="make-javadoc" depends="compile">
+		<javadoc  destdir="${doc-dir}" author="true" version="true"
+			 	breakiterator="yes">
+			<packageset dir="${source-dir}" defaultexcludes="yes">
+				<include name="org/**"/>
+			</packageset>
+		</javadoc>
+	</target>
+
+
+</project>
diff --git a/distfiles/RSyntaxTextArea.License.txt b/distfiles/RSyntaxTextArea.License.txt
new file mode 100644
index 0000000..260c1c8
--- /dev/null
+++ b/distfiles/RSyntaxTextArea.License.txt
@@ -0,0 +1,24 @@
+Copyright (c) 2012, Robert Futrell
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of the author nor the names of its contributors may
+      be used to endorse or promote products derived from this software
+      without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/distfiles/readme.txt b/distfiles/readme.txt
new file mode 100644
index 0000000..7a76b3c
--- /dev/null
+++ b/distfiles/readme.txt
@@ -0,0 +1,80 @@
+RSyntaxTextArea Readme
+----------------------
+Please contact me if you are using RSyntaxTextArea in your project!  I like
+to know when people are finding it useful.  Please send mail to:
+robert -at- fifesoft dot com.
+
+
+* About RSyntaxTextArea
+
+  RSyntaxTextArea is a syntax highlighting text component, written in Swing.
+  It allows applications to easily embed syntax highlighting for most common
+  programming languages.  Most other standard programmer's editor features are
+  built-in: auto-indent, bracket matching, undo/redo, etc.  Auto-completion
+  is available as an add-on library (see http://fifesoft.com/autocomplete).
+
+* License
+
+  RSyntaxTextArea is licensed under a modified BSD license.  Please see the
+  included RSyntaxTextArea.License.txt file.
+
+* Compiling
+
+  If you wish to compile RSyntaxTextArea from source, the easiest way to do so
+  is via the included Ant build script.  The default target builds the jar.
+  
+    cd RSyntaxTextArea
+    ant
+  
+  Note that RSyntaxTextArea should be built with a 1.4 JDK, to ensure strict
+  compatibility when running in a 1.4 JVM.  If you choose to compile with
+  Java 5 or later, you will run into the following compiler error:
+  
+      [javac] ...\XmlParser.java:216: unreported exception java.io.IOException;
+              must be caught or declared to be thrown
+      [javac] 			return super.resolveEntity(publicId, systemId);
+  
+  This occurs because Java 5 changed the signature of the resolveEntity()
+  method to also throw IOExceptions.  Simply adding IOException to the throws
+  clause of the method in XmlParser.java will clear up the problem.
+  
+  In a future release, RSyntaxTextArea may drop support for Java 1.4, at which
+  time the XmlParser class will of course be modified to compile cleanly with
+  Java 5 compilers.
+  
+* Feedback
+
+  I hope you find RSyntaxTextArea useful.  Bug reports, feature requests, and
+  just general questions are always welcome.  Ways you can submit feedback:
+  
+    * http://forum.fifesoft.com (preferred)
+         Has a forum for RSyntaxTextArea and related projects, where you can
+         ask questions and get feedback quickly.
+
+    * http://sourceforge.net/projects/rsyntaxtextarea
+         Has a tracker for bug reports, feature requests, etc.
+
+    * http://fifesoft.com/rsyntaxtextarea
+         Project home page, which contains general information and example
+         source code.
+
+* Thanks
+
+  Translations:
+     
+     * Arabic:                 Mawaheb, Linostar
+     * Chinese:                Terrance, peter_barnes, Sunquan, sonyichi, zvest
+     * Chinese (Traditional):  kin Por Fok, liou xiao
+     * Dutch:                  Roel, Sebastiaan, lovepuppy
+     * French:                 Pat, PivWan
+     * German:                 Domenic, bikerpete
+     * Hungarian:              Zityi, flatron
+     * Indonesian:             azis, Sonny
+     * Italian:                Luca, stepagweb
+     * Japanese:               Josh, izumi, tomoM
+     * Korean:                 Changkyoon sbrownii
+     * Polish:                 Chris, Maciej Mrug
+     * Portuguese (Brazil):    Pat, Marcos Parmeggiani, Leandro
+     * Russian:                Nadiya, Vladimir
+     * Spanish:                Leonardo, phrodo, daloporhecho
+     * Turkish:                Cahit, Burak
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip.properties
new file mode 100644
index 0000000..bac1c28
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip.properties
@@ -0,0 +1,3 @@
+Line=Line: {0}
+MultipleMarkers=Multiple markers at this line:
+OccurrenceOf=Occurrence of "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ar.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ar.properties
new file mode 100644
index 0000000..dc270ad
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ar.properties
@@ -0,0 +1,3 @@
+Line=Line: {0}
+MultipleMarkers=\u0647\u0646\u0627\u0643 \u0639\u062f\u0629 \u062a\u062d\u062f\u064a\u062f\u0627\u062a \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u0633\u0637\u0631:
+OccurrenceOf=\u0639\u062f\u062f \u0645\u0631\u0627\u062a \u062d\u062f\u0648\u062b"{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_de.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_de.properties
new file mode 100644
index 0000000..8b1d447
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_de.properties
@@ -0,0 +1,3 @@
+Line=Zeile: {0}
+MultipleMarkers=Mehrfache Markierungen in dieser Zeile:
+OccurrenceOf=Auftreten von "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_es.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_es.properties
new file mode 100644
index 0000000..bdf08b6
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_es.properties
@@ -0,0 +1,3 @@
+Line=Linea: {0}
+MultipleMarkers=M\u00faltiples marcadores en esta linea:
+OccurrenceOf=Ocurrencia de "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_fr.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_fr.properties
new file mode 100644
index 0000000..27e90a6
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_fr.properties
@@ -0,0 +1,3 @@
+Line=Ligne: {0}
+MultipleMarkers=Plusieurs rep\u00e8res sur cette ligne:
+OccurrenceOf=Pr\u00e9sence de "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_hu.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_hu.properties
new file mode 100644
index 0000000..b787770
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_hu.properties
@@ -0,0 +1,3 @@
+Line=Sor: {0}
+MultipleMarkers=T\u00f6bb jel\u00f6l\u0151 ebben a sorban:
+OccurrenceOf=A(z) "{0}" el\u0151fordul\u00e1sa
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_in.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_in.properties
new file mode 100644
index 0000000..bac1c28
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_in.properties
@@ -0,0 +1,3 @@
+Line=Line: {0}
+MultipleMarkers=Multiple markers at this line:
+OccurrenceOf=Occurrence of "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_it.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_it.properties
new file mode 100644
index 0000000..8951e0e
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_it.properties
@@ -0,0 +1,3 @@
+Line=Linea: {0}
+MultipleMarkers=Multipli punti a questa linea:
+OccurrenceOf=Occorrenze di "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ja.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ja.properties
new file mode 100644
index 0000000..4fe16db
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ja.properties
@@ -0,0 +1,3 @@
+Line=\u884c: {0}
+MultipleMarkers=\u3053\u306e\u884c\u306e\u4e2d\u306b\u3044\u304f\u3064\u306e\u30de\u30fc\u30ab\u30fc\u306f\u3042\u308a\u307e\u3059:
+OccurrenceOf=\u51fa\u73fe\u56de\u6570 "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ko.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ko.properties
new file mode 100644
index 0000000..eef6808
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ko.properties
@@ -0,0 +1,3 @@
+Line=\ud589: {0}
+MultipleMarkers=\uc774 \ud589\uc5d0 \ubcf5\uc218\uc758 \ub9c8\ucee4 \uc874\uc7ac:
+OccurrenceOf="{0}" \ubc1c\uc0dd
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_nl.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_nl.properties
new file mode 100644
index 0000000..bac1c28
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_nl.properties
@@ -0,0 +1,3 @@
+Line=Line: {0}
+MultipleMarkers=Multiple markers at this line:
+OccurrenceOf=Occurrence of "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_pl.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_pl.properties
new file mode 100644
index 0000000..a281a0b
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_pl.properties
@@ -0,0 +1,3 @@
+Line=Linia: {0}
+MultipleMarkers=Wiele znacznik w tej linii:
+OccurrenceOf=Wyst\u0119powanie "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_pt_BR.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_pt_BR.properties
new file mode 100644
index 0000000..0e23c96
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_pt_BR.properties
@@ -0,0 +1,3 @@
+Line=Linha: {0}
+MultipleMarkers=M\u00faltiplos marcadores nesta linha:
+OccurrenceOf=Ocorr\u00eancia de: "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ru.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ru.properties
new file mode 100644
index 0000000..87257da
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ru.properties
@@ -0,0 +1,3 @@
+Line=\u0421\u0442\u0440\u043e\u043a\u0430: {0}
+MultipleMarkers=\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435:
+OccurrenceOf=\u0412\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_tr.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_tr.properties
new file mode 100644
index 0000000..d096eba
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_tr.properties
@@ -0,0 +1,3 @@
+Line=Sat\u0131r: {0}
+MultipleMarkers=Bu sat\u0131rda birden fazla i\u015faret\u00e7i:
+OccurrenceOf="{0}"\u0131n bulunmas\u0131
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_zh_CN.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_zh_CN.properties
new file mode 100644
index 0000000..70ac061
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_zh_CN.properties
@@ -0,0 +1,3 @@
+Line=\u884c: {0}
+MultipleMarkers=\u6b64\u884c\u6709\u591a\u6807\u8bb0
+OccurrenceOf=\u6709"{0}"\u51fa\u73b0
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_zh_TW.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_zh_TW.properties
new file mode 100644
index 0000000..bac1c28
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_zh_TW.properties
@@ -0,0 +1,3 @@
+Line=Line: {0}
+MultipleMarkers=Multiple markers at this line:
+OccurrenceOf=Occurrence of "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.properties
new file mode 100644
index 0000000..8cb34e6
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Folding
+
+Action.ToggleCurrentFold.Name=Toggle Current Fold
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Toggles the fold at the caret position.
+Action.CollapseAllFolds.Name=Collapse All Folds
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Collapses all folds.
+Action.CollapseCommentFolds.Name=Collapse All Comments
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Collapses all comment folds.
+Action.ExpandAllFolds.Name=Expand All Folds
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Expands all folds.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ar.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ar.properties
new file mode 100644
index 0000000..fe97708
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ar.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=\u0637\u0648\u064a
+
+Action.ToggleCurrentFold.Name=\u063a\u064a\u0651\u0631 \u0648\u0636\u0639\u064a\u0629 \u0627\u0644\u0637\u0648\u064a\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=\u0645\u0646 \u0623\u062c\u0644 \u062a\u063a\u064a\u064a\u0631 \u0648\u0636\u0639\u064a\u0629 \u0627\u0644\u0637\u0648\u064a\u0629 \u0641\u064a \u0645\u0648\u0642\u0639 \u0627\u0644\u0645\u0624\u0634\u0631 \u0627\u0644\u062d\u0627\u0644\u064a
+Action.CollapseAllFolds.Name=\u0642\u0644\u0635 \u062c\u0645\u064a\u0639 \u0627\u0644\u0637\u064a\u0627\u062a
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=\u0645\u0646 \u0623\u062c\u0644 \u062a\u0642\u0644\u064a\u0635 \u062c\u0645\u064a\u0639 \u0627\u0644\u0637\u064a\u0627\u062a
+Action.CollapseCommentFolds.Name=\u0642\u0644\u0635 \u062c\u0645\u064a\u0639 \u0627\u0644\u062a\u0639\u0644\u064a\u0642\u0627\u062a
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=\u0645\u0646 \u0623\u062c\u0644 \u062a\u0642\u0644\u064a\u0635 \u062c\u0645\u064a\u0639 \u0637\u064a\u0627\u062a \u0627\u0644\u062a\u0639\u0644\u064a\u0642\u0627\u062a
+Action.ExpandAllFolds.Name=\u0648\u0633\u0639 \u062c\u0645\u064a\u0639 \u0627\u0644\u0637\u064a\u0627\u062a
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=\u0645\u0646 \u0623\u062c\u0644 \u062a\u0648\u0633\u064a\u0639 \u062c\u0645\u064a\u0639 \u0627\u0644\u0637\u064a\u0627\u062a.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_de.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_de.properties
new file mode 100644
index 0000000..fb0a440
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_de.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Klappung
+
+Action.ToggleCurrentFold.Name=Aktuellen Block umschalten
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Schaltet den Block an der Position der Schreibmarke um.
+Action.CollapseAllFolds.Name=Action.CollapseAllFolds.Name=Alle Bl\u00f6cke zuklappen
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Klappt alle Bl\u00f6cke zu.
+Action.CollapseCommentFolds.Name=Alle Kommentarbl\u00f6cke zuklappen
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Klappt alle Kommentarbl\u00f6cke zu.
+Action.ExpandAllFolds.Name=Alle Bl\u00f6cke aufklappen
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Klappt alle Bl\u00f6cke auf.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_es.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_es.properties
new file mode 100644
index 0000000..693396d
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_es.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Folding
+
+Action.ToggleCurrentFold.Name=Ver Fold (solapa) actual
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Mostrar el fold en la posici\u00f3n del cursor
+Action.CollapseAllFolds.Name=Ocultar todos los folds
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Oculta todos los folds
+Action.CollapseCommentFolds.Name=Ocultar todos los comentarios
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Oculta todos los comentarios
+Action.ExpandAllFolds.Name=Expandir todos las solapas (folds)
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Expande todas las solapas (folds)
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_fr.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_fr.properties
new file mode 100644
index 0000000..a662148
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_fr.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Pliage
+
+Action.ToggleCurrentFold.Name=Active ou d\u00e9sactive le pli actuel
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Active ou d\u00e9sactive le pli \u00e0 la position du curseur.
+Action.CollapseAllFolds.Name=Comprimer tous les plis
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Comprime tous les plis.
+Action.CollapseCommentFolds.Name=Comprimer tous les commentaires
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Comprime tous les plis commentaires.
+Action.ExpandAllFolds.Name=D\u00e9comrpimer tous les plis
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=D\u00e9comrpime tous les plis.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_hu.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_hu.properties
new file mode 100644
index 0000000..e867551
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_hu.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=\u00d6sszevon\u00e1s
+
+Action.ToggleCurrentFold.Name=A jelenlegi \u00f6sszevon\u00e1s megjelen\u00edt\u00e9se/rejt\u00e9se.
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Megjelen\u00edti, illetve elt\u00fcnteti az \u00f6sszevon\u00e1st a kurzor poz\u00edci\u00f3j\u00e1ban.
+Action.CollapseAllFolds.Name=\u00d6sszevon\u00e1sok rejt\u00e9se.
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=\u00d6sszevon\u00e1sok rejt\u00e9se.
+Action.CollapseCommentFolds.Name=Az \u00f6sszes megjegyz\u00e9s elrejt\u00e9se
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Megjegyz\u00e9s \u00f6sszevon\u00e1sok rejt\u00e9se.
+Action.ExpandAllFolds.Name=\u00d6sszevon\u00e1sok kiterjeszt\u00e9se
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=\u00d6sszevon\u00e1sok kiterjeszt\u00e9se.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_in.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_in.properties
new file mode 100644
index 0000000..8cb34e6
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_in.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Folding
+
+Action.ToggleCurrentFold.Name=Toggle Current Fold
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Toggles the fold at the caret position.
+Action.CollapseAllFolds.Name=Collapse All Folds
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Collapses all folds.
+Action.CollapseCommentFolds.Name=Collapse All Comments
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Collapses all comment folds.
+Action.ExpandAllFolds.Name=Expand All Folds
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Expands all folds.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_it.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_it.properties
new file mode 100644
index 0000000..c1befc1
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_it.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Folding
+
+Action.ToggleCurrentFold.Name=Imposta il fold corrente
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Imposta il fold alla posizione corrente.
+Action.CollapseAllFolds.Name=Raggruppa tutti i fold
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Raggruppa tutti i fold.
+Action.CollapseCommentFolds.Name=Raggruppa tutti i commenti
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Raggruppa tutti i commenti.
+Action.ExpandAllFolds.Name=Espandi tutti i fold
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Espandi tutti i fold.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ja.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ja.properties
new file mode 100644
index 0000000..a39353b
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ja.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=\u30d5\u30a9\u30eb\u30c7\u30a3\u30f3\u30b0
+
+Action.ToggleCurrentFold.Name=\u30ad\u30e3\u30ec\u30c3\u30c8\u5074\u306e\u30d5\u30a9\u30eb\u30c9\u3092\u30c8\u30b0\u30eb\u3059\u308b\u3002
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=\u30ad\u30e3\u30ec\u30c3\u30c8\u5074\u306e\u30d5\u30a9\u30eb\u30c9\u3092\u30c8\u30b0\u30eb\u3059\u308b\u3002
+Action.CollapseAllFolds.Name=\u5168\u3066\u306e\u30d5\u30a9\u30eb\u30c9\u3092\u6298\u308a\u305f\u305f\u3080
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=\u5168\u3066\u306e\u3075\u3049\u308b\u3069\u3092\u6298\u308a\u305f\u305f\u3080
+Action.CollapseCommentFolds.Name=\u5168\u3066\u306e\u30b3\u30e1\u30f3\u30c8\u306e\u30d5\u30a9\u30eb\u30c9\u3092\u6298\u308a\u305f\u305f\u3080
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=\u5168\u3066\u306e\u30b3\u30e1\u30f3\u30c8\u306e\u30d5\u30a9\u30eb\u30c9\u3092\u6298\u308a\u305f\u305f\u3080
+Action.ExpandAllFolds.Name=\u5168\u3066\u306e\u30d5\u30a9\u30eb\u30c9\u3092\u5c55\u958b\u3059\u308b
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=\u5168\u3066\u306e\u30d5\u30a9\u30eb\u30c9\u3092\u5c55\u958b\u3059\u308b
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ko.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ko.properties
new file mode 100644
index 0000000..402e419
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ko.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=\ucf54\ub4dc \uac10\ucd94\uae30
+
+Action.ToggleCurrentFold.Name=\ud604\uc7ac \ucf54\ub4dc \uac10\ucd94\uae30 \ud1a0\uae00
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=\uce90\ub7ff \uc704\uce58\uc5d0\uc11c \ucf54\ub4dc \uac10\ucd94\uae30\ub97c \ud1a0\uae00\ud569\ub2c8\ub2e4.
+Action.CollapseAllFolds.Name=\ubaa8\ub4e0 \ucf54\ub4dc \uac10\ucd94\uae30 \uc811\uae30
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=\ubaa8\ub4e0 \ucf54\ub4dc \uac10\ucd94\uae30\ub97c \uc811\uc2b5\ub2c8\ub2e4.
+Action.CollapseCommentFolds.Name=\ubaa8\ub4e0 \uc8fc\uc11d \uac10\ucd94\uae30 \uc811\uae30
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=\ubaa8\ub4e0 \uc8fc\uc11d \uac10\ucd94\uae30\ub97c \uc811\uc2b5\ub2c8\ub2e4.
+Action.ExpandAllFolds.Name=\ubaa8\ub4e0 \ucf54\ub4dc \uac10\ucd94\uae30 \ud3bc\uce58\uae30
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=\ubaa8\ub4e0 \ucf54\ub4dc \uac10\ucd94\uae30\ub97c \ud3bc\uce69\ub2c8\ub2e4.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_nl.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_nl.properties
new file mode 100644
index 0000000..8cb34e6
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_nl.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Folding
+
+Action.ToggleCurrentFold.Name=Toggle Current Fold
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Toggles the fold at the caret position.
+Action.CollapseAllFolds.Name=Collapse All Folds
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Collapses all folds.
+Action.CollapseCommentFolds.Name=Collapse All Comments
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Collapses all comment folds.
+Action.ExpandAllFolds.Name=Expand All Folds
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Expands all folds.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_pl.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_pl.properties
new file mode 100644
index 0000000..f775510
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_pl.properties
@@ -0,0 +1,15 @@
+ContextMenu.Folding=Zwijanie
+
+Action.ToggleCurrentFold.Name=Reguluj zwini\u0119cie
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Ustawia zwini\u0119cie na pozycji karetki.
+Action.CollapseAllFolds.Name=Zwi\u0144 wszystkie zwini\u0119cia
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Zwija wszystkie zwini\u0119cia.
+Action.CollapseCommentFolds.Name=Zwi\u0144 wszystkie komentarze
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Zwija wszystkie zwini\u0119cia z komentarzami.
+Action.ExpandAllFolds.Name=Rozwi\u0144 zwini\u0119cia
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Rozwija wszystkie zwini\u0119cia.
+
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_pt_BR.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_pt_BR.properties
new file mode 100644
index 0000000..2fa67a7
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_pt_BR.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Dobramento de c\u00f3digo
+
+Action.ToggleCurrentFold.Name=Alternar o dobramento atual
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Alterna o dobramento na posi\u00e7\u00e3o do cursor.
+Action.CollapseAllFolds.Name=Recolher o dobramento de c\u00f3digo
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Recolher o dobramento de c\u00f3digo.
+Action.CollapseCommentFolds.Name=Recolher o dobramento de coment\u00e1rios
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Recolher o dobramento de coment\u00e1rios.
+Action.ExpandAllFolds.Name=Expandir o dobramento de c\u00f3digo
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Expandir o dobramento de c\u00f3digo.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ru.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ru.properties
new file mode 100644
index 0000000..3cf3e36
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ru.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=\u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435
+
+Action.ToggleCurrentFold.Name=\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0431\u043b\u043e\u043a
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043a\u0443\u0440\u0441\u043e\u0440\u0430
+Action.CollapseAllFolds.Name=\u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=\u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0431\u043b\u043e\u043a\u043e\u0432
+Action.CollapseCommentFolds.Name=\u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=\u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u0431\u043b\u043e\u043a\u0430
+Action.ExpandAllFolds.Name=\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0431\u043b\u043e\u043a\u043e\u0432
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_tr.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_tr.properties
new file mode 100644
index 0000000..6a17e12
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_tr.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Katlama
+
+Action.ToggleCurrentFold.Name=\u015eu Anki Kat\u0131 Geni\u015flet/Katla
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=\u0130\u015faret\u00e7inin bulundu\u011fu kat\u0131 geni\u015fletir/katlar.
+Action.CollapseAllFolds.Name=T\u00fcm Katlar\u0131 Katla
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=T\u00fcm katlar\u0131 katlar.
+Action.CollapseCommentFolds.Name=T\u00fcm Yorumlar\u0131 Katla
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=T\u00fcm yorumlar\u0131 katlar.
+Action.ExpandAllFolds.Name=T\u00fcm Katlar\u0131 Geni\u015flet
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=T\u00fcm katlar\u0131 geni\u015fletir.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_zh_CN.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_zh_CN.properties
new file mode 100644
index 0000000..72c9bd1
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_zh_CN.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=\u6298\u53e0
+
+Action.ToggleCurrentFold.Name=\u6298\u53e0/\u5f00\u542f\u672c\u533a\u6bb5
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=\u6298\u53e0/\u5f00\u542f\u63d2\u5165\u7b26\u6240\u5728\u4f4d\u7f6e.
+Action.CollapseAllFolds.Name=\u53d6\u6d88\u6240\u6709\u4ee3\u7801\u6298\u53e0
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=\u53d6\u6d88\u6240\u6709\u4ee3\u7801\u6298\u53e0.
+Action.CollapseCommentFolds.Name=\u53d6\u6d88\u6ce8\u91ca\u4ee3\u7801\u6298\u53e0
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=\u53d6\u6d88\u6ce8\u91ca\u4ee3\u7801\u6298\u53e0.
+Action.ExpandAllFolds.Name=\u6253\u5f00\u6240\u6709\u4ee3\u7801\u6298\u53e0
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=\u6253\u5f00\u6240\u6709\u4ee3\u7801\u6298\u53e0.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_zh_TW.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_zh_TW.properties
new file mode 100644
index 0000000..8cb34e6
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_zh_TW.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Folding
+
+Action.ToggleCurrentFold.Name=Toggle Current Fold
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Toggles the fold at the caret position.
+Action.CollapseAllFolds.Name=Collapse All Folds
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Collapses all folds.
+Action.CollapseCommentFolds.Name=Collapse All Comments
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Collapses all comment folds.
+Action.ExpandAllFolds.Name=Expand All Folds
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Expands all folds.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.properties
new file mode 100644
index 0000000..84a7e2c
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.properties
@@ -0,0 +1 @@
+FocusHotkey=Press 'F2' for focus
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ar.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ar.properties
new file mode 100644
index 0000000..c062d89
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ar.properties
@@ -0,0 +1 @@
+FocusHotkey=\u0627\u0636\u063a\u0637 'F2' \u0645\u0646 \u0627\u062c\u0644 \u0627\u0644\u062a\u0631\u0643\u064a\u0632
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_de.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_de.properties
new file mode 100644
index 0000000..720e386
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_de.properties
@@ -0,0 +1 @@
+FocusHotkey=Zum Fokussieren 'F2' dr\u00fccken
\ No newline at end of file
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_es.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_es.properties
new file mode 100644
index 0000000..5fea661
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_es.properties
@@ -0,0 +1 @@
+FocusHotkey=Presionar 'F2' para enfocar
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_fr.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_fr.properties
new file mode 100644
index 0000000..66814c6
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_fr.properties
@@ -0,0 +1 @@
+FocusHotkey=Press 'F2' pour se concentrer
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_hu.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_hu.properties
new file mode 100644
index 0000000..b1fba5e
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_hu.properties
@@ -0,0 +1 @@
+FocusHotkey=Nyomja meg az 'F2' billenty\u0171t a f\u00f3kuszba \u00e1ll\u00edt\u00e1shoz
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_in.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_in.properties
new file mode 100644
index 0000000..84a7e2c
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_in.properties
@@ -0,0 +1 @@
+FocusHotkey=Press 'F2' for focus
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_it.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_it.properties
new file mode 100644
index 0000000..efb9eb8
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_it.properties
@@ -0,0 +1 @@
+FocusHotkey=Premi 'F2' per il focus
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ja.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ja.properties
new file mode 100644
index 0000000..3996d7d
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ja.properties
@@ -0,0 +1 @@
+FocusHotkey=\u30d5\u30a9\u30fc\u30ab\u30b9\u3092\u53d6\u5f97\u3059\u308b\u306b\u306f\u300c\uff26\uff12\u300d\u3092\u62bc\u3057\u3066\u304f\u3060\u3055\u3044\u3002
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ko.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ko.properties
new file mode 100644
index 0000000..979d3e2
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ko.properties
@@ -0,0 +1 @@
+FocusHotkey=\ud3ec\ucee4\uc2a4\ub97c \uc8fc\ub824\uba74 'F2'\ub97c \ub204\ub974\uc138\uc694
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_nl.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_nl.properties
new file mode 100644
index 0000000..84a7e2c
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_nl.properties
@@ -0,0 +1 @@
+FocusHotkey=Press 'F2' for focus
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_pl.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_pl.properties
new file mode 100644
index 0000000..d688330
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_pl.properties
@@ -0,0 +1 @@
+FocusHotkey=Naci\u015bnij 'F2' aby wy\u015bwietli\u0107
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_pt_BR.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_pt_BR.properties
new file mode 100644
index 0000000..7fc5504
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_pt_BR.properties
@@ -0,0 +1 @@
+FocusHotkey=Aperte 'F2' para focar
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ru.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ru.properties
new file mode 100644
index 0000000..7e003a3
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ru.properties
@@ -0,0 +1 @@
+FocusHotkey=\u041d\u0430\u0436\u0430\u0442\u044c 'F2' \u0434\u043b\u044f \u0444\u043e\u043a\u0443\u0441\u0438\u0440\u043e\u0432\u043a\u0438
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_tr.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_tr.properties
new file mode 100644
index 0000000..fdee64f
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_tr.properties
@@ -0,0 +1 @@
+FocusHotkey=Odaklanmak i\u00e7in 'F2'e bas\u0131n\u0131z
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_CN.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_CN.properties
new file mode 100644
index 0000000..b19534b
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_CN.properties
@@ -0,0 +1 @@
+FocusHotkey=\u6309'F2' \u805a\u7126
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_TW.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_TW.properties
new file mode 100644
index 0000000..84a7e2c
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_TW.properties
@@ -0,0 +1 @@
+FocusHotkey=Press 'F2' for focus
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea.properties b/i18n/org/fife/ui/rtextarea/RTextArea.properties
new file mode 100644
index 0000000..ea20b6d
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Copy
+Action.Copy.Desc=Copies current selection to the clipboard.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Cut
+Action.Cut.Desc=Removes current selection and places it on the clipboard.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Delete
+Action.Delete.Desc=Removes current selection.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Paste
+Action.Paste.Desc=Places text on clipboard at current location in text file.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Select All
+Action.SelectAll.Desc=Selects all text in current text document.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Undo
+Action.CantUndo.Name=Can't Undo
+Action.Undo.Desc=Takes back the last action.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Redo
+Action.CantRedo.Name=Can't Redo
+Action.Redo.Desc=Re-applies the last action undone.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_ar.properties b/i18n/org/fife/ui/rtextarea/RTextArea_ar.properties
new file mode 100644
index 0000000..04d085c
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_ar.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=\u0646
+Action.Copy.Name=\u0646\u0633\u062e
+Action.Copy.Desc=\u0646\u0633\u062e \u0645\u062d\u062a\u0648\u0649 \u0627\u0644\u062a\u062d\u062f\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a \u0625\u0644\u0649 \u0627\u0644\u062d\u0627\u0641\u0638\u0629.
+
+Action.Cut.Mnemonic=\u0642
+Action.Cut.Name=\u0642\u0635
+Action.Cut.Desc=\u0645\u0633\u062d \u0645\u062d\u062a\u0648\u0649 \u0627\u0644\u062a\u062d\u062f\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a \u0648\u0646\u0642\u0644\u0647 \u0625\u0644\u0649 \u0627\u0644\u062d\u0627\u0641\u0638\u0629.
+
+Action.Delete.Mnemonic=\u062d
+Action.Delete.Name=\u062d\u0630\u0641
+Action.Delete.Desc=\u062d\u0630\u0641 \u0645\u062d\u062a\u0648\u0649 \u0627\u0644\u062a\u062d\u062f\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a.
+
+Action.Paste.Mnemonic=\u0644
+Action.Paste.Name=\u0644\u0635\u0642
+Action.Paste.Desc=\u0644\u0635\u0642 \u0627\u0644\u0646\u0635 \u0627\u0644\u0645\u0648\u062c\u0648\u062f \u0641\u064a \u0627\u0644\u062d\u0627\u0641\u0638\u0629 \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u0645\u0643\u0627\u0646.
+
+Action.SelectAll.Mnemonic=\u0643
+Action.SelectAll.Name=\u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0643\u0644
+Action.SelectAll.Desc=\u062a\u062d\u062f\u064a\u062f \u062c\u0645\u064a\u0639 \u0627\u0644\u0646\u0635 \u0641\u064a \u0627\u0644\u0645\u0633\u062a\u0646\u062f \u0627\u0644\u062d\u0627\u0644\u064a.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=\u0625\u0639\u0627\u062f\u0629 \u062a\u0646\u0641\u064a\u0630
+Action.CantUndo.Name=\u0644\u0627 \u064a\u0645\u0643\u0646 \u0627\u0644\u062a\u0631\u0627\u062c\u0639
+Action.Undo.Desc=\u0627\u0644\u062a\u0631\u0627\u062c\u0639 \u0639\u0646 \u0622\u062e\u0631 \u062e\u0637\u0648\u0629.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=\u062a\u0631\u0627\u062c\u0639
+Action.CantRedo.Name=\u0644\u0627 \u064a\u0645\u0643\u0646 \u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u062a\u0631\u0627\u062c\u0639
+Action.Redo.Desc=\u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u062a\u0631\u0627\u062c\u0639 \u0639\u0646 \u0622\u062e\u0631 \u062e\u0637\u0648\u0629.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_de.properties b/i18n/org/fife/ui/rtextarea/RTextArea_de.properties
new file mode 100644
index 0000000..57fbe2b
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_de.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Kopieren
+Action.Copy.Desc=Kopiert die aktuelle Auswahl in die Zwischenablage.
+
+Action.Cut.Mnemonic=U
+Action.Cut.Name=Ausschneiden
+Action.Cut.Desc=Ausschneiden in die Zwischenablage.
+
+Action.Delete.Mnemonic=L
+Action.Delete.Name=L\u00f6schen
+Action.Delete.Desc=Auswahl entfernen.
+
+Action.Paste.Mnemonic=I
+Action.Paste.Name=Einf\u00fcgen
+Action.Paste.Desc=Zwischenablage hier einf\u00fcgen.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Alle ausw\u00e4hlen
+Action.SelectAll.Desc=W\u00e4hlt den gesamten Text aus.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=R\u00fcckg\u00e4ngig
+Action.CantUndo.Name=R\u00fcckg\u00e4ngig nicht m\u00f6glich
+Action.Undo.Desc=Macht die letzte Aktion r\u00fcckg\u00e4ngig.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Wiederholen
+Action.CantRedo.Name=Wiederholung nicht m\u00f6glich
+Action.Redo.Desc=Wiederholt die letzte Aktion.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_es.properties b/i18n/org/fife/ui/rtextarea/RTextArea_es.properties
new file mode 100644
index 0000000..55aceee
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_es.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Copiar
+Action.Copy.Desc=Copia la selecci\u00f3n actual en el portapapeles.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Cortar
+Action.Cut.Desc=Elimina la selecci\u00f3n actual y la p\u00f3ne en el portapapeles.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Eliminar
+Action.Delete.Desc=Elimina la selecci\u00f3n actual.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Pegar
+Action.Paste.Desc=P\u00f3ne el texto del portapapeles en la posici\u00f3n actual del archivo de texto.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Seleccionar todo
+Action.SelectAll.Desc=Selecciona todo el texto en el documento de texto actual.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Deshacer
+Action.CantUndo.Name=No se puede deshacer
+Action.Undo.Desc=Deshace la \u00faltima acci\u00f3n.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Rehacer
+Action.CantRedo.Name=No se puede rehacer
+Action.Redo.Desc=Rehace la \u00faltima acci\u00f3n deshecha.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_fr.properties b/i18n/org/fife/ui/rtextarea/RTextArea_fr.properties
new file mode 100644
index 0000000..bb56691
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_fr.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Copier
+Action.Copy.Desc=Copie la s\u00e9lection dans le presse-papiers.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Couper
+Action.Cut.Desc=Coupe la s\u00e9lection et la place dans le presse-papiers.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Effacer
+Action.Delete.Desc=Efface la s\u00e9lection.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Coller
+Action.Paste.Desc=Insert le contenu du presse-papiers \u00e0 l'emplacement courant.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=S\u00e9lectionner tout
+Action.SelectAll.Desc=S\u00e9lectionne tout le texte du document courant.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Annuler
+Action.CantUndo.Name=Annuler
+Action.Undo.Desc=Annule la derni\u00e8re action.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Refaire
+Action.CantRedo.Name=R\u00e9tablir
+Action.Redo.Desc=R\u00e9p\u00e8te la derni\u00e8re action annul\u00e9e.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_hu.properties b/i18n/org/fife/ui/rtextarea/RTextArea_hu.properties
new file mode 100644
index 0000000..7f512b4
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_hu.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=M\u00e1sol\u00e1s
+Action.Copy.Desc=A jelenleg kiv\u00e1lasztott r\u00e9sz m\u00e1sol\u00e1sa a v\u00e1g\u00f3lapra
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Kiv\u00e1g\u00e1s
+Action.Cut.Desc=A jelenleg kijel\u00f6lt r\u00e9sz elt\u00e1vol\u00edt\u00e1sa \u00e9s v\u00e1g\u00f3lapra helyez\u00e9se.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=T\u00f6rl\u00e9s
+Action.Delete.Desc=A jelenleg kijel\u00f6lt r\u00e9sz elt\u00e1vol\u00edt\u00e1sa.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Beilleszt\u00e9s
+Action.Paste.Desc=A sz\u00f6veges f\u00e1jl jelenlegi hely\u00e9n l\u00e9v\u0151 sz\u00f6veg v\u00e1g\u00f3lapra helyez\u00e9se.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Az \u00f6sszes kijel\u00f6l\u00e9se
+Action.SelectAll.Desc=Az \u00f6sszes sz\u00f6veg kijel\u00f6l\u00e9se a jelenlegi dokumentumban.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Visszavon\u00e1s
+Action.CantUndo.Name=Nem vonhat\u00f3 vissza
+Action.Undo.Desc=Az utols\u00f3 m\u0171velet visszavon\u00e1sa
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Ism\u00e9telt v\u00e9grehajt\u00e1s
+Action.CantRedo.Name=Nem hajthat\u00f3 v\u00e9gre \u00fajra
+Action.Redo.Desc=Az utolj\u00e1ra visszavont m\u0171velet ism\u00e9telt alkalmaz\u00e1sa.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_in.properties b/i18n/org/fife/ui/rtextarea/RTextArea_in.properties
new file mode 100644
index 0000000..e818893
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_in.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Salin
+Action.Copy.Desc=Salin current selection ke clipboard.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Cut
+Action.Cut.Desc=Hapus current selection dan letakkan dalam clipboard.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Hapus
+Action.Delete.Desc=Hapus current selection.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Paste
+Action.Paste.Desc=Letakkan text pada clipboard di lokasi saat ini dalam text file.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Pilih Semua
+Action.SelectAll.Desc=Pilih semua text dalam dokumen text saat ini.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Undo
+Action.CantUndo.Name=Tidak Dapat Undo
+Action.Undo.Desc=Kembali ke aksi terakhir.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Redo
+Action.CantRedo.Name=Tidak dapat Redo
+Action.Redo.Desc=Ulangi aksi terakhir yang di-undone.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_it.properties b/i18n/org/fife/ui/rtextarea/RTextArea_it.properties
new file mode 100644
index 0000000..661952c
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_it.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Copia
+Action.Copy.Desc=Copia la selezione corrente negli appunti.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Taglia
+Action.Cut.Desc=Rimuove la selezione corrente e la memorizza negli appunti.
+
+Action.Delete.Mnemonic=E
+Action.Delete.Name=Elimina
+Action.Delete.Desc=Rimuove la selezione corrente.
+
+Action.Paste.Mnemonic=I
+Action.Paste.Name=Incolla
+Action.Paste.Desc=Inserisce il testo presente negli appunti nella posizione corrente nel file di testo.
+
+Action.SelectAll.Mnemonic=E
+Action.SelectAll.Name=Seleziona tutto
+Action.SelectAll.Desc=Seleziona tutto il testo nel documento corrente.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Annulla
+Action.CantUndo.Name=Impossibile annullare
+Action.Undo.Desc=Annulla l'ultima azione.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Ripeti
+Action.CantRedo.Name=Impossibile ripristinare
+Action.Redo.Desc=Riapplica l'ultima azione annullata.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_ja.properties b/i18n/org/fife/ui/rtextarea/RTextArea_ja.properties
new file mode 100644
index 0000000..1d68418
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_ja.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=\u30b3\u30d4\u30fc
+Action.Copy.Desc=\u30ab\u30ec\u30f3\u30c8\u9078\u629e\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3059
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=\u30ab\u30c3\u30c8
+Action.Cut.Desc=\u30ab\u30ec\u30f3\u30c8\u9078\u629e\u3092\u524a\u9664\u3057\u3066\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u79fb\u3057\u307e\u3059
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=\u524a\u9664
+Action.Delete.Desc=\u30ab\u30ec\u30f3\u30c8\u9078\u629e\u3092\u524a\u9664\u3057\u307e\u3059
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=\u8cbc\u308a\u4ed8\u3051
+Action.Paste.Desc=\u30c6\u30ad\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u306e\u30ab\u30fc\u30bd\u30eb\u4f4d\u7f6e\u306b\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306e\u30c6\u30ad\u30b9\u30c8\u3092\u8cbc\u308a\u4ed8\u3051\u307e\u3059
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=\u3059\u3079\u3066\u9078\u629e
+Action.SelectAll.Desc=\u30ab\u30ec\u30f3\u30c8\u30c6\u30ad\u30b9\u30c8\u66f8\u985e\u306e\u30c6\u30ad\u30b9\u30c8\u3059\u3079\u3066\u3092\u9078\u629e\u3057\u307e\u3059
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=\u5143\u306b\u623b\u3059
+Action.CantUndo.Name=\u5143\u306b\u623b\u305b\u307e\u305b\u3093
+Action.Undo.Desc=\u524d\u56de\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u53d6\u308a\u6d88\u3057\u307e\u3059
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=\u3084\u308a\u76f4\u3057
+Action.CantRedo.Name=\u518d\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093
+Action.Redo.Desc=\u53d6\u308a\u6d88\u3055\u308c\u305f\u524d\u56de\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u518d\u9069\u7528\u3057\u307e\u3059
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_ko.properties b/i18n/org/fife/ui/rtextarea/RTextArea_ko.properties
new file mode 100644
index 0000000..c330552
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_ko.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=\ubcf5\uc0ac\ud558\uae30
+Action.Copy.Desc=\ud604\uc7ac \uc120\ud0dd\ub41c \ud14d\uc2a4\ud2b8\ub97c \ud074\ub9bd\ubcf4\ub4dc\ub85c \ubcf5\uc0ac\ud569\ub2c8\ub2e4.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=\uc798\ub77c\ub0b4\uae30
+Action.Cut.Desc=\ud604\uc7ac \uc120\ud0dd\ub41c \ud14d\uc2a4\ud2b8\ub97c \ud074\ub9bd\ubcf4\ub4dc\ub85c \ubcf5\uc0ac\ud558\uace0 \uc0ad\uc81c\ud569\ub2c8\ub2e4.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=\uc9c0\uc6b0\uae30
+Action.Delete.Desc=\ud604\uc7ac \uc120\ud0dd\ub41c \ud14d\uc2a4\ud2b8\ub97c \uc0ad\uc81c\ud569\ub2c8\ub2e4.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=\ubd99\uc5ec\ub123\uae30
+Action.Paste.Desc=\ud074\ub9bd\ubcf4\ub4dc\uc5d0 \uc788\ub294 \ud14d\uc2a4\ud2b8\ub97c \ud604\uc7ac\uc758 \uc704\uce58\uc5d0 \ubd99\uc785\ub2c8\ub2e4.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=\uc804\uccb4 \uc120\ud0dd
+Action.SelectAll.Desc=\ud604\uc7ac \ud14d\uc2a4\ud2b8 \ubb38\uc11c\uc758 \ubaa8\ub4e0 \ud14d\uc2a4\ud2b8\ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=\ub418\ub3cc\ub9ac\uae30
+Action.CantUndo.Name=\ub418\ub3cc\ub9b4 \uc218 \uc5c6\uc74c
+Action.Undo.Desc=\ub9c8\uc9c0\ub9c9 \ub3d9\uc791\uc744 \ucde8\uc18c\ud569\ub2c8\ub2e4.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=\ub2e4\uc2dc\ud558\uae30
+Action.CantRedo.Name=\ub2e4\uc2dc \ud560\uc218 \uc5c6\uc74c
+Action.Redo.Desc=\ub418\ub3cc\ub9b0 \ub3d9\uc791\uc744 \ub2e4\uc2dc \uc801\uc6a9\ud569\ub2c8\ub2e4.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_nl.properties b/i18n/org/fife/ui/rtextarea/RTextArea_nl.properties
new file mode 100644
index 0000000..f9a5b67
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_nl.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Kopi\u00ebren
+Action.Copy.Desc=Kopieert de huidige selectie naar het prikbord.
+
+Action.Cut.Mnemonic=X
+Action.Cut.Name=Knippen
+Action.Cut.Desc=Haalt de huidige selectie weg en plaatst het op het prikbord
+
+Action.Delete.Mnemonic=V
+Action.Delete.Name=Verwijderen
+Action.Delete.Desc=Verwijdert huidige selectie.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Plakken
+Action.Paste.Desc=Plaatst tekst van het prikbordop de huidige locatie in het tekst bestand.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Alles selecteren
+Action.SelectAll.Desc=Selecteerd alle tekst in het huidige document.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Undo
+Action.CantUndo.Name=Ongedaan maken niet mogelijk
+Action.Undo.Desc=Haalt de laatste actie terug.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Redo
+Action.CantRedo.Name=Opnieuw uitvoeren niet mogelijk
+Action.Redo.Desc=Herhaalt de laatste teruggehaalde actie.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_pl.properties b/i18n/org/fife/ui/rtextarea/RTextArea_pl.properties
new file mode 100644
index 0000000..03f2f1c
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_pl.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Kopiuj
+Action.Copy.Desc=Kopiuje zaznaczenie do schowka.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Wytnij
+Action.Cut.Desc=Wycina zaznaczenie i umieszcza je w schowku.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Usu\u0144
+Action.Delete.Desc=Usuwa zaznaczenie.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Wklej
+Action.Paste.Desc=Wkleja zawarto\u015b\u0107 schowka w aktualnej pozycji.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Zaznacz wszystko
+Action.SelectAll.Desc=Zaznacza ca\u0142y tekst w otwartym dokumencie.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Cofnij
+Action.CantUndo.Name=Nie mo\u017cna cofn\u0105\u0107
+Action.Undo.Desc=Cofa ostatni\u0105 akcj\u0119.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Przywr\u00f3\u0107
+Action.CantRedo.Name=Nie mo\u017cna przywr\u00f3ci\u0107
+Action.Redo.Desc=Przywraca stan sprzed cofni\u0119cia akcji.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_pt_BR.properties b/i18n/org/fife/ui/rtextarea/RTextArea_pt_BR.properties
new file mode 100644
index 0000000..be626db
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_pt_BR.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Copiar
+Action.Copy.Desc=Copia o texto selecionado para a \u00e1rea de transfer\u00eancia.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Recortar
+Action.Cut.Desc=Remove o texto selecionado e o coloca na \u00e1rea de transfer\u00eancia.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Excluir
+Action.Delete.Desc=Remove o texto selecionado.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Colar
+Action.Paste.Desc=Coloca o texto da \u00e1rea de transfer\u00eancia na posi\u00e7\u00e3o atual do arquivo.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Selecionar Tudo
+Action.SelectAll.Desc=Seleciona todo o texto no documento de texto atual.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Desfazer
+Action.CantUndo.Name=Imposs\u00edvel Desfazer
+Action.Undo.Desc=Desfaz a \u00faltima a\u00e7\u00e3o.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Refazer
+Action.CantRedo.Name=Imposs\u00edvel Refazer
+Action.Redo.Desc=Refaz a \u00faltima a\u00e7\u00e3o desfeita.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_ru.properties b/i18n/org/fife/ui/rtextarea/RTextArea_ru.properties
new file mode 100644
index 0000000..cb9cce7
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_ru.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=\u041a
+Action.Copy.Name=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+Action.Copy.Desc=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430.
+
+Action.Cut.Mnemonic=\u0412
+Action.Cut.Name=\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c
+Action.Cut.Desc=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430.
+
+Action.Delete.Mnemonic=\u0423
+Action.Delete.Name=\u0423\u0434\u0430\u043b\u0438\u0442\u044c
+Action.Delete.Desc=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430.
+
+Action.Paste.Mnemonic=\u0421
+Action.Paste.Name=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c
+Action.Paste.Desc=\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0444\u0430\u0439\u043b\u0435.
+
+Action.SelectAll.Mnemonic=\u042b
+Action.SelectAll.Name=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435
+Action.SelectAll.Desc=\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0444\u0430\u0439\u043b\u0435.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+Action.CantUndo.Name=\u041e\u0442\u043c\u0435\u043d\u0430 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430
+Action.Undo.Desc=\u041e\u0442\u043a\u0430\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c
+Action.CantRedo.Name=\u041f\u043e\u0432\u0442\u043e\u0440 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d
+Action.Redo.Desc=\u0412\u044b\u0437\u043e\u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_tr.properties b/i18n/org/fife/ui/rtextarea/RTextArea_tr.properties
new file mode 100644
index 0000000..4e35c2d
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_tr.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=K
+Action.Copy.Name=Kopyala
+Action.Copy.Desc=Secileni ClipBoarda Kopyalar.
+
+Action.Cut.Mnemonic=X
+Action.Cut.Name=Kes
+Action.Cut.Desc=Secileni Kaldirip ClipBoarda Yerlestirir.
+
+Action.Delete.Mnemonic=S
+Action.Delete.Name=Sil
+Action.Delete.Desc=Secileni Kaldir.
+
+Action.Paste.Mnemonic=Y
+Action.Paste.Name=Yapistir
+Action.Paste.Desc=Metni Metin Dosyasindaki Su Anki Yere Yapistir.
+
+Action.SelectAll.Mnemonic=T
+Action.SelectAll.Name=Tumunu Sec
+Action.SelectAll.Desc=Metin Belgesindeki Butun Metini Secer.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Geri Al
+Action.CantUndo.Name=Geri Alinamaz
+Action.Undo.Desc=Son Eylemi Geri Alir.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Tekrar Yap
+Action.CantRedo.Name=Yeniden Yapilamaz
+Action.Redo.Desc=Geri Alinan Eylemi Yeniden Uygular.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_zh_CN.properties b/i18n/org/fife/ui/rtextarea/RTextArea_zh_CN.properties
new file mode 100644
index 0000000..31a1247
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_zh_CN.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=\u590d\u5236
+Action.Copy.Desc=\u5c06\u5f53\u524d\u9009\u62e9\u590d\u5236\u5230\u526a\u8d34\u677f.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=\u526a\u5207
+Action.Cut.Desc=\u5c06\u5f53\u524d\u9009\u62e9\u590d\u5236\u5230\u526a\u8d34\u677f\u5e76\u4ece\u6587\u672c\u533a\u57df\u5220\u9664.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=\u5220\u9664
+Action.Delete.Desc=\u5220\u9664\u5f53\u524d\u9009\u62e9\u533a\u57df.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=\u7c98\u8d34
+Action.Paste.Desc=\u5c06\u5f53\u524d\u526a\u8d34\u677f\u5185\u5bb9\u590d\u5236\u5230\u6587\u672c\u533a\u57df.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=\u5168\u9009
+Action.SelectAll.Desc=\u9009\u62e9\u5f53\u524d\u6587\u6863\u4e2d\u5168\u90e8\u5185\u5bb9.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=\u590d\u539f
+Action.CantUndo.Name=\u65e0\u6cd5\u64a4\u9500
+Action.Undo.Desc=\u64a4\u9500\u4e0a\u6b21\u64cd\u4f5c.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=\u91cd\u65b0\u64cd\u4f5c
+Action.CantRedo.Name=\u65e0\u6cd5\u91cd\u590d
+Action.Redo.Desc=\u6267\u884c\u4e0b\u4e2a\u64cd\u4f5c.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_zh_TW.properties b/i18n/org/fife/ui/rtextarea/RTextArea_zh_TW.properties
new file mode 100644
index 0000000..e690b17
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_zh_TW.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=\u8907\u88fd
+Action.Copy.Desc=\u62f7\u8c9d\u73fe\u9078\u9805\u5165\u526a\u8cbc\u677f.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=\u526a\u5207
+Action.Cut.Desc=\u522a\u9664\u9078\u64c7\u4e26\u653e\u5165\u526a\u8cbc\u677f.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=\u522a\u9664
+Action.Delete.Desc=\u522a\u9664\u7576\u524d\u9078\u9805.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=\u7c98\u8cbc
+Action.Paste.Desc=\u5c07\u526a\u8cbc\u677f\u4e2d\u7684\u6587\u672c\u653e\u5165\u7576\u524d\u4f4d\u7f6e.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=\u5168\u9078
+Action.SelectAll.Desc=\u5168\u9078\u73fe\u6a94\u6848\u6240\u6709\u6587\u5b57.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Undo
+Action.CantUndo.Name=\u7121\u6cd5\u64a4\u92b7
+Action.Undo.Desc=\u53d6\u6d88\u6700\u5f8c\u4e00\u6b21\u884c\u52d5.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Redo
+Action.CantRedo.Name=\u7121\u6cd5\u91cd\u505a
+Action.Redo.Desc=\u91cd\u8907\u6700\u5f8c\u53d6\u6d88\u7684\u884c\u52d5.
diff --git a/src/org/fife/io/DocumentReader.java b/src/org/fife/io/DocumentReader.java
new file mode 100644
index 0000000..a096c96
--- /dev/null
+++ b/src/org/fife/io/DocumentReader.java
@@ -0,0 +1,209 @@
+/*
+ * 02/24/2004
+ *
+ * DocumentReader.java - A reader for javax.swing.text.Document
+ * objects.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.io;
+
+import java.io.Reader;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Segment;
+
+
+/**
+ * A <code>Reader</code> for <code>javax.swing.text.Document</code> objects.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class DocumentReader extends Reader {
+
+	/**
+	 * The stream's position in the document.
+	 */
+	private long position;
+	
+	/**
+	 * A remembered position in the document.
+	 */
+	private long mark;
+	
+	/**
+	 * The document we're working on.
+	 */
+	private Document document;
+	
+	/**
+	 * Used for fast character access.
+	 */
+	private Segment segment;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param document The document we're 'reading'.
+	 */
+	public DocumentReader(Document document) {
+		position = 0;
+		mark = -1;
+		this.document = document;
+		this.segment = new Segment();
+	}
+
+
+	/**
+	 * This currently does nothing...
+	 */
+	public void close() {
+	}
+
+
+	/**
+	 * Marks the present position in the stream.  Subsequent calls to
+	 * <code>reset()</code> will reposition the stream to this point.
+	 *
+	 * @param readAheadLimit Ignored.
+	 */
+	public void mark(int readAheadLimit) {
+		mark = position;
+	}
+
+
+	/**
+	 * Tells whether this reader supports the <code>mark</code> operation.
+	 * This always returns <code>true</code> for <code>DocumentReader</code>.
+	 */
+	public boolean markSupported() {
+		return true;
+	}
+
+
+	/**
+	 * Reads the single character at the current position in the document.
+	 */
+	public int read() {
+		if(position>=document.getLength()) {
+			return -1;      // Read past end of document.
+		}
+		try {
+			document.getText((int)position,1, segment);
+			position++;
+			return segment.array[segment.offset];
+		} catch (BadLocationException ble) {
+			/* Should never happen?? */
+			ble.printStackTrace();
+			return -1;
+		}
+	}
+
+
+	/**
+	 * Read <code>array.length</code> characters from the beginning
+	 * of the document into <code>array</code>.
+	 *
+	 * @param array The array to read characters into.
+	 * @return The number of characters read.
+	 */
+	public int read(char array[]) {
+		return read(array, 0, array.length);
+	}
+
+
+	/**
+	 * Reads characters into a portion of an array.
+	 *
+	 * @param cbuf The destination buffer.
+	 * @param off Offset at which to start storing characters.
+	 * @param len Maximum number of characters to read.
+	 * @return The number of characters read, or <code>-1</code> if the
+	 *         end of the stream (document) has been reached.
+	 */
+	public int read(char cbuf[], int off, int len) {
+		int k;
+		if(position>=document.getLength()) {
+			return -1;      // Read past end of document.
+		}
+		k = len;
+		if((position+k)>=document.getLength())
+			k = document.getLength() - (int)position;
+		if(off + k >= cbuf.length)
+			k = cbuf.length - off;
+		try {
+			document.getText((int)position, k, segment);
+			position += k;
+			System.arraycopy(segment.array,segment.offset,
+							cbuf,off,
+							k);
+			return k;
+		} catch (BadLocationException ble) {
+			/* Should never happen ? */
+			return -1;
+		}
+	}
+
+
+	/**
+	 * Tells whether this reader is ready to be read without
+	 * blocking for input.  <code>DocumentReader</code> will
+	 * always return true.
+	 *
+	 * @return <code>true</code> if the next read operation will
+	 *         return without blocking.
+	 */
+	public boolean ready() {
+		return true;
+	}
+
+
+	/**
+	 * Resets the stream.  If the stream has been marked, then attempt to
+	 * reposition it at the mark.  If the stream has not been marked, then
+	 * move it to the beginning of the document.
+	 */
+	public void reset() {
+		if(mark==-1) {
+			position = 0;
+		}
+		else {
+			position = mark;
+			mark = -1;
+		}
+	}
+
+
+	/**
+	 * Skips characters.  This will not 'skip' past the end of the document.
+	 *
+	 * @param n The number of characters to skip.
+	 * @return The number of characters actually skipped.
+	 */
+	public long skip(long n) {
+		if (position+n<=document.getLength()) {
+			position += n;
+			return n;
+		}
+		long temp = position;
+		position = document.getLength();
+		return document.getLength() - temp;
+	}
+
+
+	/**
+	 * Move to the specified position in the document.  If <code>pos</code>
+	 * is greater than the document's length, the stream's position is moved
+	 * to the end of the document.
+	 *
+	 * @param pos The position in the document to move to.
+	 */
+	public void seek(long pos) {
+		position = Math.min(pos, document.getLength());
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/io/UnicodeReader.java b/src/org/fife/io/UnicodeReader.java
new file mode 100644
index 0000000..d534940
--- /dev/null
+++ b/src/org/fife/io/UnicodeReader.java
@@ -0,0 +1,268 @@
+/*
+ * 09/23/2004
+ *
+ * UnicodeReader.java - A reader for Unicode input streams that is capable of
+ * discerning which particular encoding is being used via the BOM.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.io;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.PushbackInputStream;
+import java.io.Reader;
+
+
+/**
+ * A reader capable of identifying Unicode streams by their BOMs.  This class
+ * will recognize the following encodings:
+ * <ul>
+ *   <li>UTF-8
+ *   <li>UTF-16LE
+ *   <li>UTF-16BE
+ *   <li>UTF-32LE
+ *   <li>UTF-32BE
+ * </ul>
+ * If the stream is not found to be any of the above, then a default encoding
+ * is used for reading.  The user can specify this default encoding, or a system
+ * default will be used.<p>
+ *
+ * For optimum performance, it is recommended that you wrap all instances of
+ * <code>UnicodeReader</code> with a <code>java.io.BufferedReader</code>.<p>
+ *
+ * This class is mostly ripped off from the workaround in the description of
+ * Java Bug 4508058.
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+public class UnicodeReader extends Reader {
+
+	/**
+	 * The input stream from which we're really reading.
+	 */
+	private InputStreamReader internalIn = null;
+
+	/**
+	 * The encoding being used.  We keep our own instead of using the string
+	 * returned by <code>java.io.InputStreamReader</code> since that class
+	 * does not return user-friendly names.
+	 */
+	private String encoding;
+
+	/**
+	 * The size of a BOM.
+	 */
+	private static final int BOM_SIZE = 4;
+
+
+	/**
+	 * This utility constructor is here because you will usually use a
+	 * <code>UnicodeReader</code> on files.<p>
+	 * Creates a reader using the encoding specified by the BOM in the file;
+	 * if there is no recognized BOM, then a system default encoding is used.
+	 *
+	 * @param file The file from which you want to read.
+	 * @throws IOException If an error occurs when checking for/reading the
+	 *         BOM.
+	 * @throws FileNotFoundException If the file does not exist, is a
+	 *         directory, or cannot be opened for reading.
+	 * @throws SecurityException If a security manager exists and its
+	 *         checkRead method denies read access to the file.
+	 */
+	public UnicodeReader(String file) throws IOException,
+							FileNotFoundException, SecurityException {
+		this(new File(file));
+	}
+
+
+	/**
+	 * This utility constructor is here because you will usually use a
+	 * <code>UnicodeReader</code> on files.<p>
+	 * Creates a reader using the encoding specified by the BOM in the file;
+	 * if there is no recognized BOM, then a system default encoding is used.
+	 *
+	 * @param file The file from which you want to read.
+	 * @throws IOException If an error occurs when checking for/reading the
+	 *         BOM.
+	 * @throws FileNotFoundException If the file does not exist, is a
+	 *         directory, or cannot be opened for reading.
+	 * @throws SecurityException If a security manager exists and its
+	 *         checkRead method denies read access to the file.
+	 */
+	public UnicodeReader(File file) throws IOException, FileNotFoundException,
+									SecurityException {
+		this(new FileInputStream(file));
+	}
+
+
+	/**
+	 * This utility constructor is here because you will usually use a
+	 * <code>UnicodeReader</code> on files.<p>
+	 * Creates a reader using the encoding specified by the BOM in the file;
+	 * if there is no recognized BOM, then a specified default encoding is
+	 * used.
+	 *
+	 * @param file The file from which you want to read.
+	 * @param defaultEncoding The encoding to use if no BOM is found.  If
+	 *        this value is <code>null</code>, a system default is used.
+	 * @throws IOException If an error occurs when checking for/reading the
+	 *         BOM.
+	 * @throws FileNotFoundException If the file does not exist, is a
+	 *         directory, or cannot be opened for reading.
+	 * @throws SecurityException If a security manager exists and its
+	 *         checkRead method denies read access to the file.
+	 */
+	public UnicodeReader(File file, String defaultEncoding)
+						throws IOException, FileNotFoundException,
+								SecurityException {
+		this(new FileInputStream(file), defaultEncoding);
+	}
+
+
+	/**
+	 * Creates a reader using the encoding specified by the BOM in the file;
+	 * if there is no recognized BOM, then a system default encoding is used.
+	 *
+	 * @param in The input stream from which to read.
+	 * @throws IOException If an error occurs when checking for/reading the
+	 *         BOM.
+	 */
+	public UnicodeReader(InputStream in) throws IOException {
+		this(in, null);
+	}
+
+
+	/**
+	 * Creates a reader using the encoding specified by the BOM in the file;
+	 * if there is no recognized BOM, then <code>defaultEncoding</code> is
+	 * used.
+	 *
+	 * @param in The input stream from which to read.
+	 * @param defaultEncoding The encoding to use if no recognized BOM is
+	 *        found.  If this value is <code>null</code>, a system default
+	 *        is used.
+	 * @throws IOException If an error occurs when checking for/reading the
+	 *         BOM.
+	 */
+	public UnicodeReader(InputStream in, String defaultEncoding)
+									throws IOException {
+		init(in, defaultEncoding);
+	}
+
+
+	/**
+	 * Closes this reader.
+	 */
+	public void close() throws IOException {
+		internalIn.close();
+	}
+
+
+	/**
+	 * Returns the encoding being used to read this input stream (i.e., the
+	 * encoding of the file).  If a BOM was recognized, then the specific
+	 * Unicode type is returned; otherwise, either the default encoding passed
+	 * into the constructor or the system default is returned.
+	 *
+	 * @return The encoding of the stream.
+	 */
+	public String getEncoding() {
+		return encoding;
+	}
+
+
+	/**
+	 * Read-ahead four bytes and check for BOM marks. Extra bytes are
+	 * unread back to the stream, only BOM bytes are skipped.
+	 *
+	 * @param defaultEncoding The encoding to use if no BOM was recognized.  If
+	 *        this value is <code>null</code>, then a system default is used.
+	 * @throws IOException If an error occurs when trying to read a BOM.
+	 */
+	protected void init(InputStream in, String defaultEncoding)
+											throws IOException {
+
+		PushbackInputStream tempIn = new PushbackInputStream(in, BOM_SIZE);
+
+		byte bom[] = new byte[BOM_SIZE];
+		int n, unread;
+		n = tempIn.read(bom, 0, bom.length);
+
+		if ((bom[0]==(byte)0x00) && (bom[1]==(byte)0x00) &&
+				(bom[2]==(byte)0xFE) && (bom[3]==(byte)0xFF)) {
+			encoding = "UTF-32BE";
+			unread = n - 4;
+		}
+
+		else if (n==BOM_SIZE && // Last 2 bytes are 0; could be an empty UTF-16
+				(bom[0]==(byte)0xFF) && (bom[1]==(byte)0xFE) &&
+				(bom[2]==(byte)0x00) && (bom[3]==(byte)0x00)) {
+			encoding = "UTF-32LE";
+			unread = n - 4;
+		}
+		
+		else if ((bom[0]==(byte)0xEF) &&
+			(bom[1]==(byte)0xBB) &&
+			(bom[2]==(byte)0xBF)) {
+			encoding = "UTF-8";
+			unread = n - 3;
+		}
+
+		else if ((bom[0]==(byte)0xFE) && (bom[1] == (byte)0xFF)) {
+			encoding = "UTF-16BE";
+			unread = n - 2;
+		}
+
+		else if ((bom[0]==(byte)0xFF) && (bom[1]== (byte)0xFE)) {
+			encoding = "UTF-16LE";
+			unread = n - 2;
+		}
+
+		else {
+			// Unicode BOM mark not found, unread all bytes
+			encoding = defaultEncoding;
+			unread = n;
+		}
+
+		if (unread > 0)
+			tempIn.unread(bom, (n - unread), unread);
+		else if (unread < -1)
+			tempIn.unread(bom, 0, 0);
+
+		// Use given encoding
+		if (encoding == null) {
+			internalIn = new InputStreamReader(tempIn);
+			encoding = internalIn.getEncoding(); // Get the default.
+		}
+		else {
+			internalIn = new InputStreamReader(tempIn, encoding);
+		}
+
+	}
+
+
+	/**
+	 * Read characters into a portion of an array. This method will block until
+	 * some input is available, an I/O error occurs, or the end of the stream
+	 * is reached.
+	 *
+	 * @param cbuf The buffer into which to read.
+	 * @param off The offset at which to start storing characters.
+	 * @param len The maximum number of characters to read.
+	 *
+	 * @return The number of characters read, or <code>-1</code> if the end
+	 *         of the stream has been reached.
+	 */
+	public int read(char[] cbuf, int off, int len) throws IOException {
+		return internalIn.read(cbuf, off, len);
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/io/UnicodeWriter.java b/src/org/fife/io/UnicodeWriter.java
new file mode 100644
index 0000000..40dd8e4
--- /dev/null
+++ b/src/org/fife/io/UnicodeWriter.java
@@ -0,0 +1,253 @@
+/*
+ * 09/24/2004
+ *
+ * UnicodeWriter.java - Writes Unicode output with the proper BOM.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.io;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+
+
+/**
+ * Writes Unicode text to an output stream.  If the specified encoding is a
+ * Unicode, then the text is preceded by the proper Unicode BOM.  If it is any
+ * other encoding, this class behaves just like <code>OutputStreamWriter</code>.
+ * This class is here because Java's <code>OutputStreamWriter</code> apparently
+ * doesn't believe in writing BOMs.
+ * <p>
+ *
+ * For optimum performance, it is recommended that you wrap all instances of
+ * <code>UnicodeWriter</code> with a <code>java.io.BufferedWriter</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.7
+ */
+public class UnicodeWriter extends Writer {
+
+	/**
+	 * If this system property evaluates to "<code>false</code>", ignoring
+	 * case, files written out as UTF-8 will not have a BOM written for them.
+	 * Otherwise (even if the property is not set), UTF-8 files will have a
+	 * BOM written.
+	 */
+	public static final String PROPERTY_WRITE_UTF8_BOM	=
+												"UnicodeWriter.writeUtf8BOM";
+
+
+	/**
+	 * The writer actually doing the writing.
+	 */
+	private OutputStreamWriter internalOut;
+
+	private static final byte[] UTF8_BOM = new byte[] {
+												(byte)0xEF,
+												(byte)0xBB,
+												(byte)0xBF
+											};
+
+	private static final byte[] UTF16LE_BOM = new byte[] { 
+												(byte)0xFF,
+												(byte)0xFE
+											};
+
+	private static final byte[] UTF16BE_BOM = new byte[] {
+												(byte)0xFE,
+												(byte)0xFF
+											};
+
+	private static final byte[] UTF32LE_BOM = new byte[] {
+												(byte)0xFF,
+												(byte)0xFE,
+												(byte)0x00,
+												(byte)0x00
+											};
+
+	private static final byte[] UTF32BE_BOM = new byte[] {
+												(byte)0x00,
+												(byte)0x00,
+												(byte)0xFE,
+												(byte)0xFF
+											};
+
+
+	/**
+	 * This is a utility constructor since the vast majority of the time, this
+	 * class will be used to write Unicode files.
+	 *
+	 * @param fileName The file to which to write the Unicode output.
+	 * @param encoding The encoding to use.
+	 * @throws UnsupportedEncodingException If the specified encoding is not
+	 *         supported.
+	 * @throws IOException If an IO exception occurs.
+	 */
+	public UnicodeWriter(String fileName, String encoding)
+						throws UnsupportedEncodingException, IOException {
+		this(new FileOutputStream(fileName), encoding);
+	}
+
+
+
+	/**
+	 * This is a utility constructor since the vast majority of the time, this
+	 * class will be used to write Unicode files.
+	 *
+	 * @param file The file to which to write the Unicode output.
+	 * @param encoding The encoding to use.
+	 * @throws UnsupportedEncodingException If the specified encoding is not
+	 *         supported.
+	 * @throws IOException If an IO exception occurs.
+	 */
+	public UnicodeWriter(File file, String encoding)
+						throws UnsupportedEncodingException, IOException {
+		this(new FileOutputStream(file), encoding);
+	}
+
+
+
+	/**
+	 * Creates a new writer.
+	 *
+	 * @param out The output stream to write.
+	 * @param encoding The encoding to use.
+	 * @throws UnsupportedEncodingException If the specified encoding is not
+	 *         supported.
+	 * @throws IOException If an IO exception occurs.
+	 */
+	public UnicodeWriter(OutputStream out, String encoding)
+						throws UnsupportedEncodingException, IOException {
+		init(out, encoding);
+	}
+
+
+	/**
+	 * Closes this writer.
+	 *
+	 * @throws IOException If an IO exception occurs.
+	 */
+	public void close() throws IOException {
+		internalOut.close();
+	}
+
+
+	/**
+	 * Flushes the stream.
+	 *
+	 * @throws IOException If an IO exception occurs.
+	 */
+	public void flush() throws IOException {
+		internalOut.flush();
+	}
+
+
+	/**
+	 * Returns the encoding being used to write this output stream (i.e., the
+	 * encoding of the file).
+	 *
+	 * @return The encoding of the stream.
+	 */
+	public String getEncoding() {
+		return internalOut.getEncoding();
+	}
+
+
+	/**
+	 * Returns whether UTF-8 files should have a BOM in them when written.
+	 *
+	 * @return Whether to write a BOM for UTF-8 files.
+	 */
+	public static boolean getWriteUtf8BOM() {
+		String prop = System.getProperty(PROPERTY_WRITE_UTF8_BOM);
+		if (prop!=null && Boolean.valueOf(prop).equals(Boolean.FALSE)) {
+			return false;
+		}
+		return true;
+	}
+
+
+	/**
+	 * Initializes the internal output stream and writes the BOM if the
+	 * specified encoding is a Unicode encoding.
+	 *
+	 * @param out The output stream we are writing.
+	 * @param encoding The encoding in which to write.
+	 * @throws UnsupportedEncodingException If the specified encoding isn't
+	 *         supported.
+	 * @throws IOException If an I/O error occurs while writing a BOM.
+	 */
+	private void init(OutputStream out, String encoding)
+						throws UnsupportedEncodingException, IOException {
+
+		internalOut = new OutputStreamWriter(out, encoding);
+
+		// Write the proper BOM if they specified a Unicode encoding.
+		// NOTE: Creating an OutputStreamWriter with encoding "UTF-16" DOES
+		// DOES write out the BOM; "UTF-16LE", "UTF-16BE", "UTF-32", "UTF-32LE"
+		// and "UTF-32BE" don't.
+		if ("UTF-8".equals(encoding)) {
+			if (getWriteUtf8BOM()) {
+				out.write(UTF8_BOM, 0, UTF8_BOM.length);
+			}
+		}
+		else if ("UTF-16LE".equals(encoding)) {
+			out.write(UTF16LE_BOM, 0, UTF16LE_BOM.length);
+		}
+		else if (/*"UTF-16".equals(encoding) || */"UTF-16BE".equals(encoding)) {
+			out.write(UTF16BE_BOM, 0, UTF16BE_BOM.length);
+		}
+		else if ("UTF-32LE".equals(encoding)) {
+			out.write(UTF32LE_BOM, 0, UTF32LE_BOM.length);
+		}
+		else if ("UTF-32".equals(encoding) || "UTF-32BE".equals(encoding)) {
+			out.write(UTF32BE_BOM, 0, UTF32BE_BOM.length);
+		}
+
+	}
+
+
+	/**
+	 * Writes a portion of an array of characters.
+	 *
+	 * @param cbuf The buffer of characters.
+	 * @param off The offset from which to start writing characters.
+	 * @param len The number of characters to write.
+	 * @throws IOException If an I/O error occurs.
+	 */
+	public void write(char[] cbuf, int off, int len) throws IOException {
+		internalOut.write(cbuf, off, len);
+	}
+
+
+	/**
+	 * Writes a single character.
+	 *
+	 * @param c An integer specifying the character to write.
+	 * @throws IOException If an IO error occurs.
+	 */
+	public void write(int c) throws IOException {
+		internalOut.write(c);
+	}
+
+
+	/**
+	 * Writes a portion of a string.
+	 *
+	 * @param str The string from which to write.
+	 * @param off The offset from which to start writing characters.
+	 * @param len The number of characters to write.
+	 * @throws IOException If an IO error occurs.
+	 */
+	public void write(String str, int off, int len) throws IOException {
+		internalOut.write(str, off, len);
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/io/package.html b/src/org/fife/io/package.html
new file mode 100644
index 0000000..b998767
--- /dev/null
+++ b/src/org/fife/io/package.html
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	Utility I/O classes.
+	</body>
+</html>
diff --git a/src/org/fife/print/RPrintUtilities.java b/src/org/fife/print/RPrintUtilities.java
new file mode 100644
index 0000000..fc68f2d
--- /dev/null
+++ b/src/org/fife/print/RPrintUtilities.java
@@ -0,0 +1,530 @@
+/*
+ * 11/14/2003
+ *
+ * RPrintUtilities.java - A collection of static methods useful for printing
+ * text from Swing text components.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.print;
+
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Segment;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.TabExpander;
+import javax.swing.text.Utilities;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.print.*;
+
+
+
+/**
+ * A collection of static methods useful for printing text from Swing text components.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class RPrintUtilities {
+
+	private static int currentDocLineNumber;		// The line number in the document we are currently on.
+	private static int numDocLines;				// The number of lines in the current document.
+	private static Element rootElement;			// The first Element (line) in the current document.
+
+	// The characters at which to break a line if implementing word wrap.
+	private static final char [] breakChars = { ' ', '\t', ',', '.', ';', '?', '!' };
+
+	// These variables are 'global' because RPrintTabExpander uses them.
+	private static int xOffset;					// The x-offset (for the page margin) when printing.
+	private static int tabSizeInSpaces;			// The length of a tab, in spaces.
+	private static FontMetrics fm;				// The metrics of the font currently being used to print.
+
+
+	/**
+	 * Returns the position closest to, but before, position <code>maxCharsPerLine</code> in
+	 * <code>line</code> of one of the chars in <code>breakChars</code>, or simply returns
+	 * <code>maxCharsPerLine-1</code> if none of the <code>breakChars</code> comes before
+	 * that position.  This position represents the logical line break for this <code>java.lang.String</code>
+	 * if it is being printed in a monospaced font when lines can only be <code>maxCharsPerLine</code>
+	 * characters long.
+	 *
+	 * @param line The text being printed.
+	 * @param maxCharsPerLine Only up-to this many characters from
+	 *        <code>line</code> can be printed on one line.
+	 * @return The logical position at which to stop printing <code>line</code>
+	 *         to simulate word wrap.
+	 */
+	private static int getLineBreakPoint(String line, final int maxCharsPerLine) {
+
+		int breakPoint = -1;
+		for (int i=0; i<breakChars.length; i++) {
+			int breakCharPos = line.lastIndexOf(breakChars[i], maxCharsPerLine-1);
+			if (breakCharPos > breakPoint)
+				breakPoint = breakCharPos;
+		}
+
+		return (breakPoint==-1 ? maxCharsPerLine-1 : breakPoint);
+
+	}
+
+
+	/**
+	 * Prints a <code>Document</code> using a monospaced font, and does no word wrapping (ie,
+	 * words will wrap mid-word to the next line).  This method is expected to be called from
+	 * Printable 'print(Graphics g)' functions.
+	 *
+	 * @param g The graphics context to write to.
+	 * @param doc The <code>javax.swing.text.Document</code> to print.
+	 * @param fontSize the point size to use for the monospaced font.
+	 * @param pageIndex The page number to print.
+	 * @param pageFormat The format to print the page with.
+	 * @param tabSize The number of spaces to expand tabs to.
+	 *
+	 * @see #printDocumentMonospacedWordWrap
+	 */
+	public static int printDocumentMonospaced(Graphics g, Document doc, int fontSize, int pageIndex,
+							PageFormat pageFormat, int tabSize) {
+
+		g.setColor(Color.BLACK);
+		g.setFont(new Font("Monospaced", Font.PLAIN, fontSize));
+
+		// Initialize our static variables (these are used by our tab expander below).
+		tabSizeInSpaces = tabSize;
+		fm = g.getFontMetrics();
+
+		// Create our tab expander.
+		//RPrintTabExpander tabExpander = new RPrintTabExpander();
+
+		// Get width and height of characters in this monospaced font.
+		int fontWidth = fm.charWidth('w');	// Any character will do as font is monospaced.
+		int fontHeight = fm.getHeight();
+
+		int MAX_CHARS_PER_LINE = (int)pageFormat.getImageableWidth() / fontWidth;
+		int MAX_LINES_PER_PAGE = (int)pageFormat.getImageableHeight() / fontHeight;
+
+		final int STARTING_LINE_NUMBER = MAX_LINES_PER_PAGE * pageIndex;
+
+		// The (x,y) coordinate to print at (in pixels, not characters).
+		// Since y is the baseline of where we'll start printing (not the top-left
+		// corner), we offset it by the font's ascent ( + 1 just for good measure).
+		xOffset = (int)pageFormat.getImageableX();
+		int y = (int)pageFormat.getImageableY() + fm.getAscent() + 1;
+
+		// A counter to keep track of the number of lines that WOULD HAVE been
+		// printed if we were printing all lines.
+		int numPrintedLines = 0;
+
+		// Keep going while there are more lines in the document.
+		currentDocLineNumber = 0;						// The line number of the document we're currently on.
+		rootElement = doc.getDefaultRootElement();		// To shorten accesses in our loop.
+		numDocLines = rootElement.getElementCount();	// The number of lines in our document.
+		while (currentDocLineNumber<numDocLines) {
+
+			// Get the line we are going to print.
+			String curLineString;
+			Element currentLine = rootElement.getElement(currentDocLineNumber);
+			int startOffs = currentLine.getStartOffset();
+			try {
+				curLineString = doc.getText(startOffs, currentLine.getEndOffset()-startOffs);
+			} catch (BadLocationException ble) { // Never happens
+				ble.printStackTrace();
+				return Printable.NO_SUCH_PAGE;
+			}
+
+			// Get rid of newlines, because they end up as boxes if you don't; this is a monospaced font.
+			curLineString = curLineString.replaceAll("\n", "");
+
+			// Replace tabs with how many spaces they should be.
+			if (tabSizeInSpaces == 0) {
+				curLineString = curLineString.replaceAll("\t", "");
+			}
+			else {
+				int tabIndex = curLineString.indexOf('\t');
+				while (tabIndex > -1) {
+					int spacesNeeded = tabSizeInSpaces - (tabIndex % tabSizeInSpaces);
+					String replacementString = "";
+					for (int i=0; i<spacesNeeded; i++)
+						replacementString += ' ';
+					// Note that "\t" is actually a regex for this method.
+					curLineString = curLineString.replaceFirst("\t", replacementString);
+					tabIndex = curLineString.indexOf('\t');
+				}
+			}
+
+			// If this document line is too long to fit on one printed line on the page,
+			// break it up into multpile lines.
+			while (curLineString.length() > MAX_CHARS_PER_LINE) {
+
+				numPrintedLines++;
+				if (numPrintedLines > STARTING_LINE_NUMBER) {
+						g.drawString(curLineString.substring(0,MAX_CHARS_PER_LINE), xOffset,y);
+						y += fontHeight;
+						if (numPrintedLines==STARTING_LINE_NUMBER+MAX_LINES_PER_PAGE)
+							return Printable.PAGE_EXISTS;
+	 			}
+
+				curLineString = curLineString.substring(MAX_CHARS_PER_LINE, curLineString.length());
+
+			}
+
+			currentDocLineNumber += 1; // We have printed one more line from the document.
+
+			numPrintedLines++;
+			if (numPrintedLines>STARTING_LINE_NUMBER) {
+				g.drawString(curLineString, xOffset,y);
+				y += fontHeight;
+				if (numPrintedLines==STARTING_LINE_NUMBER+MAX_LINES_PER_PAGE)
+					return Printable.PAGE_EXISTS;
+			}
+
+
+		}
+
+		// Now, the whole document has been "printed."  Decide if this page had any text on it or not.
+		if (numPrintedLines > STARTING_LINE_NUMBER)
+			return Printable.PAGE_EXISTS;
+		return Printable.NO_SUCH_PAGE;
+
+	}
+
+
+	/**
+	 * Prints a <code>Document</code> using a monospaced font, word wrapping on
+	 * the characters ' ', '\t', '\n', ',', '.', and ';'.  This method is
+	 * expected to be called from Printable 'print(Graphics g)' functions.
+	 *
+	 * @param g The graphics context to write to.
+	 * @param doc The <code>javax.swing.text.Document</code> to print.
+	 * @param fontSize the point size to use for the monospaced font.
+	 * @param pageIndex The page number to print.
+	 * @param pageFormat The format to print the page with.
+	 * @param tabSize The number of spaces to expand tabs to.
+	 *
+	 * @see #printDocumentMonospaced
+	 */
+	public static int printDocumentMonospacedWordWrap(Graphics g, Document doc,
+								int fontSize, int pageIndex,
+								PageFormat pageFormat, int tabSize) {
+
+		g.setColor(Color.BLACK);
+		g.setFont(new Font("Monospaced", Font.PLAIN, fontSize));
+
+		// Initialize our static variables (these are used by our tab expander below).
+		tabSizeInSpaces = tabSize;
+		fm = g.getFontMetrics();
+
+		// Create our tab expander.
+		//RPrintTabExpander tabExpander = new RPrintTabExpander();
+
+		// Get width and height of characters in this monospaced font.
+		int fontWidth = fm.charWidth('w'); 	// Any character will do here, since font is monospaced.
+		int fontHeight = fm.getHeight();
+
+		int MAX_CHARS_PER_LINE = (int)pageFormat.getImageableWidth() / fontWidth;
+		int MAX_LINES_PER_PAGE = (int)pageFormat.getImageableHeight() / fontHeight;
+
+		final int STARTING_LINE_NUMBER = MAX_LINES_PER_PAGE * pageIndex;
+
+		// The (x,y) coordinate to print at (in pixels, not characters).
+		// Since y is the baseline of where we'll start printing (not the top-left
+		// corner), we offset it by the font's ascent ( + 1 just for good measure).
+		xOffset = (int)pageFormat.getImageableX();
+		int y = (int)pageFormat.getImageableY() + fm.getAscent() + 1;
+
+		// A counter to keep track of the number of lines that WOULD HAVE been
+		// printed if we were printing all lines.
+		int numPrintedLines = 0;
+
+		// Keep going while there are more lines in the document.
+		currentDocLineNumber = 0;						// The line number of the document we're currently on.
+		rootElement = doc.getDefaultRootElement();		// To shorten accesses in our loop.
+		numDocLines = rootElement.getElementCount();	// The number of lines in our document.
+		while (currentDocLineNumber<numDocLines) {
+
+			// Get the line we are going to print.
+			String curLineString;
+			Element currentLine = rootElement.getElement(currentDocLineNumber);
+			int startOffs = currentLine.getStartOffset();
+			try {
+				curLineString = doc.getText(startOffs, currentLine.getEndOffset()-startOffs);
+			} catch (BadLocationException ble) { // Never happens
+				ble.printStackTrace();
+				return Printable.NO_SUCH_PAGE;
+			}
+
+			// Remove newlines, because they end up as boxes if you don't; this is a monospaced font.
+			curLineString = curLineString.replaceAll("\n", "");
+
+			// Replace tabs with how many spaces they should be.
+			if (tabSizeInSpaces == 0) {
+				curLineString = curLineString.replaceAll("\t", "");
+			}
+			else {
+				int tabIndex = curLineString.indexOf('\t');
+				while (tabIndex > -1) {
+					int spacesNeeded = tabSizeInSpaces - (tabIndex % tabSizeInSpaces);
+					String replacementString = "";
+					for (int i=0; i<spacesNeeded; i++)
+						replacementString += ' ';
+					// Note that "\t" is actually a regex for this method.
+					curLineString = curLineString.replaceFirst("\t", replacementString);
+					tabIndex = curLineString.indexOf('\t');
+				}
+			}
+
+			// If this document line is too long to fit on one printed line on the page,
+			// break it up into multpile lines.
+			while (curLineString.length() > MAX_CHARS_PER_LINE) {
+
+				int breakPoint = getLineBreakPoint(curLineString, MAX_CHARS_PER_LINE) + 1;
+
+				numPrintedLines++;
+				if (numPrintedLines > STARTING_LINE_NUMBER) {
+						g.drawString(curLineString.substring(0,breakPoint), xOffset,y);
+						y += fontHeight;
+						if (numPrintedLines==STARTING_LINE_NUMBER+MAX_LINES_PER_PAGE)
+							return Printable.PAGE_EXISTS;
+	 			}
+
+				curLineString = curLineString.substring(breakPoint, curLineString.length());
+
+			}
+
+			currentDocLineNumber += 1; // We have printed one more line from the document.
+
+			numPrintedLines++;
+			if (numPrintedLines>STARTING_LINE_NUMBER) {
+				g.drawString(curLineString, xOffset,y);
+				y += fontHeight;
+				if (numPrintedLines==STARTING_LINE_NUMBER+MAX_LINES_PER_PAGE)
+					return Printable.PAGE_EXISTS;
+			}
+
+
+		}
+
+		// Now, the whole document has been "printed."  Decide if this page had any text on it or not.
+		if (numPrintedLines > STARTING_LINE_NUMBER)
+			return Printable.PAGE_EXISTS;
+		return Printable.NO_SUCH_PAGE;
+
+	}
+
+
+	/**
+	 * Prints a <code>Document</code> using the specified font, word wrapping
+	 * on the characters ' ', '\t', '\n', ',', '.', and ';'.  This method is
+	 * expected to be called from Printable 'print(Graphics g)' functions.
+	 *
+	 * @param g The graphics context to write to.
+	 * @param textComponent The <code>javax.swing.text.JTextComponent</code>
+	 *        whose text you're printing.
+	 * @param font The font to use for printing.  If <code>null</code>, then
+	 *        <code>textComponent</code>'s font is used.
+	 * @param pageIndex The page number to print.
+	 * @param pageFormat The format to print the page with.
+	 * @param tabSize The number of spaces to convert tabs to.
+	 *
+	 */
+	public static int printDocumentWordWrap(Graphics g, JTextComponent textComponent,
+										Font font, int pageIndex,
+										PageFormat pageFormat,
+										int tabSize) {
+
+		// Initialize our graphics object.
+		g.setColor(Color.BLACK);
+		g.setFont(font!=null ? font : textComponent.getFont());
+
+		// Initialize our static variables (these are used by our tab expander below).
+		tabSizeInSpaces = tabSize;
+		fm = g.getFontMetrics();
+		int fontHeight = fm.getHeight();
+
+		final int LINE_LENGTH_IN_PIXELS = (int)pageFormat.getImageableWidth();
+		final int MAX_LINES_PER_PAGE = (int)pageFormat.getImageableHeight() / fontHeight;
+
+		final int STARTING_LINE_NUMBER = MAX_LINES_PER_PAGE * pageIndex;
+
+		// Create our tab expander.
+		RPrintTabExpander tabExpander = new RPrintTabExpander();
+
+		// The (x,y) coordinate to print at (in pixels, not characters).
+		// Since y is the baseline of where we'll start printing (not the top-left
+		// corner), we offset it by the font's ascent ( + 1 just for good measure).
+		xOffset = (int)pageFormat.getImageableX();
+		int y = (int)pageFormat.getImageableY() + fm.getAscent() + 1;
+
+		// A counter to keep track of the number of lines that WOULD HAVE been
+		// printed if we were printing all lines.
+		int numPrintedLines = 0;
+
+		// Keep going while there are more lines in the document.
+		Document doc = textComponent.getDocument();
+		rootElement = doc.getDefaultRootElement();
+		numDocLines = rootElement.getElementCount();		// The number of lines in our document.
+		currentDocLineNumber = 0;					// The line number of the document we're currently on.
+		int startingOffset = 0;						// Used when a line is so long it has to be wrapped.
+		while (currentDocLineNumber<numDocLines) {
+
+			Segment currentLineSeg = new Segment();
+
+			// Get the current line (as an Element), and its starting and ending offset in doc.
+			Element currentLine  = rootElement.getElement(currentDocLineNumber);
+			int currentLineStart = currentLine.getStartOffset();
+			int currentLineEnd   = currentLine.getEndOffset();
+
+			// Put the chars of this line in currentLineSeg, but only starting at our desired offset
+			// (because this line may be the second part of a wrapped line, so we'd start after the part
+			// that has already been printed).
+			try {
+				doc.getText(currentLineStart+startingOffset, currentLineEnd-(currentLineStart+startingOffset),
+							currentLineSeg);
+			} catch (BadLocationException ble) {
+				System.err.println("BadLocationException in print (where there shouldn't be one!): " + ble);
+				return Printable.NO_SUCH_PAGE;
+			}
+
+			// Remove any spaces and/or tabs from the end of the segment (would cause problems if you left 'em).
+			currentLineSeg = removeEndingWhitespace(currentLineSeg);
+
+			// Figger out how long the line is, in pixels.
+			int currentLineLengthInPixels = Utilities.getTabbedTextWidth(currentLineSeg, fm, 0, tabExpander, 0);
+
+//System.err.println("'" + currentLineSeg + "' - " + currentLineLengthInPixels + "/" + LINE_LENGTH_IN_PIXELS);
+			// If it'll fit by itself on a printed line, great.
+			if (currentLineLengthInPixels <= LINE_LENGTH_IN_PIXELS) {
+				currentDocLineNumber += 1; 	// We (will) have printed one more line from the document.
+				startingOffset = 0;			// Start at the first character in the new document line.
+			}
+
+			// If it won't fit on a printed line by itself (i.e., it needs to be wrapped)...
+			else {
+
+				// Loop while the current line is too long to fit on a printed line.
+				int currentPos = -1;
+				while (currentLineLengthInPixels > LINE_LENGTH_IN_PIXELS) {
+
+//System.err.println("'" + currentLineSeg + "' - " + currentLineLengthInPixels + "/" + LINE_LENGTH_IN_PIXELS);
+
+					// Remove any spaces and/or tabs from the end of the segment (would cause problems if you left 'em).
+					currentLineSeg = removeEndingWhitespace(currentLineSeg);
+
+					// currentPos will be the last position in the current text of a "line break character."
+					currentPos = -1;
+					String currentLineString = currentLineSeg.toString();
+					for (int i=0; i<breakChars.length; i++) {
+						// "+1" below so we include the character on the line.
+						int pos = currentLineString.lastIndexOf(breakChars[i]) + 1;
+						//if (pos>-1 && pos>currentPos)
+						//	currentPos = pos;
+						if (pos>0 && pos>currentPos & pos!=currentLineString.length())
+							currentPos = pos;
+					}
+
+					// If we didn't find a line break character, we'll simply break the line at
+					// the last character that fits on a printed line.
+					// So here, we set currentPos to be the position of the last character that fits
+					// on the current printed line.
+					if (currentPos == -1) {
+
+						// Fix currentLineSeg so that it contains exactly enough text to fit in
+						// LINE_LENGTH_IN_PIXELS pixels...
+						currentPos = 0;
+						do {
+							currentPos++;
+							try {
+								doc.getText(currentLineStart+startingOffset, currentPos, currentLineSeg);
+							} catch (BadLocationException ble) {
+								System.err.println(ble);
+								return Printable.NO_SUCH_PAGE;
+							}
+							currentLineLengthInPixels = Utilities.
+								getTabbedTextWidth(currentLineSeg, fm, 0, tabExpander, 0);
+						} while (currentLineLengthInPixels <= LINE_LENGTH_IN_PIXELS);
+						currentPos--;
+
+					}
+
+					try {
+						doc.getText((currentLineStart+startingOffset), currentPos, currentLineSeg);
+					} catch (BadLocationException ble) {
+						System.err.println("BadLocationException in print (a):");
+						System.err.println("==> currentLineStart: " + currentLineStart +
+									"; startingOffset: " + startingOffset + "; currentPos: " + currentPos);
+						System.err.println("==> Range: " + (currentLineStart+startingOffset) + " - " +
+									(currentLineStart+startingOffset+currentPos));
+						ble.printStackTrace();
+						return Printable.NO_SUCH_PAGE;
+					}
+
+					currentLineLengthInPixels = Utilities.getTabbedTextWidth(currentLineSeg, fm, 0, tabExpander, 0);
+				} // End of while (currentLineLengthInPixels > LINE_LENGTH_IN_PIXELS).
+
+				startingOffset += currentPos;	// Where to start (offset from line's start), since this line wraps.
+
+			} // End of else.
+
+			numPrintedLines++;
+			if (numPrintedLines>STARTING_LINE_NUMBER) {
+				//g.drawString(currentLineSeg.toString(), xOffset,y);
+				Utilities.drawTabbedText(currentLineSeg, xOffset,y, g, tabExpander, 0);
+				y += fontHeight;
+				if (numPrintedLines==STARTING_LINE_NUMBER+MAX_LINES_PER_PAGE)
+					return Printable.PAGE_EXISTS;
+			}
+
+		}
+
+		// Now, the whole document has been "printed."  Decide if this page had any text on it or not.
+		if (numPrintedLines > STARTING_LINE_NUMBER)
+			return Printable.PAGE_EXISTS;
+		return Printable.NO_SUCH_PAGE;
+
+	}
+
+
+	/**
+	 * Removes any spaces or tabs from the end of the segment.
+	 *
+	 * @param segment The segment from which to remove tailing whitespace.
+	 * @return <code>segment</code> with trailing whitespace removed.
+	 */
+	private static Segment removeEndingWhitespace(Segment segment) {
+		int toTrim = 0;
+		char currentChar = segment.setIndex(segment.getEndIndex()-1);
+		while ((currentChar==' ' || currentChar=='\t') && currentChar!=Segment.DONE) {
+			toTrim++;
+			currentChar = segment.previous();
+		}
+		String stringVal = segment.toString();
+		String newStringVal = stringVal.substring(0,stringVal.length()-toTrim);
+		return new Segment(newStringVal.toCharArray(), 0, newStringVal.length());
+	}
+
+
+	/**
+	 * A tab expander for the document currently being printed with the
+	 * font being used for the printing.
+	 */
+	private static class RPrintTabExpander implements TabExpander {
+
+		RPrintTabExpander() {
+		}
+
+		public float nextTabStop(float x, int tabOffset) {
+			if (tabSizeInSpaces == 0)
+				return x;
+			int tabSizeInPixels = tabSizeInSpaces * fm.charWidth(' ');
+			int ntabs = (((int) x) - xOffset) / tabSizeInPixels;
+			return xOffset + ((ntabs + 1) * tabSizeInPixels);
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/print/package.html b/src/org/fife/print/package.html
new file mode 100644
index 0000000..bd2990a
--- /dev/null
+++ b/src/org/fife/print/package.html
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	Utility methods for printing text in a <code>JTextComponent</code>.
+	</body>
+</html>
diff --git a/src/org/fife/ui/rsyntaxtextarea/AbstractJFlexCTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/AbstractJFlexCTokenMaker.java
new file mode 100644
index 0000000..905c43e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/AbstractJFlexCTokenMaker.java
@@ -0,0 +1,222 @@
+/*
+ * 01/25/2009
+ *
+ * AbstractJFlexCTokenMaker.java - Base class for token makers that use curly
+ * braces to denote code blocks, such as C, C++, Java, Perl, etc.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.event.ActionEvent;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.swing.Action;
+import javax.swing.UIManager;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rtextarea.RTextArea;
+
+
+
+/**
+ * Base class for JFlex-based token makers using C-style syntax.  This class
+ * knows how to auto-indent after opening braces and parens.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class AbstractJFlexCTokenMaker extends AbstractJFlexTokenMaker {
+
+	protected static final Action INSERT_BREAK_ACTION = new InsertBreakAction();
+
+
+	/**
+	 * Returns <code>true</code> always as C-style languages use curly braces
+	 * to denote code blocks.
+	 *
+	 * @return <code>true</code> always.
+	 */
+	public boolean getCurlyBracesDenoteCodeBlocks() {
+		return true;
+	}
+
+
+	/**
+	 * Returns an action to handle "insert break" key presses (i.e. Enter).
+	 * An action is returned that handles newlines differently in multi-line
+	 * comments.
+	 *
+	 * @return The action.
+	 */
+	public Action getInsertBreakAction() {
+		return INSERT_BREAK_ACTION;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.FUNCTION;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean getShouldIndentNextLineAfter(Token t) {
+		if (t!=null && t.textCount==1) {
+			char ch = t.text[t.textOffset];
+			return ch=='{' || ch=='(';
+		}
+		return false;
+	}
+
+
+	/**
+	 * Action that knows how to special-case inserting a newline in a
+	 * multi-line comment for languages like C and Java.
+	 */
+	private static class InsertBreakAction extends
+							RSyntaxTextAreaEditorKit.InsertBreakAction {
+
+		private static final Pattern p =
+							Pattern.compile("([ \\t]*)(/?[\\*]+)([ \\t]*)");
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			RSyntaxTextArea rsta = (RSyntaxTextArea)getTextComponent(e);
+			RSyntaxDocument doc = (RSyntaxDocument)rsta.getDocument();
+
+			int line = textArea.getCaretLineNumber();
+			int type = doc.getLastTokenTypeOnLine(line);
+			if (type<0) {
+				type = doc.getClosestStandardTokenTypeForInternalType(type);
+			}
+
+			// Only in MLC's should we try this
+			if (type==Token.COMMENT_DOCUMENTATION ||
+					type==Token.COMMENT_MULTILINE) {
+				insertBreakInMLC(e, rsta, line);
+			}
+			else {
+				handleInsertBreak(rsta, true);
+			}
+
+		}
+
+
+		/**
+		 * Returns whether the MLC token containing <code>offs</code> appears
+		 * to have a "nested" comment (i.e., contains "<code>/*</code>"
+		 * somewhere inside of it).  This implies that it is likely a "new" MLC
+		 * and needs to be closed.  While not foolproof, this is usually good
+		 * enough of a sign.
+		 *
+		 * @param textArea
+		 * @param line
+		 * @param offs
+		 * @return Whether a comment appears to be nested inside this one.
+		 */
+		private boolean appearsNested(RSyntaxTextArea textArea,
+						int line, int offs) {
+
+			final int firstLine = line; // Remember the line we start at.
+
+			while (line<textArea.getLineCount()) {
+				Token t = textArea.getTokenListForLine(line);
+				int i = 0;
+				// If examining the first line, start at offs.
+				if (line++==firstLine) {
+					t = RSyntaxUtilities.getTokenAtOffset(t, offs);
+					if (t==null) { // offs was at end of the line
+						continue;
+					}
+					i = t.documentToToken(offs);
+				}
+				else {
+					i = t.textOffset;
+				}
+				while (i<t.textOffset+t.textCount-1) {
+					if (t.text[i]=='/' && t.text[i+1]=='*') {
+						return true;
+					}
+					i++;
+				}
+				// If tokens come after this one on this line, our MLC ended.
+				if (t.getNextToken()!=null) {
+					return false;
+				}
+			}
+
+			return true; // No match - MLC goes to the end of the file
+
+		}
+
+		private void insertBreakInMLC(ActionEvent e, RSyntaxTextArea textArea,
+										int line) {
+
+			Matcher m = null;
+			int start = -1;
+			int end = -1;
+			try {
+				start = textArea.getLineStartOffset(line);
+				end = textArea.getLineEndOffset(line);
+				String text = textArea.getText(start, end-start);
+				m = p.matcher(text);
+			} catch (BadLocationException ble) { // Never happens
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				ble.printStackTrace();
+				return;
+			}
+
+			if (m.lookingAt()) {
+
+				String leadingWS = m.group(1);
+				String mlcMarker = m.group(2);
+
+				// If the caret is "inside" any leading whitespace or MLC
+				// marker, move it to the end of the line.
+				int dot = textArea.getCaretPosition();
+				if (dot>=start &&
+						dot<start+leadingWS.length()+mlcMarker.length()) {
+					// If we're in the whitespace before the very start of the
+					// MLC though, just insert a normal newline
+					if (mlcMarker.charAt(0)=='/') {
+						handleInsertBreak(textArea, true);
+						return;
+					}
+					textArea.setCaretPosition(end-1);
+				}
+
+				boolean firstMlcLine = mlcMarker.charAt(0)=='/';
+				boolean nested = appearsNested(textArea, line,
+												start+leadingWS.length()+2);
+				String header = leadingWS +
+						(firstMlcLine ? " * " : "*") +
+						m.group(3);
+				textArea.replaceSelection("\n" + header);
+				if (nested) {
+					dot = textArea.getCaretPosition(); // Has changed
+					textArea.insert("\n" + leadingWS + " */", dot);
+					textArea.setCaretPosition(dot);
+				}
+
+			}
+			else {
+				handleInsertBreak(textArea, true);
+			}
+
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/AbstractJFlexTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/AbstractJFlexTokenMaker.java
new file mode 100644
index 0000000..8d562f8
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/AbstractJFlexTokenMaker.java
@@ -0,0 +1,52 @@
+/*
+ * 03/23/2005
+ *
+ * AbstractJFlexTokenMaker.java - Base class for token makers generated from
+ * programs such as JFlex.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.text.Segment;
+
+
+/**
+ * Base class for JFlex-generated token makers.  This class attempts to factor
+ * out all common code from these classes.  Many methods <em>almost</em> could
+ * be factored out into this class, but cannot because they reference JFlex
+ * variables that we cannot access from this class.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public abstract class AbstractJFlexTokenMaker extends TokenMakerBase {
+
+	protected Segment s;
+
+	protected int start;		// Just for states.
+	protected int offsetShift;	// As parser always starts at 0, but our line doesn't.
+
+
+	/**
+	 * Declared here so we can define overloads that refer to this method.
+	 *
+	 * @param newState The new JFlex state to enter.
+	 */
+	public abstract void yybegin(int newState);
+
+
+	/**
+	 * Starts a new JFlex state and changes the current language index.
+	 *
+	 * @param state The new JFlex state to enter.
+	 * @param languageIndex The new language index.
+	 */
+	protected void yybegin(int state, int languageIndex) {
+		yybegin(state);
+		setLanguageIndex(languageIndex);
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/AbstractTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/AbstractTokenMaker.java
new file mode 100644
index 0000000..0651519
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/AbstractTokenMaker.java
@@ -0,0 +1,67 @@
+/*
+ * 11/07/2004
+ *
+ * AbstractTokenMaker.java - An abstract implementation of TokenMaker.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * An abstract implementation of the
+ * {@link org.fife.ui.rsyntaxtextarea.TokenMaker} interface.  It should
+ * be overridden for every language for which you want to provide
+ * syntax highlighting.<p>
+ *
+ * @see Token
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ */
+public abstract class AbstractTokenMaker extends TokenMakerBase {
+
+	/**
+	 * Hash table of words to highlight and what token type they are.
+	 * The keys are the words to highlight, and their values are the
+	 * token types, for example, <code>Token.RESERVED_WORD</code> or
+	 * <code>Token.FUNCTION</code>.
+	 */
+	protected TokenMap wordsToHighlight;
+
+
+	/**
+	 * Constructor.
+	 */
+	public AbstractTokenMaker() {
+		wordsToHighlight = getWordsToHighlight();
+	}
+
+
+	/**
+	 * Returns the words to highlight for this programming language.
+	 *
+	 * @return A <code>TokenMap</code> containing the words to highlight for
+	 *         this programming language.
+	 */
+	public abstract TokenMap getWordsToHighlight();
+
+
+	/**
+	 * Removes the token last added from the linked list of tokens.  The
+	 * programmer should never have to call this directly; it can be called
+	 * by subclasses of <code>TokenMaker</code> if necessary.
+	 */
+	public void removeLastToken() {
+		if (previousToken==null) {
+			firstToken = currentToken = null;
+		}
+		else {
+			currentToken = previousToken;
+			currentToken.setNextToken(null);
+		}
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/AbstractTokenMakerFactory.java b/src/org/fife/ui/rsyntaxtextarea/AbstractTokenMakerFactory.java
new file mode 100644
index 0000000..a44a60f
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/AbstractTokenMakerFactory.java
@@ -0,0 +1,132 @@
+/*
+ * 12/14/08
+ *
+ * AbstractTokenMakerFactory.java - Base class for TokenMaker implementations.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+
+/**
+ * Base class for {@link TokenMakerFactory} implementations.  A mapping from
+ * language keys to the names of {@link TokenMaker} classes is stored.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class AbstractTokenMakerFactory extends TokenMakerFactory {
+
+	/**
+	 * A mapping from keys to the names of {@link TokenMaker} implementation
+	 * class names.  When {@link #getTokenMaker(String)} is called with a key
+	 * defined in this map, a <code>TokenMaker</code> of the corresponding type
+	 * is returned.
+	 */
+	private Map tokenMakerMap;
+
+
+	/**
+	 * Constructor.
+	 */
+	protected AbstractTokenMakerFactory() {
+		tokenMakerMap = new HashMap();
+		initTokenMakerMap();
+	}
+
+
+	/**
+	 * Returns a {@link TokenMaker} for the specified key.
+	 *
+	 * @param key The key.
+	 * @return The corresponding <code>TokenMaker</code>, or <code>null</code>
+	 *         if none matches the specified key.
+	 */
+	protected TokenMaker getTokenMakerImpl(String key) {
+		TokenMakerCreator tmc = (TokenMakerCreator)tokenMakerMap.get(key);
+		if (tmc!=null) {
+			try {
+				return tmc.create();
+			} catch (RuntimeException re) { // FindBugs
+				throw re;
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return null;
+	}
+
+
+	/**
+	 * Populates the mapping from keys to instances of
+	 * <code>TokenMakerCreator</code>s.  Subclasses should override this method
+	 * and call one of the <code>putMapping</code> overloads to register
+	 * {@link TokenMaker}s for syntax constants.
+	 *
+	 * @see #putMapping(String, String)
+	 * @see #putMapping(String, String, ClassLoader)
+	 */
+	protected abstract void initTokenMakerMap();
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Set keySet() {
+		return tokenMakerMap.keySet();
+	}
+
+
+	/**
+	 * Adds a mapping from a key to a <code>TokenMaker</code> implementation
+	 * class name.
+	 *
+	 * @param key The key.
+	 * @param className The <code>TokenMaker</code> class name.
+	 * @see #putMapping(String, String, ClassLoader)
+	 */
+	public void putMapping(String key, String className) {
+		putMapping(key, className, null);
+	}
+
+
+	/**
+	 * Adds a mapping from a key to a <code>TokenMaker</code> implementation
+	 * class name.
+	 *
+	 * @param key The key.
+	 * @param className The <code>TokenMaker</code> class name.
+	 * @param cl The class loader to use when loading the class.
+	 * @see #putMapping(String, String)
+	 */
+	public void putMapping(String key, String className, ClassLoader cl) {
+		tokenMakerMap.put(key, new TokenMakerCreator(className, cl));
+	}
+
+
+	/**
+	 * Wrapper that handles the creation of TokenMaker instances.
+	 */
+	private static class TokenMakerCreator {
+
+		private String className;
+		private ClassLoader cl;
+
+		public TokenMakerCreator(String className, ClassLoader cl) {
+			this.className = className;
+			this.cl = cl!=null ? cl : getClass().getClassLoader();
+		}
+
+		public TokenMaker create() throws Exception {
+			return (TokenMaker)Class.forName(className, true, cl).newInstance();
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/ActiveLineRangeEvent.java b/src/org/fife/ui/rsyntaxtextarea/ActiveLineRangeEvent.java
new file mode 100644
index 0000000..b77f7cc
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/ActiveLineRangeEvent.java
@@ -0,0 +1,68 @@
+/*
+ * 02/06/2011
+ *
+ * ActiveLineRangeEvent.java - Notifies listeners of an "active line range"
+ * change in an RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.util.EventObject;
+
+
+/**
+ * The event fired by {@link RSyntaxTextArea}s when the active line range
+ * changes.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class ActiveLineRangeEvent extends EventObject {
+
+	private int min;
+	private int max;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param source The text area.
+	 * @param min The first line in the active line range, or
+	 *        <code>-1</code> if the line range is being cleared.
+	 * @param max The last line in the active line range, or
+	 *        <code>-1</code> if the line range is being cleared.
+	 */
+	public ActiveLineRangeEvent(RSyntaxTextArea source, int min, int max) {
+		super(source);
+		this.min = min;
+		this.max = max;
+	}
+
+
+	/**
+	 * Returns the last line in the active line range.
+	 *
+	 * @return The last line, or <code>-1</code> if the range is being
+	 *         cleared.
+	 * @see #getMin()
+	 */
+	public int getMax() {
+		return max;
+	}
+
+
+	/**
+	 * Returns the first line in the active line range.
+	 *
+	 * @return The first line, or <code>-1</code> if the range is being
+	 *         cleared.
+	 * @see #getMax()
+	 */
+	public int getMin() {
+		return min;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/ActiveLineRangeListener.java b/src/org/fife/ui/rsyntaxtextarea/ActiveLineRangeListener.java
new file mode 100644
index 0000000..2c4930c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/ActiveLineRangeListener.java
@@ -0,0 +1,44 @@
+/*
+ * 02/06/2011
+ *
+ * ActiveLineRangeListener.java - Listens for "active line range" changes
+ * in an RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.util.EventListener;
+
+
+/**
+ * Listens for "active line range" events from an <code>RSyntaxTextArea</code>.
+ * If a text area contains some semantic knowledge of the programming language
+ * being edited, it may broadcast {@link ActiveLineRangeEvent}s whenever the
+ * caret moves into a new "block" of code.  Listeners can listen for these
+ * events and respond accordingly.<p>
+ * 
+ * See the <code>RSTALanguageSupport</code> project at
+ * <a href="http://fifesoft.com">http://fifesoft.com</a> for some
+ * <code>LanguageSupport</code> implementations that may broadcast these
+ * events.  Note that if an RSTA/LanguageSupport does not support broadcasting
+ * these events, the listener will simply never receive any notifications.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface ActiveLineRangeListener extends EventListener {
+
+
+	/**
+	 * Called whenever the "active line range" changes.
+	 *
+	 * @param e Information about the line range change.  If there is no longer
+	 *        an "active line range," the "minimum" and "maximum" line values
+	 *        should both be <code>-1</code>.
+	 */
+	public void activeLineRangeChanged(ActiveLineRangeEvent e);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/ChangeableColorHighlightPainter.java b/src/org/fife/ui/rsyntaxtextarea/ChangeableColorHighlightPainter.java
new file mode 100644
index 0000000..6ccdf7e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/ChangeableColorHighlightPainter.java
@@ -0,0 +1,67 @@
+/*
+ * 07/23/2009
+ *
+ * ChangeableColorHighlightPainter.java - A highlighter whose color you can
+ * change.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import javax.swing.text.DefaultHighlighter.DefaultHighlightPainter;
+
+
+/**
+ * A highlighter whose color you can change.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class ChangeableColorHighlightPainter extends DefaultHighlightPainter {
+
+	/**
+	 * DefaultHighlightPainter doesn't allow changing color, so we must cache
+	 * ours here.
+	 */
+	private Color color;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param color The initial color to use.  This cannot be <code>null</code>.
+	 */
+	public ChangeableColorHighlightPainter(Color color) {
+		super(color);
+		setColor(color);
+	}
+
+
+	/**
+	 * Returns the color to paint with.
+	 *
+	 * @return The color.
+	 * @see #setColor(Color)
+	 */
+	public Color getColor() {
+		return color;
+	}
+
+
+	/**
+	 * Sets the color to paint the bounding boxes with.
+	 *
+	 * @param color The new color.  This cannot be <code>null</code>.
+	 * @see #getColor()
+	 */
+	public void setColor(Color color) {
+		if (color==null) {
+			throw new IllegalArgumentException("color cannot be null");
+		}
+		this.color = color;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/CodeTemplateManager.java b/src/org/fife/ui/rsyntaxtextarea/CodeTemplateManager.java
new file mode 100644
index 0000000..696c710
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/CodeTemplateManager.java
@@ -0,0 +1,470 @@
+/*
+ * 02/21/2005
+ *
+ * CodeTemplateManager.java - manages code templates.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.beans.XMLDecoder;
+import java.beans.XMLEncoder;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.*;
+import javax.swing.KeyStroke;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.templates.CodeTemplate;
+
+
+/**
+ * Manages "code templates."<p>
+ *
+ * All methods in this class are synchronized for thread safety, but as a
+ * best practice, you should probably only modify the templates known to a
+ * <code>CodeTemplateManager</code> on the EDT.  Modifying a
+ * <code>CodeTemplate</code> retrieved from a <code>CodeTemplateManager</code>
+ * while <em>not</em> on the EDT could cause problems.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class CodeTemplateManager {
+
+	private int maxTemplateIDLength;
+	private List templates;
+
+	private KeyStroke insertTrigger;
+	private String insertTriggerString;
+	private Segment s;
+	private TemplateComparator comparator;
+	private File directory;
+
+	private static final int mask = InputEvent.CTRL_MASK|InputEvent.SHIFT_MASK;
+	static final KeyStroke TEMPLATE_KEYSTROKE = KeyStroke.
+								getKeyStroke(KeyEvent.VK_SPACE, mask);
+
+
+	/**
+	 * Constructor.
+	 */
+	public CodeTemplateManager() {
+
+		// Default insert trigger is a space.
+		// FIXME:  See notes in RSyntaxTextAreaDefaultInputMap.
+		setInsertTrigger(TEMPLATE_KEYSTROKE);
+
+		s = new Segment();
+		comparator = new TemplateComparator();
+		templates = new ArrayList();
+
+	}
+
+
+	/**
+	 * Registers the specified template with this template manager.
+	 *
+	 * @param template The template to register.
+	 * @throws IllegalArgumentException If <code>template</code> is
+	 *         <code>null</code>.
+	 * @see #removeTemplate(CodeTemplate)
+	 * @see #removeTemplate(String)
+	 */
+	public synchronized void addTemplate(CodeTemplate template) {
+		if (template==null) {
+			throw new IllegalArgumentException("template cannot be null");
+		}
+		templates.add(template);
+		sortTemplates();
+	}
+
+
+	/**
+	 * Returns the keystroke that is the "insert trigger" for templates;
+	 * that is, the character that, when inserted into an instance of
+	 * <code>RSyntaxTextArea</code>, triggers the search for
+	 * a template matching the token ending at the caret position.
+	 *
+	 * @return The insert trigger.
+	 * @see #getInsertTriggerString()
+	 * @see #setInsertTrigger(KeyStroke)
+	 */
+	/*
+	 * FIXME:  This text IS what's inserted if the trigger character is pressed
+	 * in a text area but no template matches, but it is NOT the trigger
+	 * character used in the text areas.  This is because space (" ") is
+	 * hard-coded into RSyntaxTextAreaDefaultInputMap.java.  We need to make
+	 * this dynamic somehow.  See RSyntaxTextAreaDefaultInputMap.java.
+	 */
+	public KeyStroke getInsertTrigger() {
+		return insertTrigger;
+	}
+
+
+	/**
+	 * Returns the "insert trigger" for templates; that is, the character
+	 * that, when inserted into an instance of <code>RSyntaxTextArea</code>,
+	 * triggers the search for a template matching the token ending at the
+	 * caret position.
+	 *
+	 * @return The insert trigger character.
+	 * @see #getInsertTrigger()
+	 * @see #setInsertTrigger(KeyStroke)
+	 */
+	/*
+	 * FIXME:  This text IS what's inserted if the trigger character is pressed
+	 * in a text area but no template matches, but it is NOT the trigger
+	 * character used in the text areas.  This is because space (" ") is
+	 * hard-coded into RSyntaxTextAreaDefaultInputMap.java.  We need to make
+	 * this dynamic somehow.  See RSyntaxTextAreaDefaultInputMap.java.
+	 */
+	public String getInsertTriggerString() {
+		return insertTriggerString;
+	}
+
+
+	/**
+	 * Returns the template that should be inserted at the current caret
+	 * position, assuming the trigger character was pressed.
+	 *
+	 * @param textArea The text area that's getting text inserted into it.
+	 * @return A template that should be inserted, if appropriate, or
+	 *         <code>null</code> if no template should be inserted.
+	 */
+	public synchronized CodeTemplate getTemplate(RSyntaxTextArea textArea) {
+		int caretPos = textArea.getCaretPosition();
+		int charsToGet = Math.min(caretPos, maxTemplateIDLength);
+		try {
+			Document doc = textArea.getDocument();
+			doc.getText(caretPos-charsToGet, charsToGet, s);
+			int index = Collections.binarySearch(templates, s, comparator);
+			return index>=0 ? (CodeTemplate)templates.get(index) : null;
+		} catch (BadLocationException ble) {
+			ble.printStackTrace();
+			throw new InternalError("Error in CodeTemplateManager");
+		}
+	}
+
+
+	/**
+	 * Returns the number of templates this manager knows about.
+	 *
+	 * @return The template count.
+	 */
+	public synchronized int getTemplateCount() {
+		return templates.size();
+	}
+
+
+	/**
+	 * Returns the templates currently available.
+	 *
+	 * @return The templates available.
+	 */
+	public synchronized CodeTemplate[] getTemplates() {
+		CodeTemplate[] temp = new CodeTemplate[templates.size()];
+		return (CodeTemplate[])templates.toArray(temp);
+	}
+
+
+	/**
+	 * Returns whether the specified character is a valid character for a
+	 * <code>CodeTemplate</code> id.
+	 *
+	 * @param ch The character to check.
+	 * @return Whether the character is a valid template character.
+	 */
+	public static final boolean isValidChar(char ch) {
+		return RSyntaxUtilities.isLetterOrDigit(ch) || ch=='_';
+	}
+
+
+	/**
+	 * Returns the specified code template.
+	 *
+	 * @param template The template to remove.
+	 * @return <code>true</code> if the template was removed, <code>false</code>
+	 *         if the template was not in this template manager.
+	 * @throws IllegalArgumentException If <code>template</code> is
+	 *         <code>null</code>.
+	 * @see #removeTemplate(String)
+	 * @see #addTemplate(CodeTemplate)
+	 */
+	public synchronized boolean removeTemplate(CodeTemplate template) {
+
+		if (template==null) {
+			throw new IllegalArgumentException("template cannot be null");
+		}
+
+		// TODO: Do a binary search
+		return templates.remove(template);
+
+	}
+
+
+	/**
+	 * Returns the code template with the specified id.
+	 *
+	 * @param id The id to check for.
+	 * @return The code template that was removed, or <code>null</code> if
+	 *         there was no template with the specified ID.
+	 * @throws IllegalArgumentException If <code>id</code> is <code>null</code>.
+	 * @see #removeTemplate(CodeTemplate)
+	 * @see #addTemplate(CodeTemplate)
+	 */
+	public synchronized CodeTemplate removeTemplate(String id) {
+
+		if (id==null) {
+			throw new IllegalArgumentException("id cannot be null");
+		}
+
+		// TODO: Do a binary search
+		for (Iterator i=templates.iterator(); i.hasNext(); ) {
+			CodeTemplate template = (CodeTemplate)i.next();
+			if (id.equals(template.getID())) {
+				i.remove();
+				return template;
+			}
+		}
+
+		return null;
+
+	}
+
+
+	/**
+	 * Replaces the current set of available templates with the ones
+	 * specified.
+	 *
+	 * @param newTemplates The new set of templates.  Note that we will
+	 *        be taking a shallow copy of these and sorting them.
+	 */
+	public synchronized void replaceTemplates(CodeTemplate[] newTemplates) {
+		templates.clear();
+		if (newTemplates!=null) {
+			for (int i=0; i<newTemplates.length; i++) {
+				templates.add(newTemplates[i]);
+			}
+		}
+		sortTemplates(); // Also recomputes maxTemplateIDLength.
+	}
+
+
+	/**
+	 * Saves all templates as XML files in the current template directory.
+	 *
+	 * @return Whether or not the save was successful.
+	 */
+	public synchronized boolean saveTemplates() {
+
+		if (templates==null)
+			return true;
+		if (directory==null || !directory.isDirectory())
+			return false;
+
+		// Blow away all old XML files to start anew, as some might be from
+		// templates we're removed from the template manager.
+		File[] oldXMLFiles = directory.listFiles(new XMLFileFilter());
+		if (oldXMLFiles==null)
+			return false; // Either an IOException or it isn't a directory.
+		int count = oldXMLFiles.length;
+		for (int i=0; i<count; i++) {
+			/*boolean deleted = */oldXMLFiles[i].delete();
+		}
+
+		// Save all current templates as XML.
+		boolean wasSuccessful = true;
+		for (Iterator i=templates.iterator(); i.hasNext(); ) {
+			CodeTemplate template = (CodeTemplate)i.next();
+			File xmlFile = new File(directory, template.getID() + ".xml");
+			try {
+				XMLEncoder e = new XMLEncoder(new BufferedOutputStream(
+										new FileOutputStream(xmlFile)));
+				e.writeObject(template);
+				e.close();
+			} catch (IOException ioe) {
+				ioe.printStackTrace();
+				wasSuccessful = false;
+			}
+		}
+
+		return wasSuccessful;
+
+	}
+
+
+	/**
+	 * Sets the "trigger" character for templates.
+	 *
+	 * @param trigger The trigger character to set for templates.  This means
+	 *        that when this character is pressed in an
+	 *        <code>RSyntaxTextArea</code>,  the last-typed token is found,
+	 *        and is checked against all template ID's to see if a template
+	 *        should be inserted.  If a template ID matches, that template is
+	 *        inserted; if not, the trigger character is inserted.  If this
+	 *        parameter is <code>null</code>, no change is made to the trigger
+	 *        character.
+	 * @see #getInsertTrigger()
+	 * @see #getInsertTriggerString()
+	 */
+	/*
+	 * FIXME:  The trigger set here IS inserted when no matching template
+	 * is found, but a space character (" ") is always used as the "trigger"
+	 * to look for templates.  This is because it is hard-coded in
+	 * RSyntaxTextArea's input map this way.  We need to change this.
+	 * See RSyntaxTextAreaDefaultInputMap.java.
+	 */
+	public void setInsertTrigger(KeyStroke trigger) {
+		if (trigger!=null) {
+			insertTrigger = trigger;
+			insertTriggerString = Character.toString(trigger.getKeyChar());
+		}
+	}
+
+
+	/**
+	 * Sets the directory in which to look for templates.  Calling this
+	 * method adds any new templates found in the specified directory to
+	 * the templates already registered.
+	 *
+	 * @param dir The new directory in which to look for templates.
+	 * @return The new number of templates in this template manager, or
+	 *         <code>-1</code> if the specified directory does not exist.
+	 */
+	public synchronized int setTemplateDirectory(File dir) {
+
+		if (dir!=null && dir.isDirectory()) {
+
+			this.directory = dir;
+
+			File[] files = dir.listFiles(new XMLFileFilter());
+			int newCount = files==null ? 0 : files.length;
+			int oldCount = templates.size();
+
+			List temp = new ArrayList(oldCount+newCount);
+			temp.addAll(templates);
+
+			for (int i=0; i<newCount; i++) {
+				try {
+					XMLDecoder d = new XMLDecoder(new BufferedInputStream(
+						new FileInputStream(files[i])));
+					Object obj = d.readObject();
+					if (!(obj instanceof CodeTemplate)) {
+						throw new IOException("Not a CodeTemplate: " +
+										files[i].getAbsolutePath());
+					}
+					temp.add(obj);
+					d.close();
+				} catch (/*IO, NoSuchElement*/Exception e) {
+					// NoSuchElementException can be thrown when reading
+					// an XML file not in the format expected by XMLDecoder.
+					// (e.g. CodeTemplates in an old format).
+					e.printStackTrace();
+				}
+			}
+			templates = temp;
+			sortTemplates();
+
+			return getTemplateCount();
+
+		}
+
+		return -1;
+
+	}
+
+
+	/**
+	 * Removes any null entries in the current set of templates (if
+	 * any), sorts the remaining templates, and computes the new
+	 * maximum template ID length.
+	 */
+	private synchronized void sortTemplates() {
+
+		// Get the maximum length of a template ID.
+		maxTemplateIDLength = 0;
+
+		// Remove any null entries (should only happen because of
+		// IOExceptions, etc. when loading from files), and sort
+		// the remaining list.
+		for (Iterator i=templates.iterator(); i.hasNext(); ) {
+			CodeTemplate temp = (CodeTemplate)i.next();
+			if (temp==null || temp.getID()==null) {
+				i.remove();
+			}
+			else {
+				maxTemplateIDLength = Math.max(maxTemplateIDLength,
+										temp.getID().length());
+			}
+		}
+
+		Collections.sort(templates);
+
+	}
+
+
+	/**
+	 * A comparator that takes a <code>CodeTemplate</code> as its first
+	 * parameter and a <code>Segment</code> as its second, and knows
+	 * to compare the template's ID to the segment's text.
+	 */
+	private static class TemplateComparator implements Comparator, Serializable{
+
+		public int compare(Object template, Object segment) {
+
+			// Get template start index (0) and length.
+			CodeTemplate t = (CodeTemplate)template;
+			final char[] templateArray = t.getID().toCharArray();
+			int i = 0;
+			int len1 = templateArray.length;
+
+			// Find "token" part of segment and get its offset and length.
+			Segment s = (Segment)segment;
+			char[] segArray = s.array;
+			int len2 = s.count;
+			int j = s.offset + len2 - 1;
+			while (j>=s.offset && isValidChar(segArray[j])) {
+				j--;
+			}
+			j++;
+			int segShift = j - s.offset;
+			len2 -= segShift;
+
+			int n = Math.min(len1, len2);
+			while (n-- != 0) {
+				char c1 = templateArray[i++];
+				char c2 = segArray[j++];
+				if (c1 != c2)
+					return c1 - c2;
+			}
+			return len1 - len2;
+
+		}
+
+	}
+
+
+	/**
+	 * A file filter for File.listFiles() (NOT for JFileChoosers!) that
+	 * accepts only XML files.
+	 */
+	private static class XMLFileFilter implements FileFilter {
+		public boolean accept(File f) {
+			return f.getName().toLowerCase().endsWith(".xml");
+		}
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/DefaultOccurrenceMarker.java b/src/org/fife/ui/rsyntaxtextarea/DefaultOccurrenceMarker.java
new file mode 100644
index 0000000..4e06104
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/DefaultOccurrenceMarker.java
@@ -0,0 +1,53 @@
+/*
+ * 03/09/2013
+ *
+ * DefaultOccurrenceMarker - Marks occurrences of the current token for most
+ * languages.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.text.BadLocationException;
+
+
+/**
+ * The default implementation of {@link OccurrenceMarker}.  It goes through
+ * the document and marks all instances of the specified token.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class DefaultOccurrenceMarker implements OccurrenceMarker {
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void markOccurrences(RSyntaxDocument doc, Token t,
+			RSyntaxTextAreaHighlighter h, MarkOccurrencesHighlightPainter p) {
+
+		char[] lexeme = t.getLexeme().toCharArray();
+		int type = t.type;
+		int lineCount = doc.getDefaultRootElement().getElementCount();
+
+		for (int i=0; i<lineCount; i++) {
+			Token temp = doc.getTokenListForLine(i);
+			while (temp!=null && temp.isPaintable()) {
+				if (temp.is(type, lexeme)) {
+					try {
+						int end = temp.offset + temp.textCount;
+						h.addMarkedOccurrenceHighlight(temp.offset, end, p);
+					} catch (BadLocationException ble) {
+						ble.printStackTrace(); // Never happens
+					}
+				}
+				temp = temp.getNextToken();
+			}
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/DefaultTokenFactory.java b/src/org/fife/ui/rsyntaxtextarea/DefaultTokenFactory.java
new file mode 100644
index 0000000..fe8580c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/DefaultTokenFactory.java
@@ -0,0 +1,137 @@
+/*
+ * 10/28/2004
+ *
+ * DefaultTokenFactory.java - Default token factory.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.text.Segment;
+
+
+/**
+ * This class generates tokens for a {@link TokenMaker}.  This class is here
+ * because it reuses tokens when they aren't needed anymore to prevent
+ * This class doesn't actually create new tokens every time
+ * <code>createToken</code> is called.  Instead, it internally keeps a stack of
+ * available already-created tokens.  When more tokens are needed to properly
+ * display a line, more tokens are added to the available stack.  This saves
+ * from needless repetitive memory allocation. However, it makes it IMPERATIVE
+ * that users call <code>resetTokenList</code> when creating a new token list so
+ * that the token maker can keep an accurate list of available tokens.<p>
+ *
+ * NOTE:  This class should only be used by {@link TokenMaker}; nobody else
+ * needs it!
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+class DefaultTokenFactory implements TokenFactory {
+
+	private int size;
+	private int increment;
+	private Token[] tokenList;
+	private int currentFreeToken;
+
+	protected static final int DEFAULT_START_SIZE	= 30;
+	protected static final int DEFAULT_INCREMENT		= 10;
+
+
+	/**
+	 * Constructor.
+	 */
+	public DefaultTokenFactory() {
+		this(DEFAULT_START_SIZE, DEFAULT_INCREMENT);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param size The initial number of tokens in this factory.
+	 * @param increment How many tokens to increment by when the stack gets
+	 *        empty.
+	 */
+	public DefaultTokenFactory(int size, int increment) {
+
+		this.size = size;
+		this.increment = increment;
+		this.currentFreeToken = 0;
+
+		// Give us some tokens to initially work with.
+		tokenList = new Token[size];
+		for (int i=0; i<size; i++) {
+			tokenList[i] = new Token();
+		}
+
+	}
+
+
+	/**
+	 * Adds tokens to the internal token list.  This is called whenever a
+	 * request is made and no more tokens are available.
+	 */
+	private final void augmentTokenList() {
+		Token[] temp = new Token[size + increment];
+		System.arraycopy(tokenList,0, temp,0, size);
+		size += increment;
+		tokenList = temp;
+		for (int i=0; i<increment; i++) {
+			tokenList[size-i-1] = new Token();
+		}
+		//System.err.println("... size up to: " + size);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Token createToken() {
+		Token token = tokenList[currentFreeToken];
+		token.text = null;
+		token.type = Token.NULL;
+		token.offset = -1;
+		token.setNextToken(null);
+		currentFreeToken++;
+		if (currentFreeToken==size)
+			augmentTokenList();
+		return token;	
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Token createToken(final Segment line, final int beg,
+					final int end, final int startOffset, final int type) {
+		return createToken(line.array, beg,end, startOffset, type);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Token createToken(final char[] line, final int beg,
+					final int end, final int startOffset, final int type) {
+		Token token = tokenList[currentFreeToken];
+		token.set(line, beg,end, startOffset, type);
+		currentFreeToken++;
+		if (currentFreeToken==size)
+			augmentTokenList();
+		return token;	
+	}
+
+
+	/**
+	 * Resets the state of this token maker.  This method should be called
+	 * by the <code>TokenMaker</code> every time a token list is generated for
+	 * a new line so the tokens can be reused.
+	 */
+	public void resetAllTokens() {
+		currentFreeToken = 0;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/DefaultTokenMakerFactory.java b/src/org/fife/ui/rsyntaxtextarea/DefaultTokenMakerFactory.java
new file mode 100644
index 0000000..1205189
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/DefaultTokenMakerFactory.java
@@ -0,0 +1,72 @@
+/*
+ * 12/14/2008 
+ *
+ * DefaultTokenMakerFactory.java - The default TokenMaker factory.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * The default implementation of <code>TokenMakerFactory</code>.  This factory
+ * can create {@link TokenMaker}s for all languages known to
+ * {@link RSyntaxTextArea}.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class DefaultTokenMakerFactory extends AbstractTokenMakerFactory
+								implements SyntaxConstants {
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected void initTokenMakerMap() {
+
+		String pkg = "org.fife.ui.rsyntaxtextarea.modes.";
+
+		putMapping(SYNTAX_STYLE_NONE,			pkg + "PlainTextTokenMaker");
+		putMapping(SYNTAX_STYLE_ACTIONSCRIPT,	pkg + "ActionScriptTokenMaker");
+		putMapping(SYNTAX_STYLE_ASSEMBLER_X86,	pkg + "AssemblerX86TokenMaker");
+		putMapping(SYNTAX_STYLE_BBCODE,			pkg + "BBCodeTokenMaker");
+		putMapping(SYNTAX_STYLE_C,				pkg + "CTokenMaker");
+		putMapping(SYNTAX_STYLE_CLOJURE,		pkg + "ClojureTokenMaker");
+		putMapping(SYNTAX_STYLE_CPLUSPLUS,		pkg + "CPlusPlusTokenMaker");
+		putMapping(SYNTAX_STYLE_CSHARP,			pkg + "CSharpTokenMaker");
+		putMapping(SYNTAX_STYLE_CSS,			pkg + "CSSTokenMaker");
+		putMapping(SYNTAX_STYLE_DELPHI,			pkg + "DelphiTokenMaker");
+		putMapping(SYNTAX_STYLE_DTD,			pkg + "DtdTokenMaker");
+		putMapping(SYNTAX_STYLE_FORTRAN,		pkg + "FortranTokenMaker");
+		putMapping(SYNTAX_STYLE_GROOVY,			pkg + "GroovyTokenMaker");
+		putMapping(SYNTAX_STYLE_HTML,			pkg + "HTMLTokenMaker");
+		putMapping(SYNTAX_STYLE_JAVA,			pkg + "JavaTokenMaker");
+		putMapping(SYNTAX_STYLE_JAVASCRIPT,		pkg + "JavaScriptTokenMaker");
+		putMapping(SYNTAX_STYLE_JSON,			pkg + "JsonTokenMaker");
+		putMapping(SYNTAX_STYLE_JSP,			pkg + "JSPTokenMaker");
+		putMapping(SYNTAX_STYLE_LATEX,			pkg + "LatexTokenMaker");
+		putMapping(SYNTAX_STYLE_LISP,			pkg + "LispTokenMaker");
+		putMapping(SYNTAX_STYLE_LUA,			pkg + "LuaTokenMaker");
+		putMapping(SYNTAX_STYLE_MAKEFILE,		pkg + "MakefileTokenMaker");
+		putMapping(SYNTAX_STYLE_MXML,			pkg + "MxmlTokenMaker");
+		putMapping(SYNTAX_STYLE_NSIS,			pkg + "NSISTokenMaker");
+		putMapping(SYNTAX_STYLE_PERL,			pkg + "PerlTokenMaker");
+		putMapping(SYNTAX_STYLE_PHP,			pkg + "PHPTokenMaker");
+		putMapping(SYNTAX_STYLE_PROPERTIES_FILE,pkg + "PropertiesFileTokenMaker");
+		putMapping(SYNTAX_STYLE_PYTHON,			pkg + "PythonTokenMaker");
+		putMapping(SYNTAX_STYLE_RUBY,			pkg + "RubyTokenMaker");
+		putMapping(SYNTAX_STYLE_SAS,			pkg + "SASTokenMaker");
+		putMapping(SYNTAX_STYLE_SCALA,			pkg + "ScalaTokenMaker");
+		putMapping(SYNTAX_STYLE_SQL,			pkg + "SQLTokenMaker");
+		putMapping(SYNTAX_STYLE_TCL,			pkg + "TclTokenMaker");
+		putMapping(SYNTAX_STYLE_UNIX_SHELL,		pkg + "UnixShellTokenMaker");
+		putMapping(SYNTAX_STYLE_VISUAL_BASIC,	pkg + "VisualBasicTokenMaker");
+		putMapping(SYNTAX_STYLE_WINDOWS_BATCH,	pkg + "WindowsBatchTokenMaker");
+		putMapping(SYNTAX_STYLE_XML,			pkg + "XMLTokenMaker");
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/DefaultTokenPainter.java b/src/org/fife/ui/rsyntaxtextarea/DefaultTokenPainter.java
new file mode 100644
index 0000000..878530e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/DefaultTokenPainter.java
@@ -0,0 +1,267 @@
+/*
+ * 03/16/2013
+ *
+ * DefaultTokenPainter - Standard implementation of a token painter.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.awt.Graphics2D;
+import java.awt.geom.Rectangle2D;
+import javax.swing.text.TabExpander;
+
+
+/**
+ * Standard implementation of a token painter.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class DefaultTokenPainter implements TokenPainter {
+
+	/**
+	 * Rectangle used for filling token backgrounds.
+	 */
+	private Rectangle2D.Float bgRect;
+
+	/**
+	 * Micro-optimization; buffer used to compute tab width.  If the width is
+	 * correct it's not re-allocated, to prevent lots of very small garbage.
+	 * Only used when painting tab lines.
+	 */
+	private static char[] tabBuf;
+
+
+	public DefaultTokenPainter() {
+		bgRect = new Rectangle2D.Float();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public final float paint(Token token, Graphics2D g, float x, float y,
+						RSyntaxTextArea host, TabExpander e) {
+		return paint(token, g, x,y, host, e, 0);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public float paint(Token token, Graphics2D g, float x, float y,
+			RSyntaxTextArea host, TabExpander e, float clipStart) {
+		return paintImpl(token, g, x, y, host, e, clipStart, false);
+	}
+
+
+	/**
+	 * Paints the background of a token.
+	 *
+	 * @param x The x-coordinate of the token.
+	 * @param y The y-coordinate of the token.
+	 * @param width The width of the token (actually, the width of the part of
+	 *        the token to paint).
+	 * @param height The height of the token.
+	 * @param g The graphics context with which to paint.
+	 * @param fontAscent The ascent of the token's font.
+	 * @param host The text area.
+	 * @param color The color with which to paint.
+	 * @param xor Whether the color should be XOR'd against the editor's
+	 *        background.  This should be <code>true</code> when the selected
+	 *        text color is being ignored.
+	 */
+	protected void paintBackground(float x, float y, float width, float height,
+							Graphics2D g, int fontAscent, RSyntaxTextArea host,
+							Color color, boolean xor) {
+		// RSyntaxTextArea's bg can be null, so we must check for this.
+		Color temp = host.getBackground();
+		if (xor) { // XOR painting is pretty slow on Windows
+			g.setXORMode(temp!=null ? temp : Color.WHITE);
+		}
+		g.setColor(color);
+		bgRect.setRect(x,y-fontAscent, width,height);
+		//g.fill(bgRect);
+		g.fillRect((int)x, (int)(y-fontAscent), (int)width, (int)height);
+		if (xor) {
+			g.setPaintMode();
+		}
+	}
+
+
+	/**
+	 * Does the dirty-work of actually painting the token.
+	 */
+	protected float paintImpl(Token token, Graphics2D g, float x, float y,
+			RSyntaxTextArea host, TabExpander e, float clipStart,
+			boolean selected) {
+
+		int origX = (int)x;
+		int end = token.textOffset + token.textCount;
+		float nextX = x;
+		int flushLen = 0;
+		int flushIndex = token.textOffset;
+		Color fg, bg;
+		if (selected) {
+			fg = host.getSelectedTextColor();
+			bg = null;
+		}
+		else {
+			fg = host.getForegroundForToken(token);
+			bg = host.getBackgroundForToken(token);
+		}
+		g.setFont(host.getFontForTokenType(token.type));
+		FontMetrics fm = host.getFontMetricsForTokenType(token.type);
+
+		for (int i=token.textOffset; i<end; i++) {
+			switch (token.text[i]) {
+				case '\t':
+					nextX = e.nextTabStop(
+						x+fm.charsWidth(token.text, flushIndex,flushLen), 0);
+					if (bg!=null) {
+						paintBackground(x,y, nextX-x,fm.getHeight(),
+									g, fm.getAscent(), host, bg, !selected);
+					}
+					if (flushLen > 0) {
+						g.setColor(fg);
+						g.drawChars(token.text, flushIndex, flushLen, (int)x,(int)y);
+						flushLen = 0;
+					}
+					flushIndex = i + 1;
+					x = nextX;
+					break;
+				default:
+					flushLen += 1;
+					break;
+			}
+		}
+
+		nextX = x+fm.charsWidth(token.text, flushIndex,flushLen);
+
+		if (flushLen>0 && nextX>=clipStart) {
+			if (bg!=null) {
+				paintBackground(x,y, nextX-x,fm.getHeight(),
+								g, fm.getAscent(), host, bg, !selected);
+			}
+			g.setColor(fg);
+			g.drawChars(token.text, flushIndex, flushLen, (int)x,(int)y);
+		}
+
+		if (host.getUnderlineForToken(token)) {
+			g.setColor(fg);
+			int y2 = (int)(y+1);
+			g.drawLine(origX,y2, (int)nextX,y2);
+		}
+
+		// Don't check if it's whitespace - some TokenMakers may return types
+		// other than Token.WHITESPACE for spaces (such as Token.IDENTIFIER).
+		// This also allows us to paint tab lines for MLC's.
+		if (host.getPaintTabLines() && origX==host.getMargin().left) {// && isWhitespace()) {
+			paintTabLines(token, origX, (int)y, (int)nextX, g, e, host);
+		}
+
+		return nextX;
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public float paintSelected(Token token, Graphics2D g, float x, float y,
+			RSyntaxTextArea host, TabExpander e) {
+		return paintSelected(token, g, x, y, host, e, 0);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public float paintSelected(Token token, Graphics2D g, float x, float y,
+			RSyntaxTextArea host, TabExpander e, float clipStart) {
+		return paintImpl(token, g, x, y, host, e, clipStart, true);
+	}
+
+
+	/**
+	 * Paints dotted "tab" lines; that is, lines that show where your caret
+	 * would go to on the line if you hit "tab".  This visual effect is usually
+	 * done in the leading whitespace token(s) of lines.
+	 *
+	 * @param token The token to render.
+	 * @param x The starting x-offset of this token.  It is assumed that this
+	 *        is the left margin of the text area (may be non-zero due to
+	 *        insets), since tab lines are only painted for leading whitespace.
+	 * @param y The baseline where this token was painted.
+	 * @param endX The ending x-offset of this token.
+	 * @param g The graphics context.
+	 * @param e Used to expand tabs.
+	 * @param host The text area.
+	 */
+	protected void paintTabLines(Token token, int x, int y, int endX,
+				Graphics2D g, TabExpander e, RSyntaxTextArea host) {
+
+		// We allow tab lines to be painted in more than just Token.WHITESPACE,
+		// i.e. for MLC's and Token.IDENTIFIERS (for TokenMakers that return
+		// whitespace as identifiers for performance).  But we only paint tab
+		// lines for the leading whitespace in the token.  So, if this isn't a
+		// WHITESPACE token, figure out the leading whitespace's length.
+		if (token.type!=Token.WHITESPACE) {
+			int offs = token.textOffset;
+			for (; offs<token.textOffset+token.textCount; offs++) {
+				if (!RSyntaxUtilities.isWhitespace(token.text[offs])) {
+					break; // MLC text, etc.
+				}
+			}
+			int len = offs - token.textOffset;
+			if (len<2) { // Must be at least two spaces to see tab line
+				return;
+			}
+			//endX = x + (int)getWidthUpTo(len, host, e, x);
+			endX = (int)token.getWidthUpTo(len, host, e, 0);
+		}
+
+		// Get the length of a tab.
+		FontMetrics fm = host.getFontMetricsForTokenType(token.type);
+		int tabSize = host.getTabSize();
+		if (tabBuf==null || tabBuf.length<tabSize) {
+			tabBuf = new char[tabSize];
+			for (int i=0; i<tabSize; i++) {
+				tabBuf[i] = ' ';
+			}
+		}
+		// Note different token types (MLC's, whitespace) could possibly be
+		// using different fonts, which means we can't cache the actual width
+		// of a tab as it may be different per-token-type.  We could keep a
+		// per-token-type cache, but we'd have to clear it whenever they
+		// modified token styles.
+		int tabW = fm.charsWidth(tabBuf, 0, tabSize);
+
+		// Draw any tab lines.  Here we're assuming that "x" is the left
+		// margin of the editor.
+		g.setColor(host.getTabLineColor());
+		int x0 = x + tabW;
+		int y0 = y - fm.getAscent();
+		if ((y0&1)>0) {
+			// Only paint on even y-pixels to prevent doubling up between lines
+			y0++;
+		}
+		while (x0<endX) {
+			int y1 = y0;
+			int y2 = y0 + host.getLineHeight();
+			while (y1<y2) {
+				g.drawLine(x0, y1, x0, y1);
+				y1 += 2;
+			}
+			//g.drawLine(x0,y0, x0,y0+host.getLineHeight());
+			x0 += tabW;
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/DocumentRange.java b/src/org/fife/ui/rsyntaxtextarea/DocumentRange.java
new file mode 100644
index 0000000..6008ced
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/DocumentRange.java
@@ -0,0 +1,62 @@
+/*
+ * 08/11/2009
+ *
+ * DocumentRange.java - A range of text in a document.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * A range of text in a document.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class DocumentRange {
+
+	private int startOffs;
+	private int endOffs;
+
+
+	public DocumentRange(int startOffs, int endOffs) {
+		this.startOffs = startOffs;
+		this.endOffs = endOffs;
+	}
+
+
+	/**
+	 * Gets the end offset of the range.
+	 *
+	 * @return The end offset.
+	 * @see #getStartOffset()
+	 */
+	public int getEndOffset() {
+		return endOffs;
+	}
+
+
+	/**
+	 * Gets the starting offset of the range.
+	 *
+	 * @return The starting offset.
+	 * @see #getEndOffset()
+	 */
+	public int getStartOffset() {
+		return startOffs;
+	}
+
+
+	/**
+	 * Returns a string representation of this object.
+	 *
+	 * @return A string representation of this object.
+	 */
+	public String toString() {
+		return "[DocumentRange: " + startOffs + "-" + endOffs + "]";
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/ErrorStrip.java b/src/org/fife/ui/rsyntaxtextarea/ErrorStrip.java
new file mode 100644
index 0000000..88b34a4
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/ErrorStrip.java
@@ -0,0 +1,766 @@
+/*
+ * 08/10/2009
+ *
+ * ErrorStrip.java - A component that can visually show Parser messages (syntax
+ * errors, etc.) in an RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.ResourceBundle;
+import javax.swing.JComponent;
+import javax.swing.ToolTipManager;
+import javax.swing.UIManager;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.parser.Parser;
+import org.fife.ui.rsyntaxtextarea.parser.ParserNotice;
+import org.fife.ui.rsyntaxtextarea.parser.TaskTagParser.TaskNotice;
+
+
+/**
+ * A component to sit alongside an {@link RSyntaxTextArea} that displays
+ * colored markers for locations of interest (parser errors, marked
+ * occurrences, etc.).<p>
+ *
+ * <code>ErrorStrip</code>s display <code>ParserNotice</code>s from
+ * {@link Parser}s.  Currently, the only way to get lines flagged in this
+ * component is to register a <code>Parser</code> on an RSyntaxTextArea and
+ * return <code>ParserNotice</code>s for each line to display an icon for.
+ * The severity of each notice must be at least the threshold set by
+ * {@link #setLevelThreshold(int)} to be displayed in this error strip.  The
+ * default threshold is {@link ParserNotice#WARNING}.<p>
+ *   
+ * An <code>ErrorStrip</code> can be added to a UI like so:
+ * <pre>
+ * textArea = createTextArea();
+ * textArea.addParser(new MyParser(textArea)); // Identifies lines to display
+ * scrollPane = new RTextScrollPane(textArea, true);
+ * ErrorStrip es = new ErrorStrip(textArea);
+ * JPanel temp = new JPanel(new BorderLayout());
+ * temp.add(scrollPane);
+ * temp.add(es, BorderLayout.LINE_END);
+ * </pre>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ */
+/*
+ * Possible improvements:
+ *    1. Handle marked occurrence changes separately from parser changes.
+ *       For each property change, call a method that removes the notices
+ *       being reloaded from the Markers (removing any Markers that are now
+ *       "empty").
+ *    2. When 1.4 support is dropped, replace new Integer(int) with
+ *       Integer.valueOf(int).
+ */
+public class ErrorStrip extends JComponent {
+
+	/**
+	 * The text area.
+	 */
+	private RSyntaxTextArea textArea;
+
+	/**
+	 * Listens for events in this component.
+	 */
+	private Listener listener;
+
+	/**
+	 * Whether "marked occurrences" in the text area should be shown in this
+	 * error strip.
+	 */
+	private boolean showMarkedOccurrences;
+
+	/**
+	 * Mapping of colors to brighter colors.  This is kept to prevent
+	 * unnecessary creation of the same Colors over and over.
+	 */
+	private Map brighterColors;
+
+	/**
+	 * Only notices of this severity (or worse) will be displayed in this
+	 * error strip.
+	 */
+	private int levelThreshold;
+
+	/**
+	 * Whether the caret marker's location should be rendered.
+	 */
+	private boolean followCaret;
+
+	/**
+	 * The color to use for the caret marker.
+	 */
+	private Color caretMarkerColor;
+
+	/**
+	 * Where we paint the caret marker.
+	 */
+	private int caretLineY;
+
+	/**
+	 * The last location of the caret marker.
+	 */
+	private int lastLineY;
+
+	/**
+	 * The preferred width of this component.
+	 */
+	private static final int PREFERRED_WIDTH = 14;
+
+	private static final String MSG = "org.fife.ui.rsyntaxtextarea.ErrorStrip";
+	private static final ResourceBundle msg = ResourceBundle.getBundle(MSG);
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The text area we are examining.
+	 */
+	public ErrorStrip(RSyntaxTextArea textArea) {
+		this.textArea = textArea;
+		listener = new Listener();
+		ToolTipManager.sharedInstance().registerComponent(this);
+		setLayout(null); // Manually layout Markers as they can overlap
+		addMouseListener(listener);
+		setShowMarkedOccurrences(true);
+		setLevelThreshold(ParserNotice.WARNING);
+		setFollowCaret(true);
+		setCaretMarkerColor(Color.BLACK);
+	}
+
+
+	/**
+	 * Overridden so we only start listening for parser notices when this
+	 * component (and presumably the text area) are visible.
+	 */
+	public void addNotify() {
+		super.addNotify();
+		textArea.addCaretListener(listener);
+		textArea.addPropertyChangeListener(
+				RSyntaxTextArea.PARSER_NOTICES_PROPERTY, listener);
+		textArea.addPropertyChangeListener(
+				RSyntaxTextArea.MARK_OCCURRENCES_PROPERTY, listener);
+		textArea.addPropertyChangeListener(
+				RSyntaxTextArea.MARKED_OCCURRENCES_CHANGED_PROPERTY, listener);
+		refreshMarkers();
+	}
+
+
+	/**
+	 * Manually manages layout since this component uses no layout manager.
+	 */
+	public void doLayout() {
+		for (int i=0; i<getComponentCount(); i++) {
+			Marker m = (Marker)getComponent(i);
+			m.updateLocation();
+		}
+		listener.caretUpdate(null); // Force recalculation of caret line pos
+	}
+
+
+	/**
+	 * Returns a "brighter" color.
+	 *
+	 * @param c The color.
+	 * @return A brighter color.
+	 */
+	private Color getBrighterColor(Color c) {
+		if (brighterColors==null) {
+			brighterColors = new HashMap(5); // Usually small
+		}
+		Color brighter = (Color)brighterColors.get(c);
+		if (brighter==null) {
+			// Don't use c.brighter() as it doesn't work well for blue, and
+			// also doesn't return something brighter "enough."
+			int r = possiblyBrighter(c.getRed());
+			int g = possiblyBrighter(c.getGreen());
+			int b = possiblyBrighter(c.getBlue());
+			brighter = new Color(r, g, b);
+			brighterColors.put(c, brighter);
+		}
+		return brighter;
+	}
+
+
+	/**
+	 * returns the color to use when painting the caret marker.
+	 *
+	 * @return The caret marker color.
+	 * @see #setCaretMarkerColor(Color)
+	 */
+	public Color getCaretMarkerColor() {
+		return caretMarkerColor;
+	}
+
+
+	/**
+	 * Returns whether the caret's position should be drawn.
+	 *
+	 * @return Whether the caret's position should be drawn.
+	 * @see #setFollowCaret(boolean)
+	 */
+	public boolean getFollowCaret() {
+		return followCaret;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Dimension getPreferredSize() {
+		int height = textArea.getPreferredScrollableViewportSize().height;
+		return new Dimension(PREFERRED_WIDTH, height);
+	}
+
+
+	/**
+	 * Returns the minimum severity a parser notice must be for it to be
+	 * displayed in this error strip.  This will be one of the constants
+	 * defined in the <code>ParserNotice</code> class.
+	 *
+	 * @return The minimum severity.
+	 * @see #setLevelThreshold(int)
+	 */
+	public int getLevelThreshold() {
+		return levelThreshold;
+	}
+
+
+	/**
+	 * Returns whether marked occurrences are shown in this error strip.
+	 *
+	 * @return Whether marked occurrences are shown.
+	 * @see #setShowMarkedOccurrences(boolean)
+	 */
+	public boolean getShowMarkedOccurrences() {
+		return showMarkedOccurrences;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getToolTipText(MouseEvent e) {
+		String text = null;
+		int line = yToLine(e.getY());
+		if (line>-1) {
+			text = msg.getString("Line");
+			// TODO: 1.5: Use Integer.valueOf(line)
+			text = MessageFormat.format(text,
+						new Object[] { new Integer(line+1) });
+		}
+		return text;
+	}
+
+
+	/**
+	 * Returns the y-offset in this component corresponding to a line in the
+	 * text component.
+	 *
+	 * @param line The line.
+	 * @return The y-offset.
+	 * @see #yToLine(int)
+	 */
+	private int lineToY(int line) {
+		int h = textArea.getVisibleRect().height;
+		float lineCount = textArea.getLineCount();
+		return (int)((line/lineCount) * h) - 2;		
+	}
+
+
+	/**
+	 * Overridden to (possibly) draw the caret's position.
+	 *
+	 * @param g The graphics context.
+	 */
+	protected void paintComponent(Graphics g) {
+		super.paintComponent(g);
+		if (caretLineY>-1) {
+			g.setColor(getCaretMarkerColor());
+			g.fillRect(0, caretLineY, getWidth(), 2);
+		}
+	}
+
+
+	/**
+	 * Returns a possibly brighter component for a color.
+	 *
+	 * @param i An RGB component for a color (0-255).
+	 * @return A possibly brighter value for the component.
+	 */
+	private static final int possiblyBrighter(int i) {
+		if (i<255) {
+			i += (int)((255-i)*0.8f);
+		}
+		return i;
+	}
+
+
+	/**
+	 * Refreshes the markers displayed in this error strip.
+	 */
+	private void refreshMarkers() {
+
+		removeAll(); // listener is removed in Marker.removeNotify()
+		Map markerMap = new HashMap();
+
+		List notices = textArea.getParserNotices();
+		for (Iterator i=notices.iterator(); i.hasNext(); ) {
+			ParserNotice notice = (ParserNotice)i.next();
+			if (notice.getLevel()<=levelThreshold ||
+					(notice instanceof TaskNotice)) {
+				// 1.5: Use Integer.valueOf(notice.getLine())
+				Integer key = new Integer(notice.getLine());
+				Marker m = (Marker)markerMap.get(key);
+				if (m==null) {
+					m = new Marker(notice);
+					m.addMouseListener(listener);
+					markerMap.put(key, m);
+					add(m);
+				}
+				else {
+					m.addNotice(notice);
+				}
+			}
+		}
+
+		if (getShowMarkedOccurrences() && textArea.getMarkOccurrences()) {
+			List occurrences = textArea.getMarkedOccurrences();
+			for (Iterator i=occurrences.iterator(); i.hasNext(); ) {
+				DocumentRange range = (DocumentRange)i.next();
+				int line = 0;
+				try {
+					line = textArea.getLineOfOffset(range.getStartOffset());
+				} catch (BadLocationException ble) { // Never happens
+					continue;
+				}
+				ParserNotice notice = new MarkedOccurrenceNotice(range);
+				// 1.5: Use Integer.valueOf(notice.getLine())
+				Integer key = new Integer(line);
+				Marker m = (Marker)markerMap.get(key);
+				if (m==null) {
+					m = new Marker(notice);
+					m.addMouseListener(listener);
+					markerMap.put(key, m);
+					add(m);
+				}
+				else {
+					if (!m.containsMarkedOccurence()) {
+						m.addNotice(notice);
+					}
+				}
+			}
+		}
+
+		revalidate();
+		repaint();
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void removeNotify() {
+		super.removeNotify();
+		textArea.removeCaretListener(listener);
+		textArea.removePropertyChangeListener(
+				RSyntaxTextArea.PARSER_NOTICES_PROPERTY, listener);
+		textArea.removePropertyChangeListener(
+				RSyntaxTextArea.MARK_OCCURRENCES_PROPERTY, listener);
+		textArea.removePropertyChangeListener(
+				RSyntaxTextArea.MARKED_OCCURRENCES_CHANGED_PROPERTY, listener);
+	}
+
+
+	/**
+	 * Sets the color to use when painting the caret marker.
+	 *
+	 * @param color The new caret marker color.
+	 * @see #getCaretMarkerColor()
+	 */
+	public void setCaretMarkerColor(Color color) {
+		if (color!=null) {
+			caretMarkerColor = color;
+			listener.caretUpdate(null); // Force repaint
+		}
+	}
+
+
+	/**
+	 * Toggles whether the caret's current location should be drawn.
+	 *
+	 * @param follow Whether the caret's current location should be followed.
+	 * @see #getFollowCaret()
+	 */
+	public void setFollowCaret(boolean follow) {
+		if (followCaret!=follow) {
+			if (followCaret) {
+				repaint(0,caretLineY, getWidth(),2); // Erase
+			}
+			caretLineY = -1;
+			lastLineY = -1;
+			followCaret = follow;
+			listener.caretUpdate(null); // Possibly repaint
+		}
+	}
+
+
+	/**
+	 * Sets the minimum severity a parser notice must be for it to be displayed
+	 * in this error strip.  This should be one of the constants defined in
+	 * the <code>ParserNotice</code> class.  The default value is
+	 * {@link ParserNotice#WARNING}.
+	 *
+	 * @param level The new severity threshold.
+	 * @see #getLevelThreshold()
+	 * @see ParserNotice
+	 */
+	public void setLevelThreshold(int level) {
+		levelThreshold = level;
+		if (isDisplayable()) {
+			refreshMarkers();
+		}
+	}
+
+
+	/**
+	 * Sets whether marked occurrences are shown in this error strip.
+	 *
+	 * @param show Whether to show marked occurrences.
+	 * @see #getShowMarkedOccurrences()
+	 */
+	public void setShowMarkedOccurrences(boolean show) {
+		if (show!=showMarkedOccurrences) {
+			showMarkedOccurrences = show;
+			if (isDisplayable()) { // Skip this when we're first created
+				refreshMarkers();
+			}
+		}
+	}
+
+
+	/**
+	 * Returns the line in the text area corresponding to a y-offset in this
+	 * component.
+	 *
+	 * @param y The y-offset.
+	 * @return The line.
+	 * @see #lineToY(int)
+	 */
+	private final int yToLine(int y) {
+		int line = -1;
+		int h = textArea.getVisibleRect().height;
+		if (y<h) {
+			float at = y/(float)h;
+			line = (int)(textArea.getLineCount()*at);
+		}
+		return line;
+	}
+
+
+	/**
+	 * Listens for events in the error strip and its markers.
+	 */
+	private class Listener extends MouseAdapter
+					implements PropertyChangeListener, CaretListener {
+
+		private Rectangle visibleRect = new Rectangle();
+
+		public void caretUpdate(CaretEvent e) {
+			if (getFollowCaret()) {
+				int line = textArea.getCaretLineNumber();
+				float percent = line / ((float)textArea.getLineCount());
+				textArea.computeVisibleRect(visibleRect);
+				caretLineY = (int)(visibleRect.height*percent);
+				if (caretLineY!=lastLineY) {
+					repaint(0,lastLineY, getWidth(), 2); // Erase old position
+					repaint(0,caretLineY, getWidth(), 2);
+					lastLineY = caretLineY;
+				}
+			}
+		}
+
+		public void mouseClicked(MouseEvent e) {
+
+			Component source = (Component)e.getSource();
+			if (source instanceof Marker) {
+				((Marker)source).mouseClicked(e);
+				return;
+			}
+
+			int line = yToLine(e.getY());
+			if (line>-1) {
+				try {
+					int offs = textArea.getLineStartOffset(line);
+					textArea.setCaretPosition(offs);
+				} catch (BadLocationException ble) { // Never happens
+					UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				}
+			}
+
+		}
+
+		public void propertyChange(PropertyChangeEvent e) {
+
+			String propName = e.getPropertyName();
+
+			// If they change whether marked occurrences are visible in editor
+			if (RSyntaxTextArea.MARK_OCCURRENCES_PROPERTY.equals(propName)) {
+				if (getShowMarkedOccurrences()) {
+					refreshMarkers();
+				}
+			}
+
+			// If parser notices changed.
+			else if (RSyntaxTextArea.PARSER_NOTICES_PROPERTY.equals(propName)) {
+				refreshMarkers();
+			}
+
+			// If marked occurrences changed.
+			else if (RSyntaxTextArea.MARKED_OCCURRENCES_CHANGED_PROPERTY.
+					equals(propName)) {
+				if (getShowMarkedOccurrences()) {
+					refreshMarkers();
+				}
+			}
+
+		}
+
+	}
+
+
+private static final Color COLOR = new Color(220, 220, 220);
+	/**
+	 * A notice that wraps a "marked occurrence."
+	 */
+	private class MarkedOccurrenceNotice implements ParserNotice {
+
+		private DocumentRange range;
+
+		public MarkedOccurrenceNotice(DocumentRange range) {
+			this.range = range;
+		}
+
+		public int compareTo(Object o) {
+			return 0; // Value doesn't matter
+		}
+
+		public boolean containsPosition(int pos) {
+			return pos>=range.getStartOffset() && pos<range.getEndOffset();
+		}
+
+		public boolean equals(Object o) {
+			// FindBugs - Define equals() when defining compareTo()
+			return compareTo(o)==0;
+		}
+
+		public Color getColor() {
+			return COLOR;
+			//return textArea.getMarkOccurrencesColor();
+		}
+
+		public int getLength() {
+			return range.getEndOffset() - range.getStartOffset();
+		}
+
+		public int getLevel() {
+			return INFO; // Won't matter
+		}
+
+		public int getLine() {
+			try {
+				return textArea.getLineOfOffset(range.getStartOffset());
+			} catch (BadLocationException ble) {
+				return 0;
+			}
+		}
+
+		public String getMessage() {
+			String text = null;
+			try {
+				String word = textArea.getText(range.getStartOffset(),
+												getLength());
+				text = msg.getString("OccurrenceOf");
+				text = MessageFormat.format(text, new String[] { word });
+			} catch (BadLocationException ble) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+			return text;
+		}
+
+		public int getOffset() {
+			return range.getStartOffset();
+		}
+
+		public Parser getParser() {
+			return null;
+		}
+
+		public boolean getShowInEditor() {
+			return false; // Value doesn't matter
+		}
+
+		public String getToolTipText() {
+			return null;
+		}
+
+		public int hashCode() { // FindBugs, since we override equals()
+			return 0; // Value doesn't matter for us.
+		}
+
+	}
+
+
+	/**
+	 * A "marker" in this error strip, representing one or more notices.
+	 */
+	private class Marker extends JComponent {
+
+		private List notices;
+
+		public Marker(ParserNotice notice) {
+			notices = new ArrayList(1); // Usually just 1
+			addNotice(notice);
+			setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+			setSize(getPreferredSize());
+			ToolTipManager.sharedInstance().registerComponent(this);
+		}
+
+		public void addNotice(ParserNotice notice) {
+			notices.add(notice);
+		}
+
+		public boolean containsMarkedOccurence() {
+			boolean result = false;
+			for (int i=0; i<notices.size(); i++) {
+				if (notices.get(i) instanceof MarkedOccurrenceNotice) {
+					result = true;
+					break;
+				}
+			}
+			return result;
+		}
+
+		public Color getColor() {
+			// Return the color for the highest-level parser.
+			Color c = null;
+			int lowestLevel = Integer.MAX_VALUE; // ERROR is 0
+			for (Iterator i=notices.iterator(); i.hasNext(); ) {
+				ParserNotice notice = (ParserNotice)i.next();
+				if (notice.getLevel()<lowestLevel) {
+					lowestLevel = notice.getLevel();
+					c = notice.getColor();
+				}
+			}
+			return c;
+		}
+
+		public Dimension getPreferredSize() {
+			int w = PREFERRED_WIDTH - 4; // 2-pixel empty border
+			return new Dimension(w, 5);
+		}
+
+		public String getToolTipText() {
+
+			String text = null;
+
+			if (notices.size()==1) {
+				text = ((ParserNotice)notices.get(0)).getMessage();
+			}
+			else { // > 1
+				StringBuffer sb = new StringBuffer("<html>");
+				sb.append(msg.getString("MultipleMarkers"));
+				sb.append("<br>");
+				for (int i=0; i<notices.size(); i++) {
+					ParserNotice pn = (ParserNotice)notices.get(i);
+					sb.append("   - ");
+					sb.append(pn.getMessage());
+					sb.append("<br>");
+				}
+				text = sb.toString();
+			}
+
+			return text;
+
+		}
+
+		protected void mouseClicked(MouseEvent e) {
+			ParserNotice pn = (ParserNotice)notices.get(0);
+			int offs = pn.getOffset();
+			int len = pn.getLength();
+			if (offs>-1 && len>-1) { // These values are optional
+				textArea.setSelectionStart(offs);
+				textArea.setSelectionEnd(offs+len);
+			}
+			else {
+				int line = pn.getLine();
+				try {
+					offs = textArea.getLineStartOffset(line);
+					textArea.setCaretPosition(offs);
+				} catch (BadLocationException ble) { // Never happens
+					UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				}
+			}
+		}
+
+		protected void paintComponent(Graphics g) {
+
+			// TODO: Give "priorities" and always pick color of a notice with
+			// highest priority (e.g. parsing errors will usually be red).
+
+			Color borderColor = getColor();
+			if (borderColor==null) {
+				borderColor = Color.DARK_GRAY;
+			}
+			Color fillColor = getBrighterColor(borderColor);
+
+			int w = getWidth();
+			int h = getHeight();
+
+			g.setColor(fillColor);
+			g.fillRect(0,0, w,h);
+
+			g.setColor(borderColor);
+			g.drawRect(0,0, w-1,h-1);
+
+		}
+
+		public void removeNotify() {
+			super.removeNotify();
+			ToolTipManager.sharedInstance().unregisterComponent(this);
+			removeMouseListener(listener);
+		}
+
+		public void updateLocation() {
+			int line = ((ParserNotice)notices.get(0)).getLine();
+			int y = lineToY(line);
+			setLocation(2, y);
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/FileFileLocation.java b/src/org/fife/ui/rsyntaxtextarea/FileFileLocation.java
new file mode 100644
index 0000000..8f02c92
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/FileFileLocation.java
@@ -0,0 +1,114 @@
+/*
+ * 11/13/2008
+ *
+ * FileFileLocation.java - The location of a local file.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+
+/**
+ * The location of a local file.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class FileFileLocation extends FileLocation {
+
+	/**
+	 * The file.  This may or may not actually exist.
+	 */
+	private File file;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param file The local file.
+	 */
+	public FileFileLocation(File file) {
+		try {
+			// Useful on Windows and OS X.
+			this.file = file.getCanonicalFile();
+		} catch (IOException ioe) {
+			this.file = file;
+		}
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected long getActualLastModified() {
+		return file.lastModified();
+	}
+
+
+	/**
+	 * Returns the full path to the file.
+	 *
+	 * @return The full path to the file.
+	 * @see #getFileName()
+	 */
+	public String getFileFullPath() {
+		return file.getAbsolutePath();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getFileName() {
+		return file.getName();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected InputStream getInputStream() throws IOException {
+		return new FileInputStream(file);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected OutputStream getOutputStream() throws IOException {
+		return new FileOutputStream(file);
+	}
+
+
+	/**
+	 * Always returns <code>true</code>.
+	 *
+	 * @return <code>true</code> always.
+	 * @see #isLocalAndExists()
+	 */
+	public boolean isLocal() {
+		return true;
+	}
+
+
+	/**
+	 * Since file locations of this type are guaranteed to be local, this
+	 * method returns whether the file exists.
+	 *
+	 * @return Whether this local file actually exists.
+	 * @see #isLocal()
+	 */
+	public boolean isLocalAndExists() {
+		return file.exists();
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/FileLocation.java b/src/org/fife/ui/rsyntaxtextarea/FileLocation.java
new file mode 100644
index 0000000..eac7319
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/FileLocation.java
@@ -0,0 +1,141 @@
+/*
+ * 11/13/2008
+ *
+ * FileLocation.java - Holds the location of a local or remote file.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URL;
+
+
+/**
+ * Holds the location of a local or remote file.  This provides a common way
+ * to read, write, and check properties of both local and remote files.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class FileLocation {
+
+
+	/**
+	 * Creates a {@link FileLocation} instance for the specified local file.
+	 *
+	 * @param fileFullPath The full path to a local file.
+	 * @return The file's location.
+	 */
+	public static FileLocation create(String fileFullPath) {
+		return new FileFileLocation(new File(fileFullPath));
+	}
+
+
+	/**
+	 * Creates a {@link FileLocation} instance for the specified local file.
+	 *
+	 * @param file A local file.
+	 * @return The file's location.
+	 */
+	public static FileLocation create(File file) {
+		return new FileFileLocation(file);
+	}
+
+
+	/**
+	 * Creates a {@link FileLocation} instance for the specified file.
+	 *
+	 * @param url The URL of a file.
+	 * @return The file's location.
+	 */
+	public static FileLocation create(URL url) {
+		if ("file".equalsIgnoreCase(url.getProtocol())) {
+			return new FileFileLocation(new File(url.getPath()));
+		}
+		return new URLFileLocation(url);
+	}
+
+
+	/**
+	 * Returns the last time this file was modified, or
+	 * {@link TextEditorPane#LAST_MODIFIED_UNKNOWN} if this value cannot be
+	 * computed (such as for a remote file).
+	 *
+	 * @return The last time this file was modified.
+	 */
+	protected abstract long getActualLastModified();
+
+
+	/**
+	 * Returns the full path to the file.  This will be stripped of
+	 * sensitive information such as passwords for remote files.
+	 *
+	 * @return The full path to the file.
+	 * @see #getFileName()
+	 */
+	public abstract String getFileFullPath();
+
+
+	/**
+	 * Returns the name of the file.
+	 *
+	 * @return The name of the file.
+	 * @see #getFileFullPath()
+	 */
+	public abstract String getFileName();
+
+
+	/**
+	 * Opens an input stream for reading from this file.
+	 *
+	 * @return The input stream.
+	 * @throws IOException If the file does not exist, or some other IO error
+	 *         occurs.
+	 */
+	protected abstract InputStream getInputStream() throws IOException;
+
+
+	/**
+	 * Opens an output stream for writing this file.
+	 *
+	 * @return An output stream.
+	 * @throws IOException If an IO error occurs.
+	 */
+	protected abstract OutputStream getOutputStream() throws IOException;
+
+
+	/**
+	 * Returns whether this file location is a local file.
+	 *
+	 * @return Whether this is a local file.
+	 * @see #isLocalAndExists()
+	 */
+	public abstract boolean isLocal();
+
+
+	/**
+	 * Returns whether this file location is a local file that already
+	 * exists.
+	 *
+	 * @return Whether this file is local and actually exists.
+	 * @see #isLocal()
+	 */
+	public abstract boolean isLocalAndExists();
+
+
+	/**
+	 * Returns whether this file location is a remote location.
+	 *
+	 * @return Whether this is a remote file location.
+	 */
+	public boolean isRemote() {
+		return !isLocal();
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/FoldingAwareIconRowHeader.java b/src/org/fife/ui/rsyntaxtextarea/FoldingAwareIconRowHeader.java
new file mode 100644
index 0000000..77efeef
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/FoldingAwareIconRowHeader.java
@@ -0,0 +1,247 @@
+/*
+ * 03/07/2012
+ *
+ * FoldingAwareIconRowHeader - Icon row header that paints itself correctly
+ * even when code folding is enabled.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Point;
+import javax.swing.Icon;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+import org.fife.ui.rtextarea.GutterIconInfo;
+import org.fife.ui.rtextarea.IconRowHeader;
+
+
+/**
+ * A row header component that takes code folding into account when painting
+ * itself.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FoldingAwareIconRowHeader extends IconRowHeader {
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The parent text area.
+	 */
+	public FoldingAwareIconRowHeader(RSyntaxTextArea textArea) {
+		super(textArea);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected void paintComponent(Graphics g) {
+
+		// When line wrap is not enabled, take the faster code path.
+		if (textArea==null) {
+			return;
+		}
+		RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+		FoldManager fm = rsta.getFoldManager();
+		if (!fm.isCodeFoldingSupportedAndEnabled()) {
+			super.paintComponent(g);
+			return;
+		}
+
+		visibleRect = g.getClipBounds(visibleRect);
+		if (visibleRect==null) { // ???
+			visibleRect = getVisibleRect();
+		}
+		//System.out.println("IconRowHeader repainting: " + visibleRect);
+		if (visibleRect==null) {
+			return;
+		}
+
+		g.setColor(getBackground());
+		g.fillRect(0,visibleRect.y, width,visibleRect.height);
+
+		if (textArea.getLineWrap()) {
+			paintComponentWrapped(g);
+			return;
+		}
+
+		Document doc = textArea.getDocument();
+		Element root = doc.getDefaultRootElement();
+		textAreaInsets = textArea.getInsets(textAreaInsets);
+
+		// Get the first line to paint.
+		int cellHeight = textArea.getLineHeight();
+		int topLine = (visibleRect.y-textAreaInsets.top)/cellHeight;
+
+		// Get where to start painting (top of the row).
+		// We need to be "scrolled up" up just enough for the missing part of
+		// the first line.
+		int y = topLine*cellHeight + textAreaInsets.top;
+
+		// AFTER calculating visual offset to paint at, account for folding.
+		topLine += fm.getHiddenLineCountAbove(topLine, true);
+
+		// Paint the active line range.
+		if (activeLineRangeStart>-1 && activeLineRangeEnd>-1) {
+			Color activeLineRangeColor = getActiveLineRangeColor();
+			g.setColor(activeLineRangeColor);
+			try {
+
+				int realY1 = rsta.yForLine(activeLineRangeStart);
+				if (realY1>-1) { // Not in a collapsed fold...
+
+					int  y1 = realY1;//Math.max(y, realY1);
+
+					int y2 = rsta.yForLine(activeLineRangeEnd);
+					if (y2==-1) { // In a collapsed fold
+						y2 = y1;
+					}
+					y2 += cellHeight - 1;
+
+					if (y2<visibleRect.y || y1>visibleRect.y+visibleRect.height) {
+						//System.out.println("... nothing to paint, bailing...");
+						return;
+					}
+					y1 = Math.max(y, realY1);
+					y2 = Math.min(y2, visibleRect.y+visibleRect.height);
+					//System.out.println(y1 + "... " + y2 + "; " + realY1 + ", " + visibleRect);
+
+					int j = y1;
+					while (j<=y2) {
+						int yEnd = Math.min(y2, j+getWidth());
+						int xEnd = yEnd-j;
+						g.drawLine(0,j, xEnd,yEnd);
+						j += 2;
+					}
+
+					int i = 2;
+					while (i<getWidth()) {
+						int yEnd = y1 + getWidth() - i;
+						g.drawLine(i,y1, getWidth(),yEnd);
+						i += 2;
+					}
+
+					if (realY1>=y && realY1<visibleRect.y+visibleRect.height) {
+						g.drawLine(0,realY1, getWidth(),realY1);
+					}
+					if (y2>=y && y2<visibleRect.y+visibleRect.height) {
+						g.drawLine(0,y2, getWidth(),y2);
+					}
+
+				}
+
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Never happens
+			}
+		}
+
+		// Paint icons
+		if (trackingIcons!=null) {
+			int lastLine = textArea.getLineCount() - 1;
+			for (int i=trackingIcons.size()-1; i>=0; i--) { // Last to first
+				GutterIconInfo ti = getTrackingIcon(i);
+				int offs = ti.getMarkedOffset();
+				if (offs>=0 && offs<=doc.getLength()) {
+					int line = root.getElementIndex(offs);
+					if (line<=lastLine && line>=topLine) {
+						try {
+							Icon icon = ti.getIcon();
+							if (icon!=null) {
+								int lineY = rsta.yForLine(line);
+								if (lineY>=y && lineY<=visibleRect.y+visibleRect.height) {
+									int y2 = lineY + (cellHeight-icon.getIconHeight())/2;
+									icon.paintIcon(this, g, 0, y2);
+									lastLine = line-1; // Paint only 1 icon per line
+								}
+							}
+						} catch (BadLocationException ble) {
+							ble.printStackTrace(); // Never happens
+						}
+					}
+					else if (line<topLine) {
+						break; // All other lines are above us, so quit now
+					}
+				}
+			}
+		}
+
+	}
+
+
+	/**
+	 * Paints icons when line wrapping is enabled.  Note that this does not
+	 * override the parent class's implementation to avoid this version being
+	 * called when line wrapping is disabled.
+	 */
+	private void paintComponentWrapped(Graphics g) {
+
+		// The variables we use are as follows:
+		// - visibleRect is the "visible" area of the text area; e.g.
+		// [0,100, 300,100+(lineCount*cellHeight)-1].
+		// actualTop.y is the topmost-pixel in the first logical line we
+		// paint.  Note that we may well not paint this part of the logical
+		// line, as it may be broken into many physical lines, with the first
+		// few physical lines scrolled past.  Note also that this is NOT the
+		// visible rect of this line number list; this line number list has
+		// visible rect == [0,0, insets.left-1,visibleRect.height-1].
+
+		// We avoid using modelToView/viewToModel where possible, as these
+		// methods trigger a parsing of the line into syntax tokens, which is
+		// costly.  It's cheaper to just grab the child views' bounds.
+
+		RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+//		boolean currentLineHighlighted = textArea.getHighlightCurrentLine();
+		Document doc = textArea.getDocument();
+		Element root = doc.getDefaultRootElement();
+		int topPosition = textArea.viewToModel(
+								new Point(visibleRect.x,visibleRect.y));
+		int topLine = root.getElementIndex(topPosition);
+
+		int topY = visibleRect.y;
+		int bottomY = visibleRect.y + visibleRect.height;
+		int cellHeight = textArea.getLineHeight();
+
+		// Paint icons
+		if (trackingIcons!=null) {
+			int lastLine = textArea.getLineCount() - 1;
+			for (int i=trackingIcons.size()-1; i>=0; i--) { // Last to first
+				GutterIconInfo ti = getTrackingIcon(i);
+				int offs = ti.getMarkedOffset();
+				if (offs>=0 && offs<=doc.getLength()) {
+					int line = root.getElementIndex(offs);
+					if (line<=lastLine && line>=topLine) {
+						try {
+							int lineY = rsta.yForLine(line);
+							if (lineY>=topY && lineY<bottomY) {
+								Icon icon = ti.getIcon();
+								if (icon!=null) {
+									int y2 = lineY + (cellHeight-icon.getIconHeight())/2;
+									ti.getIcon().paintIcon(this, g, 0, y2);
+									lastLine = line-1; // Paint only 1 icon per line
+								}
+							}
+						} catch (BadLocationException ble) {
+							ble.printStackTrace(); // Never happens
+						}
+					}
+					else if (line<topLine) {
+						break; // All other lines are above us, so quit now
+					}
+				}
+			}
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/LinkGenerator.java b/src/org/fife/ui/rsyntaxtextarea/LinkGenerator.java
new file mode 100644
index 0000000..2084025
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/LinkGenerator.java
@@ -0,0 +1,50 @@
+/*
+ * 02/16/2012
+ *
+ * Copyright (C) 2013 Robert Futrell
+ * robert_futrell at users.sourceforge.net
+ * http://fifesoft.com/rsyntaxtextarea
+ *
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * Generates hyperlinks in a document.  If one of these is installed on an
+ * <code>RSyntaxTextArea</code> it is queried when the mouse is moved and
+ * hyperlinks are enabled.  If the user is not hovering over a "real" hyperlink
+ * (e.g. "http://www.google.com"), the link generator is asked if a text region
+ * at the mouse position should be considered a hyperlink.  If so, a result
+ * object is returned, describing exactly what region of text is the link, and
+ * where it goes to.<p>
+ * 
+ * This interface is typically used by applications providing advanced support
+ * for programming languages, such as IDEs.  For example, an implementation of
+ * this class could identify the token under the mouse position as a "variable,"
+ * and the hyperlink returned would select the variable's declaration in the
+ * document.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface LinkGenerator {
+
+
+	/**
+	 * If a region of text under the mouse position should be considered a
+	 * hyperlink, a result object is returned.  This object describes what
+	 * region of text is the link, and what action to perform if the link is
+	 * clicked.
+	 *
+	 * @param textArea The text component.
+	 * @param offs The offset in the document under the mouse position.
+	 * @return The link information, or <code>null</code> if no link is at the
+	 *         specified offset.
+	 */
+	public LinkGeneratorResult isLinkAtOffset(RSyntaxTextArea textArea,
+			int offs);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/LinkGeneratorResult.java b/src/org/fife/ui/rsyntaxtextarea/LinkGeneratorResult.java
new file mode 100644
index 0000000..26aa793
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/LinkGeneratorResult.java
@@ -0,0 +1,53 @@
+/*
+ * 02/16/2012
+ *
+ * Copyright (C) 2013 Robert Futrell
+ * robert_futrell at users.sourceforge.net
+ * http://fifesoft.com/rsyntaxtextarea
+ *
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.event.HyperlinkEvent;
+
+
+/**
+ * A result object from a {@link LinkGenerator}.  Implementations of this class
+ * specify what action to execute when the user clicks on the "link" specified
+ * by the <code>LinkGenerator</code>.  Typically, this will do something like
+ * select another region of text in the document (the declaration of the
+ * variable at the mouse position), or open another file in the parent
+ * application, etc.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see SelectRegionLinkGeneratorResult
+ */
+public interface LinkGeneratorResult {
+
+
+	/**
+	 * Executes the action associated with this object.  If the result is a
+	 * URL to open, a standard hyperlink event can be returned.  Alternatively,
+	 * <code>null</code> can be returned and the action performed in this
+	 * method itself.
+	 *
+	 * @return The hyperlink event to broadcast from the text area, or
+	 *         <code>null</code> if the action's behavior occurs in this method
+	 *         directly.
+	 */
+	public HyperlinkEvent execute();
+
+
+	/**
+	 * Returns the starting offset of the link specified by the parent
+	 * <code>LinkGenerator</code>.
+	 *
+	 * @return The offset.
+	 */
+	public int getSourceOffset();
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/MarkOccurrencesHighlightPainter.java b/src/org/fife/ui/rsyntaxtextarea/MarkOccurrencesHighlightPainter.java
new file mode 100644
index 0000000..784823b
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/MarkOccurrencesHighlightPainter.java
@@ -0,0 +1,139 @@
+/*
+ * 10/01/2009
+ *
+ * MarkOccurrencesHighlightPainter.java - Renders "marked occurrences."
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+
+/**
+ * Highlight painter that renders "mark occurrences."
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+/*
+ * NOTE: This implementation is a "hack" so typing at the "end" of the highlight
+ * does not extend it to include the newly-typed chars, which is the standard
+ * behavior of Swing Highlights.
+ */
+class MarkOccurrencesHighlightPainter extends ChangeableColorHighlightPainter {
+
+	private Color borderColor;
+	private boolean paintBorder;
+
+
+	/**
+	 * Creates a highlight painter that defaults to blue.
+	 */
+	public MarkOccurrencesHighlightPainter() {
+		super(Color.BLUE);
+	}
+
+
+	/**
+	 * Returns whether a border is painted around marked occurrences.
+	 *
+	 * @return Whether a border is painted.
+	 * @see #setPaintBorder(boolean)
+	 * @see #getColor()
+	 */
+	public boolean getPaintBorder() {
+		return paintBorder;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Shape paintLayer(Graphics g, int p0, int p1, Shape viewBounds,
+								JTextComponent c, View view) {
+
+		g.setColor(getColor());
+		p1++; // Workaround for Java Highlight issues.
+
+		// This special case isn't needed for most standard Swing Views (which
+		// always return a width of 1 for modelToView() calls), but it is
+		// needed for RSTA views, which actually return the width of chars for
+		// modelToView calls.  But this should be faster anyway, as we
+		// short-circuit and do only one modelToView() for one offset.
+		if (p0==p1) {
+			try {
+				Shape s = view.modelToView(p0, viewBounds,
+											Position.Bias.Forward);
+				Rectangle r = s.getBounds();
+				g.drawLine(r.x, r.y, r.x, r.y+r.height);
+				return r;
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Never happens
+				return null;
+			}
+		}
+
+		if (p0 == view.getStartOffset() && p1 == view.getEndOffset()) {
+			// Contained in view, can just use bounds.
+			Rectangle alloc;
+			if (viewBounds instanceof Rectangle) {
+				alloc = (Rectangle) viewBounds;
+			} else {
+				alloc = viewBounds.getBounds();
+			}
+			g.fillRect(alloc.x, alloc.y, alloc.width, alloc.height);
+			return alloc;
+		}
+
+		// Should only render part of View.
+		try {
+			// --- determine locations ---
+			Shape shape = view.modelToView(p0, Position.Bias.Forward, p1,
+					Position.Bias.Backward, viewBounds);
+			Rectangle r = (shape instanceof Rectangle) ? (Rectangle) shape
+												: shape.getBounds();
+			g.fillRect(r.x, r.y, r.width, r.height);
+			if (paintBorder) {
+				g.setColor(borderColor);
+				g.drawRect(r.x,r.y, r.width-1,r.height-1);
+			}
+			return r;
+		} catch (BadLocationException e) { // Never happens
+			e.printStackTrace();
+			return null;
+		}
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setColor(Color c) {
+		super.setColor(c);
+		borderColor = c.darker();
+	}
+
+
+	/**
+	 * Toggles whether a border is painted around highlights.
+	 *
+	 * @param paint Whether to paint a border.
+	 * @see #getPaintBorder()
+	 * @see #setColor(Color)
+	 */
+	public void setPaintBorder(boolean paint) {
+		this.paintBorder = paint;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/MarkOccurrencesSupport.java b/src/org/fife/ui/rsyntaxtextarea/MarkOccurrencesSupport.java
new file mode 100644
index 0000000..a12e4ca
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/MarkOccurrencesSupport.java
@@ -0,0 +1,314 @@
+/*
+ * 01/06/2009
+ *
+ * MarkOccurrencesSupport.java - Handles marking all occurrences of the
+ * currently selected identifier in a text area.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import javax.swing.Timer;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+
+
+
+/**
+ * Marks all occurrences of the token at the current caret position, if it is
+ * an identifier.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see OccurrenceMarker
+ */
+class MarkOccurrencesSupport implements CaretListener, ActionListener {
+
+	private RSyntaxTextArea textArea;
+	private Timer timer;
+	private MarkOccurrencesHighlightPainter p;
+
+	/**
+	 * The default color used to mark occurrences.
+	 */
+	public static final Color DEFAULT_COLOR = new Color(224, 224, 224);
+
+	/**
+	 * The default delay.
+	 */
+	private static final int DEFAULT_DELAY_MS = 1000;
+
+
+	/**
+	 * Constructor.  Creates a listener with a 1 second delay.
+	 */
+	public MarkOccurrencesSupport() {
+		this(DEFAULT_DELAY_MS);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param delay The delay between when the caret last moves and when the
+	 *        text should be scanned for matching occurrences.  This should
+	 *        be in milliseconds.
+	 */
+	public MarkOccurrencesSupport(int delay) {
+		this(delay, DEFAULT_COLOR);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param delay The delay between when the caret last moves and when the
+	 *        text should be scanned for matching occurrences.  This should
+	 *        be in milliseconds.
+	 * @param color The color to use to mark the occurrences.  This cannot be
+	 *        <code>null</code>.
+	 */
+	public MarkOccurrencesSupport(int delay, Color color) {
+		timer = new Timer(delay, this);
+		timer.setRepeats(false);
+		p = new MarkOccurrencesHighlightPainter();
+		setColor(color);
+	}
+
+
+	/**
+	 * Called after the caret has been moved and a fixed time delay has
+	 * elapsed.  This locates and highlights all occurrences of the identifier
+	 * at the caret position, if any.
+	 *
+	 * @param e The event.
+	 */
+	public void actionPerformed(ActionEvent e) {
+
+		// Don't do anything if they are selecting text.
+		Caret c = textArea.getCaret();
+		if (c.getDot()!=c.getMark()) {
+			return;
+		}
+
+		RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+		OccurrenceMarker occurrenceMarker = doc.getOccurrenceMarker();
+		boolean occurrencesChanged = false;
+
+		if (occurrenceMarker!=null) {
+
+			doc.readLock();
+			try {
+
+				// Get the token at the caret position.
+				int line = textArea.getCaretLineNumber();
+				Token tokenList = textArea.getTokenListForLine(line);
+				int dot = c.getDot();
+				Token t = RSyntaxUtilities.getTokenAtOffset(tokenList, dot);
+				if (t==null /* EOL */ || !isValidType(t) || isNonWordChar(t)) {
+					// Try to the "left" of the caret.
+					dot--;
+					try {
+						if (dot>=textArea.getLineStartOffset(line)) {
+							t = RSyntaxUtilities.getTokenAtOffset(tokenList, dot);
+						}
+					} catch (BadLocationException ble) {
+						ble.printStackTrace(); // Never happens
+					}
+				}
+
+				if (t!=null && isValidType(t) && !isNonWordChar(t)) {
+					removeHighlights();
+					RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+							textArea.getHighlighter();
+					occurrenceMarker.markOccurrences(doc, t, h, p);
+					//textArea.repaint();
+					// TODO: Do a textArea.repaint() instead of repainting each
+					// marker as it's added if count is huge
+					occurrencesChanged = true;
+				}
+
+			} finally {
+				doc.readUnlock();
+				//time = System.currentTimeMillis() - time;
+				//System.out.println("MarkOccurrencesSupport took: " + time + " ms");
+			}
+
+		}
+
+		if (occurrencesChanged) {
+			textArea.fireMarkedOccurrencesChanged();
+		}
+
+	}
+
+
+	/**
+	 * Called when the caret moves in the text area.
+	 *
+	 * @param e The event.
+	 */
+	public void caretUpdate(CaretEvent e) {
+		timer.restart();
+	}
+
+
+	/**
+	 * Returns the color being used to mark occurrences.
+	 *
+	 * @return The color being used.
+	 * @see #setColor(Color)
+	 */
+	public Color getColor() {
+		return p.getColor();
+	}
+
+
+	/**
+	 * Returns the delay, in milliseconds.
+	 *
+	 * @return The delay.
+	 * @see #setDelay(int)
+	 */
+	public int getDelay() {
+		return timer.getDelay();
+	}
+
+
+	/**
+	 * Returns whether a border is painted around marked occurrences.
+	 *
+	 * @return Whether a border is painted.
+	 * @see #setPaintBorder(boolean)
+	 * @see #getColor()
+	 */
+	public boolean getPaintBorder() {
+		return p.getPaintBorder();
+	}
+
+
+	/**
+	 * Installs this listener on a text area.  If it is already installed on
+	 * another text area, it is uninstalled first.
+	 *
+	 * @param textArea The text area to install on.
+	 */
+	public void install(RSyntaxTextArea textArea) {
+		if (this.textArea!=null) {
+			uninstall();
+		}
+		this.textArea = textArea;
+		textArea.addCaretListener(this);
+		if (textArea.getMarkOccurrencesColor()!=null) {
+			setColor(textArea.getMarkOccurrencesColor());
+		}
+	}
+
+
+	/**
+	 * Returns whether the specified token is a single non-word char (e.g. not
+	 * in <tt>[A-Za-z]</tt>.  This is a HACK to work around the fact that many
+	 * standard token makers return things like semicolons and periods as
+	 * {@link Token#IDENTIFIER}s just to make the syntax highlighting coloring
+	 * look a little better.
+	 * 
+	 * @param t The token to check.  This cannot be <tt>null</tt>.
+	 * @return Whether the token is a single non-word char.
+	 */
+	private static final boolean isNonWordChar(Token t) {
+		return t.textCount==1 &&
+				!RSyntaxUtilities.isLetter(t.text[t.textOffset]);
+	}
+
+
+	/**
+	 * Returns whether the specified token is a type that we can do a
+	 * "mark occurrences" on.
+	 *
+	 * @param t The token.
+	 * @return Whether we should mark all occurrences of this token.
+	 */
+	private boolean isValidType(Token t) {
+		return textArea.getMarkOccurrencesOfTokenType(t.type);
+	}
+
+
+	/**
+	 * Removes all highlights added to the text area by this listener.
+	 */
+	private void removeHighlights() {
+		if (textArea!=null) {
+			RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+													textArea.getHighlighter();
+			h.clearMarkOccurrencesHighlights();
+		}
+	}
+
+
+	/**
+	 * Sets the color to use when marking occurrences.
+	 *
+	 * @param color The color to use.
+	 * @see #getColor()
+	 * @see #setPaintBorder(boolean)
+	 */
+	public void setColor(Color color) {
+		p.setColor(color);
+		if (textArea!=null) {
+			removeHighlights();
+			caretUpdate(null); // Force a highlight repaint.
+		}
+	}
+
+
+	/**
+	 * Sets the delay between the last caret position change and when the
+	 * text is scanned for matching identifiers.  A delay is needed to prevent
+	 * repeated scanning while the user is typing.
+	 *
+	 * @param delay The new delay.
+	 * @see #getDelay()
+	 */
+	public void setDelay(int delay) {
+		timer.setDelay(delay);
+	}
+
+
+	/**
+	 * Toggles whether a border is painted around marked highlights.
+	 *
+	 * @param paint Whether to paint a border.
+	 * @see #getPaintBorder()
+	 * @see #setColor(Color)
+	 */
+	public void setPaintBorder(boolean paint) {
+		if (paint!=p.getPaintBorder()) {
+			p.setPaintBorder(paint);
+			if (textArea!=null) {
+				textArea.repaint();
+			}
+		}
+	}
+
+
+	/**
+	 * Uninstalls this listener from the current text area.  Does nothing if
+	 * it not currently installed on any text area.
+	 *
+	 * @see #install(RSyntaxTextArea)
+	 */
+	public void uninstall() {
+		if (textArea!=null) {
+			removeHighlights();
+			textArea.removeCaretListener(this);
+		}
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/OccurrenceMarker.java b/src/org/fife/ui/rsyntaxtextarea/OccurrenceMarker.java
new file mode 100644
index 0000000..43ae8e7
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/OccurrenceMarker.java
@@ -0,0 +1,36 @@
+/*
+ * 03/09/2013
+ *
+ * OccurrenceMarker - Marks occurrences of the current token.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * An <code>OccurrenceMarker</code> is called when the caret stops moving after
+ * a short period.  If the current {@link TokenMaker} returns an instance of
+ * this class, it is told to mark all occurrences of the identifier at the
+ * caret position.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface OccurrenceMarker {
+
+
+	/**
+	 * Called when occurrences of a token should be marked.
+	 *
+	 * @param doc The document.
+	 * @param t The document whose relevant occurrences should be marked.
+	 * @param h The highlighter to add the highlights to.
+	 * @param p The painter for the highlights.
+	 */
+	public void markOccurrences(RSyntaxDocument doc, Token t,
+			RSyntaxTextAreaHighlighter h, MarkOccurrencesHighlightPainter p);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/ParserManager.java b/src/org/fife/ui/rsyntaxtextarea/ParserManager.java
new file mode 100644
index 0000000..9c619ce
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/ParserManager.java
@@ -0,0 +1,707 @@
+/*
+ * 09/26/2005
+ *
+ * ParserManager.java - Manages the parsing of an RSyntaxTextArea's document,
+ * if necessary.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.net.URL;
+import java.security.AccessControlException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import javax.swing.Timer;
+import javax.swing.ToolTipManager;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Element;
+import javax.swing.text.Position;
+
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+import org.fife.ui.rsyntaxtextarea.parser.ParseResult;
+import org.fife.ui.rsyntaxtextarea.parser.Parser;
+import org.fife.ui.rsyntaxtextarea.parser.ParserNotice;
+import org.fife.ui.rsyntaxtextarea.parser.ToolTipInfo;
+
+
+
+/**
+ * Manages running a parser object for an <code>RSyntaxTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+class ParserManager implements DocumentListener, ActionListener,
+								HyperlinkListener {
+
+	private RSyntaxTextArea textArea;
+	private List parsers;
+	private Timer timer;
+	private boolean running;
+	private Parser parserForTip;
+	private Position firstOffsetModded;
+	private Position lastOffsetModded;
+
+	/**
+	 * Mapping of notices to their highlights in the editor.  Can't use a Map
+	 * since parsers could return two <code>ParserNotice</code>s that compare
+	 * equally via <code>equals()</code>.  Real-world example:  The Perl
+	 * compiler will return 2+ identical error messages if the same error is
+	 * committed in a single line more than once.
+	 */
+	private List noticeHighlightPairs;
+
+	/**
+	 * Painter used to underline errors.
+	 */
+	private SquiggleUnderlineHighlightPainter parserErrorHighlightPainter =
+						new SquiggleUnderlineHighlightPainter(Color.RED);
+
+	/**
+	 * If this system property is set to <code>true</code>, debug messages
+	 * will be printed to stdout to help diagnose parsing issues.
+	 */
+	private static final String PROPERTY_DEBUG_PARSING = "rsta.debugParsing";
+
+	/**
+	 * Whether to print debug messages while running parsers.
+	 */
+	private static final boolean DEBUG_PARSING;
+
+	/**
+	 * The default delay between the last key press and when the document
+	 * is parsed, in milliseconds.
+	 */
+	private static final int DEFAULT_DELAY_MS		= 1250;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The text area whose document the parser will be
+	 *        parsing.
+	 */
+	public ParserManager(RSyntaxTextArea textArea) {
+		this(DEFAULT_DELAY_MS, textArea);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param delay The delay between the last key press and when the document
+	 *        is parsed.
+	 * @param textArea The text area whose document the parser will be
+	 *        parsing.
+	 */
+	public ParserManager(int delay, RSyntaxTextArea textArea) {
+		this.textArea = textArea;
+		textArea.getDocument().addDocumentListener(this);
+		parsers = new ArrayList(1); // Usually small
+		timer = new Timer(delay, this);
+		timer.setRepeats(false);
+		running = true;
+	}
+
+
+	/**
+	 * Called when the timer fires (e.g. it's time to parse the document).
+	 * 
+	 * @param e The event.
+	 */
+	public void actionPerformed(ActionEvent e) {
+
+		// Sanity check - should have >1 parser if event is fired.
+		int parserCount = getParserCount();
+		if (parserCount==0) {
+			return;
+		}
+
+		long begin = 0;
+		if (DEBUG_PARSING) {
+			begin = System.currentTimeMillis();
+		}
+
+		RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+
+		Element root = doc.getDefaultRootElement();
+		int firstLine = firstOffsetModded==null ? 0 : root.getElementIndex(firstOffsetModded.getOffset());
+		int lastLine = lastOffsetModded==null ? root.getElementCount()-1 : root.getElementIndex(lastOffsetModded.getOffset());
+		firstOffsetModded = lastOffsetModded = null;
+		if (DEBUG_PARSING) {
+			System.out.println("[DEBUG]: Minimum lines to parse: " + firstLine + "-" + lastLine);
+		}
+
+		String style = textArea.getSyntaxEditingStyle();
+		doc.readLock();
+		try {
+			for (int i=0; i<parserCount; i++) {
+				Parser parser = getParser(i);
+				if (parser.isEnabled()) {
+					ParseResult res = parser.parse(doc, style);
+					addParserNoticeHighlights(res);
+				}
+				else {
+					clearParserNoticeHighlights(parser);
+				}
+			}
+			textArea.fireParserNoticesChange();
+		} finally {
+			doc.readUnlock();
+		}
+
+		if (DEBUG_PARSING) {
+			float time = (System.currentTimeMillis()-begin)/1000f;
+			System.out.println("Total parsing time: " + time + " seconds");
+		}
+
+	}
+
+
+	/**
+	 * Adds a parser for the text area.
+	 *
+	 * @param parser The new parser.  If this is <code>null</code>, nothing
+	 *        happens.
+	 * @see #getParser(int)
+	 * @see #removeParser(Parser)
+	 */
+	public void addParser(Parser parser) {
+		if (parser!=null && !parsers.contains(parser)) {
+			if (running) {
+				timer.stop();
+			}
+			parsers.add(parser);
+			if (parsers.size()==1) {
+				// Okay to call more than once.
+				ToolTipManager.sharedInstance().registerComponent(textArea);
+			}
+			if (running) {
+				timer.restart();
+			}
+		}
+	}
+
+
+	/**
+	 * Adds highlights for a list of parser notices.  Any current notices
+	 * from the same Parser, in the same parsed range, are removed.
+	 *
+	 * @param res The result of a parsing.
+	 * @see #clearParserNoticeHighlights()
+	 */
+	private void addParserNoticeHighlights(ParseResult res) {
+
+		// Parsers are supposed to return at least empty ParseResults, but
+		// we'll be defensive here.
+		if (res==null) {
+			return;
+		}
+
+		if (DEBUG_PARSING) {
+			System.out.println("[DEBUG]: Adding parser notices from " +
+								res.getParser());
+		}
+
+		if (noticeHighlightPairs==null) {
+			noticeHighlightPairs = new ArrayList();
+		}
+
+		removeParserNotices(res);
+
+		List notices = res.getNotices();
+		if (notices.size()>0) { // Guaranteed non-null
+
+			RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+													textArea.getHighlighter();
+
+			for (Iterator i=notices.iterator(); i.hasNext(); ) {
+				ParserNotice notice = (ParserNotice)i.next();
+				if (DEBUG_PARSING) {
+					System.out.println("[DEBUG]: ... adding: " + notice);
+				}
+				try {
+					Object highlight = null;
+					if (notice.getShowInEditor()) {
+						highlight = h.addParserHighlight(notice,
+											parserErrorHighlightPainter);
+					}
+					noticeHighlightPairs.add(new NoticeHighlightPair(notice, highlight));
+				} catch (BadLocationException ble) { // Never happens
+					ble.printStackTrace();
+				}
+			}
+
+		}
+
+		if (DEBUG_PARSING) {
+			System.out.println("[DEBUG]: Done adding parser notices from " +
+								res.getParser());
+		}
+
+	}
+
+
+	/**
+	 * Called when the document is modified.
+	 *
+	 * @param e The document event.
+	 */
+	public void changedUpdate(DocumentEvent e) {
+	}
+
+
+	private void clearParserNoticeHighlights() {
+		RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+											textArea.getHighlighter();
+		if (h!=null) {
+			h.clearParserHighlights();
+		}
+		if (noticeHighlightPairs!=null) {
+			noticeHighlightPairs.clear();
+		}
+	}
+
+
+	/**
+	 * Removes all parser notice highlights for a specific parser.
+	 *
+	 * @param parser The parser whose highlights to remove.
+	 */
+	private void clearParserNoticeHighlights(Parser parser) {
+		RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+											textArea.getHighlighter();
+		if (h!=null) {
+			h.clearParserHighlights(parser);
+		}
+		if (noticeHighlightPairs!=null) {
+			for (Iterator i=noticeHighlightPairs.iterator(); i.hasNext(); ) {
+				NoticeHighlightPair pair = (NoticeHighlightPair)i.next();
+				if (pair.notice.getParser()==parser) {
+					i.remove();
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * Removes all parsers and any highlights they have created.
+	 *
+	 * @see #addParser(Parser)
+	 */
+	public void clearParsers() {
+		timer.stop();
+		clearParserNoticeHighlights();
+		parsers.clear();
+		textArea.fireParserNoticesChange();
+	}
+
+
+	/**
+	 * Forces the given {@link Parser} to re-parse the content of this text
+	 * area.<p>
+	 * 
+	 * This method can be useful when a <code>Parser</code> can be configured
+	 * as to what notices it returns.  For example, if a Java language parser
+	 * can be configured to set whether no serialVersionUID is a warning,
+	 * error, or ignored, this method can be called after changing the expected
+	 * notice type to have the document re-parsed.
+	 *
+	 * @param parser The index of the <code>Parser</code> to re-run.
+	 * @see #getParser(int)
+	 */
+	public void forceReparsing(int parser) {
+		Parser p = getParser(parser);
+		RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+		String style = textArea.getSyntaxEditingStyle();
+		doc.readLock();
+		try {
+			if (p.isEnabled()) {
+				ParseResult res = p.parse(doc, style);
+				addParserNoticeHighlights(res);
+			}
+			else {
+				clearParserNoticeHighlights(p);
+			}
+			textArea.fireParserNoticesChange();
+		} finally {
+			doc.readUnlock();
+		}
+	}
+
+
+	/**
+	 * Returns the delay between the last "concurrent" edit and when the
+	 * document is re-parsed.
+	 *
+	 * @return The delay, in milliseconds.
+	 * @see #setDelay(int)
+	 */
+	public int getDelay() {
+		return timer.getDelay();
+	}
+
+
+	/**
+	 * Returns the specified parser.
+	 *
+	 * @param index The index of the parser.
+	 * @return The parser.
+	 * @see #getParserCount()
+	 * @see #addParser(Parser)
+	 * @see #removeParser(Parser)
+	 */
+	public Parser getParser(int index) {
+		return (Parser)parsers.get(index);
+	}
+
+
+	/**
+	 * Returns the number of registered parsers.
+	 *
+	 * @return The number of registered parsers.
+	 */
+	public int getParserCount() {
+		return parsers.size();
+	}
+
+
+	/**
+	 * Returns a list of the current parser notices for this text area.
+	 * This method (like most Swing methods) should only be called on the
+	 * EDT.
+	 *
+	 * @return The list of notices.  This will be an empty list if there are
+	 *         none.
+	 */
+	public List getParserNotices() {
+		List notices = new ArrayList();
+		if (noticeHighlightPairs!=null) {
+			for (Iterator i=noticeHighlightPairs.iterator(); i.hasNext(); ) {
+				NoticeHighlightPair pair = (NoticeHighlightPair)i.next();
+				notices.add(pair.notice);
+			}
+		}
+		return notices;
+	}
+
+
+	/**
+	 * Returns the tool tip to display for a mouse event at the given
+	 * location.  This method is overridden to give a registered parser a
+	 * chance to display a tool tip (such as an error description when the
+	 * mouse is over an error highlight).
+	 *
+	 * @param e The mouse event.
+	 * @return The tool tip to display, and possibly a hyperlink event handler. 
+	 */
+	public ToolTipInfo getToolTipText(MouseEvent e) {
+
+		String tip = null;
+		HyperlinkListener listener = null;
+		parserForTip = null;
+
+//		try {
+			int pos = textArea.viewToModel(e.getPoint());
+			/*
+			Highlighter.Highlight[] highlights = textArea.getHighlighter().
+												getHighlights();
+			for (int i=0; i<highlights.length; i++) {
+				Highlighter.Highlight h = highlights[i];
+				//if (h instanceof ParserNoticeHighlight) {
+				//	ParserNoticeHighlight pnh = (ParserNoticeHighlight)h;
+					int start = h.getStartOffset();
+					int end = h.getEndOffset();
+					if (start<=pos && end>=pos) {
+						//return pnh.getMessage();
+						return textArea.getText(start, end-start);
+					}
+				//}
+			}
+			*/
+			if (noticeHighlightPairs!=null) {
+				for (int j=0; j<noticeHighlightPairs.size(); j++) {
+					NoticeHighlightPair pair =
+						(NoticeHighlightPair)noticeHighlightPairs.get(j);
+					ParserNotice notice = pair.notice;
+					if (notice.containsPosition(pos)) {
+						tip = notice.getToolTipText();
+						parserForTip = notice.getParser();
+						if (parserForTip instanceof HyperlinkListener) {
+							listener = (HyperlinkListener)parserForTip;
+						}
+						break;
+					}
+				}
+			}
+//		} catch (BadLocationException ble) {
+//			ble.printStackTrace();	// Should never happen.
+//		}
+
+		URL imageBase = parserForTip==null ? null : parserForTip.getImageBase();
+		return new ToolTipInfo(tip, listener, imageBase);
+
+	}
+
+
+	/**
+	 * Called when the document is modified.
+	 *
+	 * @param e The document event.
+	 */
+	public void handleDocumentEvent(DocumentEvent e) {
+		if (running && parsers.size()>0) {
+			timer.restart();
+		}
+	}
+
+
+	/**
+	 * Called when the user clicks a hyperlink in a {@link FocusableTip}.
+	 *
+	 * @param e The event.
+	 */
+	public void hyperlinkUpdate(HyperlinkEvent e) {
+		if (parserForTip!=null && parserForTip.getHyperlinkListener()!=null) {
+			parserForTip.getHyperlinkListener().linkClicked(textArea, e);
+		}
+	}
+
+
+	/**
+	 * Called when the document is modified.
+	 *
+	 * @param e The document event.
+	 */
+	public void insertUpdate(DocumentEvent e) {
+
+		// Keep track of the first and last offset modified.  Some parsers are
+		// smart and will only re-parse this section of the file.
+		try {
+			int offs = e.getOffset();
+			if (firstOffsetModded==null || offs<firstOffsetModded.getOffset()) {
+				firstOffsetModded = e.getDocument().createPosition(offs);
+			}
+			offs = e.getOffset() + e.getLength();
+			if (lastOffsetModded==null || offs>lastOffsetModded.getOffset()) {
+				lastOffsetModded = e.getDocument().createPosition(offs);
+			}
+		} catch (BadLocationException ble) {
+			ble.printStackTrace(); // Shouldn't happen
+		}
+
+		handleDocumentEvent(e);
+
+	}
+
+
+	/**
+	 * Removes a parser.
+	 *
+	 * @param parser The parser to remove.
+	 * @return Whether the parser was found.
+	 * @see #addParser(Parser)
+	 * @see #getParser(int)
+	 */
+	public boolean removeParser(Parser parser) {
+		removeParserNotices(parser);
+		boolean removed = parsers.remove(parser);
+		if (removed) {
+			textArea.fireParserNoticesChange();
+		}
+		return removed;
+	}
+
+
+	/**
+	 * Removes all parser notices (and clears highlights in the editor) from
+	 * a particular parser.
+	 *
+	 * @param parser The parser.
+	 */
+	private void removeParserNotices(Parser parser) {
+		if (noticeHighlightPairs!=null) {
+			RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+												textArea.getHighlighter();
+			for (Iterator i=noticeHighlightPairs.iterator(); i.hasNext(); ) {
+				NoticeHighlightPair pair = (NoticeHighlightPair)i.next();
+				if (pair.notice.getParser()==parser && pair.highlight!=null) {
+					h.removeParserHighlight(pair.highlight);
+					i.remove();
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * Removes any currently stored notices (and the corresponding highlights
+	 * from the editor) from the same Parser, and in the given line range,
+	 * as in the results.
+	 *
+	 * @param res The results.
+	 */
+	private void removeParserNotices(ParseResult res) {
+		if (noticeHighlightPairs!=null) {
+			RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+												textArea.getHighlighter();
+			for (Iterator i=noticeHighlightPairs.iterator(); i.hasNext(); ) {
+				NoticeHighlightPair pair = (NoticeHighlightPair)i.next();
+				boolean removed = false;
+				if (shouldRemoveNotice(pair.notice, res)) {
+					if (pair.highlight!=null) {
+						h.removeParserHighlight(pair.highlight);
+					}
+					i.remove();
+					removed = true;
+				}
+				if (DEBUG_PARSING) {
+					String text = removed ? "[DEBUG]: ... notice removed: " :
+											"[DEBUG]: ... notice not removed: ";
+					System.out.println(text + pair.notice);
+				}
+			}
+
+		}
+
+	}
+
+
+	/**
+	 * Called when the document is modified.
+	 *
+	 * @param e The document event.
+	 */
+	public void removeUpdate(DocumentEvent e) {
+
+		// Keep track of the first and last offset modified.  Some parsers are
+		// smart and will only re-parse this section of the file.  Note that
+		// for removals, only the line at the removal start needs to be
+		// re-parsed.
+		try {
+			int offs = e.getOffset();
+			if (firstOffsetModded==null || offs<firstOffsetModded.getOffset()) {
+				firstOffsetModded = e.getDocument().createPosition(offs);
+			}
+			if (lastOffsetModded==null || offs>lastOffsetModded.getOffset()) {
+				lastOffsetModded = e.getDocument().createPosition(offs);
+			}
+		} catch (BadLocationException ble) { // Never happens
+			ble.printStackTrace();
+		}
+
+		handleDocumentEvent(e);
+
+	}
+
+
+	/**
+	 * Restarts parsing the document.
+	 *
+	 * @see #stopParsing()
+	 */
+	public void restartParsing() {
+		timer.restart();
+		running = true;
+	}
+
+
+	/**
+	 * Sets the delay between the last "concurrent" edit and when the document
+	 * is re-parsed.
+	 *
+	 * @param millis The new delay, in milliseconds.  This must be greater
+	 *        than <code>0</code>.
+	 * @see #getDelay()
+	 */
+	public void setDelay(int millis) {
+		if (running) {
+			timer.stop();
+		}
+		timer.setDelay(millis);
+		if (running) {
+			timer.start();
+		}
+	}
+
+
+	/**
+	 * Returns whether a parser notice should be removed, based on a parse
+	 * result.
+	 *
+	 * @param notice The notice in question.
+	 * @param res The result.
+	 * @return Whether the notice should be removed.
+	 */
+	private final boolean shouldRemoveNotice(ParserNotice notice,
+											ParseResult res) {
+
+		if (DEBUG_PARSING) {
+			System.out.println("[DEBUG]: ... ... shouldRemoveNotice " +
+					notice + ": " + (notice.getParser()==res.getParser()));
+		}
+
+		// NOTE: We must currently remove all notices for the parser.  Parser
+		// implementors are required to parse the entire document each parsing
+		// request, as RSTA is not yet sophisticated enough to determine the
+		// minimum range of text to parse (and ParserNotices' locations aren't
+		// updated when the Document is mutated, which would be a requirement
+		// for this as well).
+		// return same_parser && (in_reparsed_range || in_deleted_end_of_doc)
+		return notice.getParser()==res.getParser();
+
+	}
+
+
+	/**
+	 * Stops parsing the document.
+	 *
+	 * @see #restartParsing()
+	 */
+	public void stopParsing() {
+		timer.stop();
+		running = false;
+	}
+
+
+	/**
+	 * Mapping of a parser notice to its highlight in the editor.
+	 */
+	private static class NoticeHighlightPair {
+
+		public ParserNotice notice;
+		public Object highlight;
+
+		public NoticeHighlightPair(ParserNotice notice, Object highlight) {
+			this.notice = notice;
+			this.highlight = highlight;
+		}
+
+	}
+
+
+	static {
+		boolean debugParsing = false;
+		try {
+			debugParsing = Boolean.getBoolean(PROPERTY_DEBUG_PARSING);
+		} catch (AccessControlException ace) {
+			// Likely an applet's security manager.
+			debugParsing = false; // FindBugs
+		}
+		DEBUG_PARSING = debugParsing;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/PopupWindowDecorator.java b/src/org/fife/ui/rsyntaxtextarea/PopupWindowDecorator.java
new file mode 100644
index 0000000..47697b5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/PopupWindowDecorator.java
@@ -0,0 +1,68 @@
+/*
+ * 01/11/2011
+ *
+ * PopupWindowDecorator.java - Hook allowing hosting applications to decorate
+ * JWindows created by the AutoComplete library.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.JWindow;
+
+
+/**
+ * A hook allowing hosting applications to decorate JWindows created by the
+ * AutoComplete library.  For example, you could use the
+ * <a href="http://jgoodies.com/">JGoodies</a> library to add drop shadows
+ * to the windows. 
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class PopupWindowDecorator {
+
+	/**
+	 * The singleton instance of this class.
+	 */
+	private static PopupWindowDecorator decorator;
+
+
+	/**
+	 * Callback called whenever an appropriate JWindow is created by the
+	 * AutoComplete library.  Implementations can decorate the window however
+	 * they see fit.
+	 *
+	 * @param window The newly-created window.
+	 */
+	public abstract void decorate(JWindow window);
+
+
+	/**
+	 * Returns the singleton instance of this class.  This should only be
+	 * called on the EDT.
+	 *
+	 * @return The singleton instance of this class, or <code>null</code>
+	 *         for none.
+	 * @see #set(PopupWindowDecorator)
+	 */
+	public static PopupWindowDecorator get() {
+		return decorator;
+	}
+
+
+	/**
+	 * Sets the singleton instance of this class.  This should only be called
+	 * on the EDT.
+	 *
+	 * @param decorator The new instance of this class.  This may be
+	 *        <code>null</code>.
+	 * @see #get()
+	 */
+	public static void set(PopupWindowDecorator decorator) {
+		PopupWindowDecorator.decorator = decorator;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSTAView.java b/src/org/fife/ui/rsyntaxtextarea/RSTAView.java
new file mode 100644
index 0000000..aeb9ed5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSTAView.java
@@ -0,0 +1,62 @@
+/*
+ * 02/10/2009
+ *
+ * RSTAView.java - An <code>RSyntaxTextArea</code> view.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Rectangle;
+
+import javax.swing.text.BadLocationException;
+
+
+/**
+ * Utility methods for RSyntaxTextArea's views.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+interface RSTAView {
+
+
+	/**
+	 * Returns the y-coordinate of the specified line.<p>
+	 *
+	 * This method is quicker than using traditional
+	 * <code>modelToView(int)</code> calls, as the entire bounding box isn't
+	 * computed.
+	 *
+	 * @param alloc The area the text area can render into.
+	 * @param line The line number.
+	 * @return The y-coordinate of the top of the line, or <code>-1</code> if
+	 *         this text area doesn't yet have a positive size or the line is
+	 *         hidden (i.e. from folding).
+	 * @throws BadLocationException If <code>line</code> isn't a valid line
+	 *         number for this document.
+	 */
+	public int yForLine(Rectangle alloc, int line) throws BadLocationException;
+
+
+	/**
+	 * Returns the y-coordinate of the line containing a specified offset.<p>
+	 *
+	 * This method is quicker than using traditional
+	 * <code>modelToView(int)</code> calls, as the entire bounding box isn't
+	 * computed.
+	 *
+	 * @param alloc The area the text area can render into.
+	 * @param offs The offset info the document.
+	 * @return The y-coordinate of the top of the offset, or <code>-1</code> if
+	 *         this text area doesn't yet have a positive size or the line is
+	 *         hidden (i.e. from folding).
+	 * @throws BadLocationException If <code>offs</code> isn't a valid offset
+	 *         into the document.
+	 */
+	public int yForLineContaining(Rectangle alloc, int offs)
+											throws BadLocationException;
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSyntaxDocument.java b/src/org/fife/ui/rsyntaxtextarea/RSyntaxDocument.java
new file mode 100644
index 0000000..f8d9062
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSyntaxDocument.java
@@ -0,0 +1,589 @@
+/*
+ * 10/16/2004
+ *
+ * RSyntaxDocument.java - A document capable of syntax highlighting, used by
+ * RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.event.ActionEvent;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import javax.swing.Action;
+import javax.swing.event.*;
+import javax.swing.text.*;
+
+import org.fife.ui.rsyntaxtextarea.modes.AbstractMarkupTokenMaker;
+import org.fife.ui.rtextarea.RDocument;
+import org.fife.util.DynamicIntArray;
+
+
+/**
+ * The document used by {@link org.fife.ui.rsyntaxtextarea.RSyntaxTextArea}.
+ * This document is like <code>javax.swing.text.PlainDocument</code> except that
+ * it also keeps track of syntax highlighting in the document.  It has a "style"
+ * attribute associated with it that determines how syntax highlighting is done
+ * (i.e., what language is being highlighted).<p>
+ *
+ * Instances of <code>RSyntaxTextArea</code> will only accept instances of
+ * <code>RSyntaxDocument</code>, since it is this document that keeps
+ * track of syntax highlighting.  All others will cause an exception to be
+ * thrown.<p>
+ *
+ * To change the language being syntax highlighted at any time, you merely have
+ * to call {@link #setSyntaxStyle}.  Other than that, this document can be
+ * treated like any other save one caveat:  all <code>DocumentEvent</code>s of
+ * type <code>CHANGE</code> use their offset and length values to represent the
+ * first and last lines, respectively, that have had their syntax coloring
+ * change.  This is really a hack to increase the speed of the painting code
+ * and should really be corrected, but oh well. 
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class RSyntaxDocument extends RDocument implements SyntaxConstants {
+
+	/**
+	 * Creates a {@link TokenMaker} appropriate for a given programming
+	 * language.
+	 */
+	private transient TokenMakerFactory tokenMakerFactory;
+
+	/**
+	 * Splits text into tokens for the current programming language.
+	 */
+	private transient TokenMaker tokenMaker;
+
+	/**
+	 * The current syntax style.  Only cached to keep this class serializable.
+	 */
+	private String syntaxStyle;
+
+	/**
+	 * Array of values representing the "last token type" on each line.  This
+	 * is used in cases such as multi-line comments:  if the previous line
+	 * ended with an (unclosed) multi-line comment, we can use this knowledge
+	 * and start the current line's syntax highlighting in multi-line comment
+	 * state.
+	 */
+	protected transient DynamicIntArray lastTokensOnLines;
+
+	private transient Segment s;
+
+
+	/**
+	 * Constructs a plain text document.  A default root element is created,
+	 * and the tab size set to 5.
+	 *
+	 * @param syntaxStyle The syntax highlighting scheme to use.
+	 */
+	public RSyntaxDocument(String syntaxStyle) {
+		this(null, syntaxStyle);
+	}
+
+
+	/**
+	 * Constructs a plain text document.  A default root element is created,
+	 * and the tab size set to 5.
+	 *
+	 * @param tmf The <code>TokenMakerFactory</code> for this document.  If
+	 *        this is <code>null</code>, a default factory is used.
+	 * @param syntaxStyle The syntax highlighting scheme to use.
+	 */
+	public RSyntaxDocument(TokenMakerFactory tmf, String syntaxStyle) {
+		putProperty(tabSizeAttribute, new Integer(5));
+		lastTokensOnLines = new DynamicIntArray(400);
+		lastTokensOnLines.add(Token.NULL); // Initial (empty) line.
+		s = new Segment();
+		setTokenMakerFactory(tmf);
+		setSyntaxStyle(syntaxStyle);
+	}
+
+
+	/**
+	 * Alerts all listeners to this document of an insertion.  This is
+	 * overridden so we can update our syntax highlighting stuff.<p>
+	 * The syntax highlighting stuff has to be here instead of in
+	 * <code>insertUpdate</code> because <code>insertUpdate</code> is not
+	 * called by the undo/redo actions, but this method is.
+	 *
+	 * @param e The change.
+	 */
+	protected void fireInsertUpdate(DocumentEvent e) {
+
+		/*
+		 * Now that the text is actually inserted into the content and
+		 * element structure, we can update our token elements and "last
+		 * tokens on lines" structure.
+		 */
+
+		Element lineMap = getDefaultRootElement();
+		DocumentEvent.ElementChange change = e.getChange(lineMap);
+		Element[] added = change==null ? null : change.getChildrenAdded();
+
+		int numLines = lineMap.getElementCount();
+		int line = lineMap.getElementIndex(e.getOffset());
+		int previousLine = line - 1;
+		int previousTokenType = (previousLine>-1 ?
+					lastTokensOnLines.get(previousLine) : Token.NULL);
+
+		// If entire lines were added...
+		if (added!=null && added.length>0) {
+
+			Element[] removed = change.getChildrenRemoved();
+			int numRemoved = removed!=null ? removed.length : 0;
+
+			int endBefore = line + added.length - numRemoved;
+			//System.err.println("... adding lines: " + line + " - " + (endBefore-1));
+			//System.err.println("... ... added: " + added.length + ", removed:" + numRemoved);
+			for (int i=line; i<endBefore; i++) {
+
+				setSharedSegment(i); // Loads line i's text into s.
+
+				int tokenType = tokenMaker.getLastTokenTypeOnLine(s, previousTokenType);
+				lastTokensOnLines.add(i, tokenType);
+				//System.err.println("--------- lastTokensOnLines.size() == " + lastTokensOnLines.getSize());
+
+				previousTokenType = tokenType;
+
+			} // End of for (int i=line; i<endBefore; i++).
+
+			// Update last tokens for lines below until they stop changing.
+			updateLastTokensBelow(endBefore, numLines, previousTokenType);
+
+		} // End of if (added!=null && added.length>0).
+
+		// Otherwise, text was inserted on a single line...
+		else {
+
+			// Update last tokens for lines below until they stop changing.
+			updateLastTokensBelow(line, numLines, previousTokenType);
+
+		} // End of else.
+
+		// Let all listeners know about the insertion.
+		super.fireInsertUpdate(e);
+
+	}
+
+
+	/**
+	 * This method is called AFTER the content has been inserted into the
+	 * document and the element structure has been updated.<p>
+	 * The syntax-highlighting updates need to be done here (as opposed to
+	 * an override of <code>postRemoveUpdate</code>) as this method is called
+	 * in response to undo/redo events, whereas <code>postRemoveUpdate</code>
+	 * is not.<p>
+	 * Now that the text is actually inserted into the content and element
+	 * structure, we can update our token elements and "last tokens on
+	 * lines" structure.
+	 *
+	 * @param chng The change that occurred.
+	 * @see #removeUpdate
+	 */
+	protected void fireRemoveUpdate(DocumentEvent chng) {
+
+		Element lineMap = getDefaultRootElement();
+		int numLines = lineMap.getElementCount();
+
+		DocumentEvent.ElementChange change = chng.getChange(lineMap);
+		Element[] removed = change==null ? null : change.getChildrenRemoved();
+
+		// If entire lines were removed...
+		if (removed!=null && removed.length>0) {
+
+			int line = change.getIndex();	// First line entirely removed.
+			int previousLine = line - 1;	// Line before that.
+			int previousTokenType = (previousLine>-1 ?
+					lastTokensOnLines.get(previousLine) : Token.NULL);
+
+			Element[] added = change.getChildrenAdded();
+			int numAdded = added==null ? 0 : added.length;
+
+			// Remove the cached last-token values for the removed lines.
+			int endBefore = line + removed.length - numAdded;
+			//System.err.println("... removing lines: " + line + " - " + (endBefore-1));
+			//System.err.println("... added: " + numAdded + ", removed: " + removed.length);
+
+			lastTokensOnLines.removeRange(line, endBefore); // Removing values for lines [line-(endBefore-1)].
+			//System.err.println("--------- lastTokensOnLines.size() == " + lastTokensOnLines.getSize());
+
+			// Update last tokens for lines below until they've stopped changing.
+			updateLastTokensBelow(line, numLines, previousTokenType);
+
+		} // End of if (removed!=null && removed.size()>0).
+
+		// Otherwise, text was removed from just one line...
+		else {
+
+			int line = lineMap.getElementIndex(chng.getOffset());
+			if (line>=lastTokensOnLines.getSize())
+				return;	// If we're editing the last line in a document...
+
+			int previousLine = line - 1;
+			int previousTokenType = (previousLine>-1 ?
+					lastTokensOnLines.get(previousLine) : Token.NULL);
+			//System.err.println("previousTokenType for line : " + previousLine + " is " + previousTokenType);
+			// Update last tokens for lines below until they've stopped changing.
+			updateLastTokensBelow(line, numLines, previousTokenType);
+
+		}
+
+		// Let all of our listeners know about the removal.
+		super.fireRemoveUpdate(chng);
+
+	}
+
+
+	/**
+	 * Returns the closest {@link TokenTypes "standard" token type} for a given
+	 * "internal" token type (e.g. one whose value is <code>< 0</code>).
+	 *
+	 * @param type The token type.
+	 * @return The closest "standard" token type.  If a mapping is not defined
+	 *         for this language, then <code>type</code> is returned.
+	 */
+	public int getClosestStandardTokenTypeForInternalType(int type) {
+		return tokenMaker.getClosestStandardTokenTypeForInternalType(type);
+	}
+
+
+	/**
+	 * Returns whether closing markup tags should be automatically completed.
+	 * This method only returns <code>true</code> if
+	 * {@link #getLanguageIsMarkup()} also returns <code>true</code>.
+	 *
+	 * @return Whether markup closing tags should be automatically completed.
+	 * @see #getLanguageIsMarkup()
+	 */
+	public boolean getCompleteMarkupCloseTags() {
+		// TODO: Remove terrible dependency on AbstractMarkupTokenMaker
+		return getLanguageIsMarkup() &&
+				((AbstractMarkupTokenMaker)tokenMaker).getCompleteCloseTags();
+	}
+
+
+	/**
+	 * Returns whether the current programming language uses curly braces
+	 * ('<tt>{</tt>' and '<tt>}</tt>') to denote code blocks.
+	 *
+	 * @return Whether curly braces denote code blocks.
+	 */
+	public boolean getCurlyBracesDenoteCodeBlocks() {
+		return tokenMaker.getCurlyBracesDenoteCodeBlocks();
+	}
+
+
+	/**
+	 * Returns whether the current language is a markup language, such as
+	 * HTML, XML or PHP.
+	 *
+	 * @return Whether the current language is a markup language.
+	 */
+	public boolean getLanguageIsMarkup() {
+		return tokenMaker.isMarkupLanguage();
+	}
+
+
+	/**
+	 * Returns the token type of the last token on the given line.
+	 *
+	 * @param line The line to inspect.
+	 * @return The token type of the last token on the specified line.  If
+	 *         the line is invalid, an exception is thrown.
+	 */
+	public int getLastTokenTypeOnLine(int line) {
+		return lastTokensOnLines.get(line);
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in the current programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.  A <code>null</code> value for either means there
+	 *         is no string to add for that part.  A value of
+	 *         <code>null</code> for the array means this language
+	 *         does not support commenting/uncommenting lines.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return tokenMaker.getLineCommentStartAndEnd();
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	boolean getMarkOccurrencesOfTokenType(int type) {
+		return tokenMaker.getMarkOccurrencesOfTokenType(type);
+	}
+
+
+	/**
+	 * Returns the occurrence marker for the current language.
+	 *
+	 * @return The occurrence marker.
+	 */
+	OccurrenceMarker getOccurrenceMarker() {
+		return tokenMaker.getOccurrenceMarker();
+	}
+
+
+	/**
+	 * This method returns whether auto indentation should be done if Enter
+	 * is pressed at the end of the specified line.
+	 *
+	 * @param line The line to check.
+	 * @return Whether an extra indentation should be done.
+	 */
+	public boolean getShouldIndentNextLine(int line) {
+		Token t = getTokenListForLine(line);
+		t = t.getLastNonCommentNonWhitespaceToken();
+		return tokenMaker.getShouldIndentNextLineAfter(t);
+	}
+
+
+	/**
+	 * Returns a token list for the specified segment of text representing
+	 * the specified line number.  This method is basically a wrapper for
+	 * <code>tokenMaker.getTokenList</code> that takes into account the last
+	 * token on the previous line to assure token accuracy.
+	 *
+	 * @param line The line number of <code>text</code> in the document, >= 0.
+	 * @return A token list representing the specified line.
+	 */
+	public final Token getTokenListForLine(int line) {
+		Element map = getDefaultRootElement();
+		Element elem = map.getElement(line);
+		int startOffset = elem.getStartOffset();
+		//int endOffset = (line==map.getElementCount()-1 ? elem.getEndOffset() - 1:
+		//									elem.getEndOffset() - 1);
+		int endOffset = elem.getEndOffset() - 1; // Why always "-1"?
+		try {
+			getText(startOffset,endOffset-startOffset, s);
+		} catch (BadLocationException ble) {
+			ble.printStackTrace();
+			return null;
+		}
+		int initialTokenType = line==0 ? Token.NULL :
+								getLastTokenTypeOnLine(line-1);
+		return tokenMaker.getTokenList(s, initialTokenType, startOffset);
+	}
+
+
+	boolean insertBreakSpecialHandling(ActionEvent e) {
+		Action a = tokenMaker.getInsertBreakAction();
+		if (a!=null) {
+			a.actionPerformed(e);
+			return true;
+		}
+		return false;
+	}
+
+
+	/**
+	 * Deserializes a document.
+	 *
+	 * @param in The stream to read from.
+	 * @throws ClassNotFoundException
+	 * @throws IOException
+	 */
+	private void readObject(ObjectInputStream in)
+						throws ClassNotFoundException, IOException {
+
+		in.defaultReadObject();
+
+		// Install default TokenMakerFactory.  To support custom TokenMakers,
+		// both JVM's should install default TokenMakerFactories that support
+		// the language they want to use beforehand.
+		setTokenMakerFactory(null);
+
+		// Handle other transient stuff
+		this.s = new Segment();
+		int lineCount = getDefaultRootElement().getElementCount();
+		lastTokensOnLines = new DynamicIntArray(lineCount);
+		setSyntaxStyle(syntaxStyle); // Actually install (transient) TokenMaker
+
+	}
+
+
+	/**
+	 * Makes our private <code>Segment s</code> point to the text in our
+	 * document referenced by the specified element.  Note that
+	 * <code>line</code> MUST be a valid line number in the document.
+	 *
+	 * @param line The line number you want to get.
+	 */
+	private final void setSharedSegment(int line) {
+
+		Element map = getDefaultRootElement();
+		//int numLines = map.getElementCount();
+
+		Element element = map.getElement(line);
+		if (element==null)
+			throw new InternalError("Invalid line number: " + line);
+		int startOffset = element.getStartOffset();
+		//int endOffset = (line==numLines-1 ?
+		//			element.getEndOffset()-1 : element.getEndOffset() - 1);
+		int endOffset = element.getEndOffset()-1; // Why always "-1"?
+		try {
+			getText(startOffset, endOffset-startOffset, s);
+		} catch (BadLocationException ble) {
+			throw new InternalError("Text range not in document: " +
+								startOffset + "-" + endOffset);
+		}
+
+	}
+
+
+	/**
+	 * Sets the syntax style being used for syntax highlighting in this
+	 * document.  What styles are supported by a document is determined by its
+	 * {@link TokenMakerFactory}.  By default, all <code>RSyntaxDocument</code>s
+	 * support all languages built into <code>RSyntaxTextArea</code>. 
+	 *
+	 * @param styleKey The new style to use, such as
+	 *        {@link SyntaxConstants#SYNTAX_STYLE_JAVA}.  If this style is not
+	 *        known or supported by this document, then
+	 *        {@link SyntaxConstants#SYNTAX_STYLE_NONE} is used.
+	 * @see #setSyntaxStyle(TokenMaker)
+	 */
+	public void setSyntaxStyle(String styleKey) {
+		tokenMaker = tokenMakerFactory.getTokenMaker(styleKey);
+		updateSyntaxHighlightingInformation();
+		this.syntaxStyle = styleKey;
+	}
+
+
+	/**
+	 * Sets the syntax style being used for syntax highlighting in this
+	 * document.  You should call this method if you've created a custom token
+	 * maker for a language not normally supported by
+	 * <code>RSyntaxTextArea</code>.
+	 *
+	 * @param tokenMaker The new token maker to use.
+	 * @see #setSyntaxStyle(String)
+	 */
+	public void setSyntaxStyle(TokenMaker tokenMaker) {
+		this.tokenMaker = tokenMaker;
+		updateSyntaxHighlightingInformation();
+	}
+
+
+	/**
+	 * Sets the token maker factory used by this document.
+	 *
+	 * @param tmf The <code>TokenMakerFactory</code> for this document.  If
+	 *        this is <code>null</code>, a default factory is used.
+	 */
+	public void setTokenMakerFactory(TokenMakerFactory tmf) {
+		tokenMakerFactory = tmf!=null ? tmf :
+			TokenMakerFactory.getDefaultInstance();
+	}
+
+
+	/**
+	 * Loops through the last-tokens-on-lines array from a specified point
+	 * onward, updating last-token values until they stop changing.  This
+	 * should be called when lines are updated/inserted/removed, as doing
+	 * so may cause lines below to change color.
+	 *
+	 * @param line The first line to check for a change in last-token value.
+	 * @param numLines The number of lines in the document.
+	 * @param previousTokenType The last-token value of the line just before
+	 *        <code>line</code>.
+	 * @return The last line that needs repainting.
+	 */
+	private int updateLastTokensBelow(int line, int numLines, int previousTokenType) {
+
+		int firstLine = line;
+
+		// Loop through all lines past our starting point.  Update even the last
+		// line's info, even though there aren't any lines after it that depend
+		// on it changing for them to be changed, as its state may be used
+		// elsewhere in the library.
+		int end = numLines;
+		//System.err.println("--- end==" + end + " (numLines==" + numLines + ")");
+		while (line<end) {
+
+			setSharedSegment(line); // Sets s's text to that of line 'line' in the document.
+
+			int oldTokenType = lastTokensOnLines.get(line);
+			int newTokenType = tokenMaker.getLastTokenTypeOnLine(s, previousTokenType);
+			//System.err.println("---------------- line " + line + "; oldTokenType==" + oldTokenType + ", newTokenType==" + newTokenType + ", s=='" + s + "'");
+
+			// If this line's end-token value didn't change, stop here.  Note
+			// that we're saying this line needs repainting; this is because
+			// the beginning of this line did indeed change color, but the
+			// end didn't.
+			if (oldTokenType==newTokenType) {
+				//System.err.println("... ... ... repainting lines " + firstLine + "-" + line);
+				fireChangedUpdate(new DefaultDocumentEvent(firstLine, line, DocumentEvent.EventType.CHANGE));
+				return line;
+			}
+
+			// If the line's end-token value did change, update it and
+			// keep going.
+			// NOTE: "setUnsafe" is okay here as the bounds checking was
+			// already done in lastTokensOnLines.get(line) above.
+			lastTokensOnLines.setUnsafe(line, newTokenType);
+			previousTokenType = newTokenType;
+			line++;
+
+		} // End of while (line<numLines).
+
+		// If any lines had their token types changed, fire a changed update
+		// for them.  The view will repaint the area covered by the lines.
+		// FIXME:  We currently cheat and send the line range that needs to be
+		// repainted as the "offset and length" of the change, since this is
+		// what the view needs.  We really should send the actual offset and
+		// length.
+		if (line>firstLine) {
+			//System.err.println("... ... ... repainting lines " + firstLine + "-" + line);
+			fireChangedUpdate(new DefaultDocumentEvent(firstLine, line,
+								DocumentEvent.EventType.CHANGE));
+		}
+
+		return line;
+
+	}
+
+
+	/**
+	 * Updates internal state information; e.g. the "last tokens on lines"
+	 * data.  After this, a changed update is fired to let listeners know that
+	 * the document's structure has changed.<p>
+	 *
+	 * This is called internally whenever the syntax style changes.
+	 */
+	protected void updateSyntaxHighlightingInformation() {
+
+		// Reinitialize the "last token on each line" array.  Note that since
+		// the actual text in the document isn't changing, the number of lines
+		// is the same.
+		Element map = getDefaultRootElement();
+		int numLines = map.getElementCount();
+		int lastTokenType = Token.NULL;
+		for (int i=0; i<numLines; i++) {
+			setSharedSegment(i);
+			lastTokenType = tokenMaker.getLastTokenTypeOnLine(s, lastTokenType);
+			lastTokensOnLines.set(i, lastTokenType);
+		}
+
+		// Let everybody know that syntax styles have (probably) changed.
+		fireChangedUpdate(new DefaultDocumentEvent(
+						0, numLines-1, DocumentEvent.EventType.CHANGE));
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.java b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.java
new file mode 100644
index 0000000..3b6383a
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.java
@@ -0,0 +1,3018 @@
+/*
+ * 01/27/2004
+ *
+ * RSyntaxTextArea.java - An extension of RTextArea that adds
+ * the ability to syntax highlight certain programming languages.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.InputEvent;
+import java.awt.event.MouseEvent;
+import java.awt.font.FontRenderContext;
+import java.io.File;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.ResourceBundle;
+import javax.swing.JLabel;
+import javax.swing.JMenu;
+import javax.swing.JPopupMenu;
+import javax.swing.Timer;
+import javax.swing.UIManager;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.EventListenerList;
+import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Highlighter;
+
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+import org.fife.ui.rsyntaxtextarea.parser.Parser;
+import org.fife.ui.rsyntaxtextarea.parser.ToolTipInfo;
+import org.fife.ui.rtextarea.Gutter;
+import org.fife.ui.rtextarea.RTextArea;
+import org.fife.ui.rtextarea.RTextAreaUI;
+import org.fife.ui.rtextarea.RTextScrollPane;
+import org.fife.ui.rtextarea.RecordableTextAction;
+
+
+
+/**
+ * An extension of <code>RTextArea</code> that adds syntax highlighting
+ * of certain programming languages to its list of features.  Languages
+ * currently supported include:
+ *
+ * <table>
+ *  <tr>
+ *   <td style="vertical-align: top">
+ *    <ul>
+ *       <li>ActionScript
+ *       <li>Assembler (X86)
+ *       <li>BBCode
+ *       <li>C
+ *       <li>C++
+ *       <li>CSS
+ *       <li>C#
+ *       <li>Clojure
+ *       <li>Delphi
+ *       <li>DTD
+ *       <li>Fortran
+ *       <li>Groovy
+ *       <li>HTML
+ *       <li>Java
+ *       <li>JavaScript
+ *       <li>JSP
+ *    </ul>
+ *   </td>
+ *   <td style="vertical-align: top">
+ *    <ul>
+ *       <li>LaTeX
+ *       <li>Lisp
+ *       <li>Lua
+ *       <li>Make
+ *       <li>MXML
+ *       <li>NSIS
+ *       <li>Perl
+ *       <li>PHP
+ *       <li>Ruby
+ *       <li>SAS
+ *       <li>Scala
+ *       <li>SQL
+ *       <li>Tcl
+ *       <li>UNIX shell scripts
+ *       <li>Windows batch
+ *       <li>XML files
+ *    </ul>
+ *   </td>
+ *  </tr>
+ * </table>
+ *
+ * Other added features include:
+ * <ul style="columns: 2 12em; column-gap: 1em">
+ *    <li>Code folding
+ *    <li>Bracket matching
+ *    <li>Auto-indentation
+ *    <li>Copy as RTF
+ *    <li>Clickable hyperlinks (if the language scanner being used supports it)
+ *    <li>A pluggable "parser" system that can be used to implement syntax
+ *        validation, spell checking, etc.
+ * </ul>
+ *
+ * It is recommended that you use an instance of
+ * {@link org.fife.ui.rtextarea.RTextScrollPane} instead of a regular
+ * <code>JScrollPane</code> as this class allows you to add line numbers and
+ * bookmarks easily to your text area.
+ *
+ * @author Robert Futrell
+ * @version 2.0.7
+ * @see TextEditorPane
+ */
+public class RSyntaxTextArea extends RTextArea implements SyntaxConstants {
+
+	public static final String ANIMATE_BRACKET_MATCHING_PROPERTY		= "RSTA.animateBracketMatching";
+	public static final String ANTIALIAS_PROPERTY						= "RSTA.antiAlias";
+	public static final String AUTO_INDENT_PROPERTY						= "RSTA.autoIndent";
+	public static final String BRACKET_MATCHING_PROPERTY				= "RSTA.bracketMatching";
+	public static final String CLEAR_WHITESPACE_LINES_PROPERTY			= "RSTA.clearWhitespaceLines";
+	public static final String CLOSE_CURLY_BRACES_PROPERTY				= "RSTA.closeCurlyBraces";
+	public static final String CLOSE_MARKUP_TAGS_PROPERTY				= "RSTA.closeMarkupTags";
+	public static final String CODE_FOLDING_PROPERTY					= "RSTA.codeFolding";
+	public static final String EOL_VISIBLE_PROPERTY						= "RSTA.eolMarkersVisible";
+	public static final String FOCUSABLE_TIPS_PROPERTY					= "RSTA.focusableTips";
+	public static final String FRACTIONAL_FONTMETRICS_PROPERTY			= "RSTA.fractionalFontMetrics";
+	public static final String HIGHLIGHT_SECONDARY_LANGUAGES_PROPERTY	= "RSTA.highlightSecondaryLanguages";
+	public static final String HYPERLINKS_ENABLED_PROPERTY				= "RSTA.hyperlinksEnabled";
+	public static final String MARK_OCCURRENCES_PROPERTY				= "RSTA.markOccurrences";
+	public static final String MARKED_OCCURRENCES_CHANGED_PROPERTY		= "RSTA.markedOccurrencesChanged";
+	public static final String PAINT_MATCHED_BRACKET_PAIR_PROPERTY		= "RSTA.paintMatchedBracketPair";
+	public static final String PARSER_NOTICES_PROPERTY					= "RSTA.parserNotices";
+	public static final String SYNTAX_SCHEME_PROPERTY					= "RSTA.syntaxScheme";
+	public static final String SYNTAX_STYLE_PROPERTY					= "RSTA.syntaxStyle";
+	public static final String TAB_LINE_COLOR_PROPERTY					= "RSTA.tabLineColor";
+	public static final String TAB_LINES_PROPERTY						= "RSTA.tabLines";
+	public static final String USE_SELECTED_TEXT_COLOR_PROPERTY			= "RSTA.useSelectedTextColor";
+	public static final String VISIBLE_WHITESPACE_PROPERTY				= "RSTA.visibleWhitespace";
+
+	private static final Color DEFAULT_BRACKET_MATCH_BG_COLOR		= new Color(234,234,255);
+	private static final Color DEFAULT_BRACKET_MATCH_BORDER_COLOR	= new Color(0,0,128);
+	private static final Color DEFAULT_SELECTION_COLOR			= new Color(200,200,255);
+
+	private static final String MSG	= "org.fife.ui.rsyntaxtextarea.RSyntaxTextArea";
+
+	private JMenu foldingMenu;
+	private static RecordableTextAction toggleCurrentFoldAction;
+	private static RecordableTextAction collapseAllCommentFoldsAction;
+	private static RecordableTextAction collapseAllFoldsAction;
+	private static RecordableTextAction expandAllFoldsAction;
+
+	/** The key for the syntax style to be highlighting. */
+	private String syntaxStyleKey;
+
+	/** The colors used for syntax highlighting. */
+	private SyntaxScheme syntaxScheme;
+
+	/** Handles code templates. */
+	private static CodeTemplateManager codeTemplateManager;
+
+	/** Whether or not templates are enabled. */
+	private static boolean templatesEnabled;
+
+	/**
+	 * The rectangle surrounding the "matched bracket" if bracket matching
+	 * is enabled.
+	 */
+	private Rectangle match;
+
+	/**
+	 * The rectangle surrounding the current offset if both bracket matching and
+	 * "match both brackets" are enabled.
+	 */
+	private Rectangle dotRect;
+
+	/**
+	 * Used to store the location of the bracket at the caret position (either
+	 * just before or just after it) and the location of its match.
+	 */
+	private Point bracketInfo;
+
+	/**
+	 * Colors used for the "matched bracket" if bracket matching is enabled.
+	 */
+	private Color matchedBracketBGColor;
+	private Color matchedBracketBorderColor;
+
+	/** The location of the last matched bracket. */
+	private int lastBracketMatchPos;
+
+	/** Whether or not bracket matching is enabled. */
+	private boolean bracketMatchingEnabled;
+
+	/** Whether or not bracket matching is animated. */
+	private boolean animateBracketMatching;
+
+	/** Whether <b>both</b> brackets are highlighted when bracket matching. */
+	private boolean paintMatchedBracketPair;
+
+	private BracketMatchingTimer bracketRepaintTimer;
+
+	/**
+	 * Whether or not auto-indent is on.
+	 */
+	private boolean autoIndentEnabled;
+
+	/**
+	 * Whether curly braces should be closed on Enter key presses, (if the
+	 * current language supports it).
+	 */
+	private boolean closeCurlyBraces;
+
+	/**
+	 * Whether closing markup tags should be automatically completed when
+	 * "<code></</code>" is typed (if the current language is a markup
+	 * language).
+	 */
+	private boolean closeMarkupTags;
+
+	/**
+	 * Whether or not lines with nothing but whitespace are "made empty."
+	 */
+	private boolean clearWhitespaceLines;
+
+	/** Whether we are displaying visible whitespace (spaces and tabs). */
+	private boolean whitespaceVisible;
+
+	/** Whether EOL markers should be visible at the end of each line. */
+	private boolean eolMarkersVisible;
+
+	/** Whether tab lines are enabled. */
+	private boolean paintTabLines;
+
+	/** The color to use when painting tab lines. */
+	private Color tabLineColor;
+
+	/**
+	 * Whether hyperlinks are enabled (must be supported by the syntax
+	 * scheme being used).
+	 */
+	private boolean hyperlinksEnabled;
+
+	/** The color to use when painting hyperlinks. */
+	private Color hyperlinkFG;
+
+	/**
+	 * Mask used to determine if the correct key is being held down to scan
+	 * for hyperlinks (ctrl, meta, etc.).
+	 */
+	private int linkScanningMask;
+
+	/** Whether secondary languages have their backgrounds colored. */
+	private boolean highlightSecondaryLanguages;
+
+	/** Whether the "selected text" color should be used with selected text. */
+	private boolean useSelectedTextColor;
+
+	/** Used during "Copy as RTF" operations. */
+	private RtfGenerator rtfGenerator;
+
+	/** Handles "mark occurrences" support. */
+	private MarkOccurrencesSupport markOccurrencesSupport;
+
+	/** The color used to render "marked occurrences." */
+	private Color markOccurrencesColor;
+
+	/** Whether a border should be painted around marked occurrences. */
+	private boolean paintMarkOccurrencesBorder;
+
+	/** Metrics of the text area's font. */
+	private FontMetrics defaultFontMetrics;
+
+	/** Manages running the parser. */
+	private ParserManager parserManager;
+
+	/**
+	 * Whether the editor is currently scanning for hyperlinks on mouse
+	 * movement.
+	 */
+	private boolean isScanningForLinks;
+
+	private int hoveredOverLinkOffset;
+
+	private LinkGenerator linkGenerator;
+	private LinkGeneratorResult linkGeneratorResult;
+
+	private FoldManager foldManager;
+
+	/** Whether "focusable" tool tips are used instead of standard ones. */
+	private boolean useFocusableTips;
+
+	/** The last focusable tip displayed. */
+	private FocusableTip focusableTip;
+
+	/** Cached desktop anti-aliasing hints, if anti-aliasing is enabled. */
+	private Map aaHints;
+
+	/** Renders tokens. */
+	private TokenPainter tokenPainter;
+
+private int lineHeight;		// Height of a line of text; same for default, bold & italic.
+private int maxAscent;
+private boolean fractionalFontMetricsEnabled;
+
+	private Color[] secondaryLanguageBackgrounds;
+
+
+	/**
+	 * Constructor.
+	 */
+	public RSyntaxTextArea() {
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param doc The document for the editor.
+	 */
+	public RSyntaxTextArea(RSyntaxDocument doc) {
+		super(doc);
+		init();
+	}
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param text The initial text to display.
+	 */
+	public RSyntaxTextArea(String text) {
+		super(text);
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RSyntaxTextArea(int rows, int cols) {
+		super(rows, cols);
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param text The initial text to display.
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RSyntaxTextArea(String text, int rows, int cols) {
+		super(text, rows, cols);
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param doc The document for the editor.
+	 * @param text The initial text to display.
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RSyntaxTextArea(RSyntaxDocument doc, String text,int rows,int cols) {
+		super(doc, text, rows, cols);
+		init();
+	}
+
+
+	/**
+	 * Creates a new <code>RSyntaxTextArea</code>.
+	 *
+	 * @param textMode Either <code>INSERT_MODE</code> or
+	 *        <code>OVERWRITE_MODE</code>.
+	 */
+	public RSyntaxTextArea(int textMode) {
+		super(textMode);
+		init();
+	}
+
+
+	/**
+	 * Adds an "active line range" listener to this text area.
+	 *
+	 * @param l The listener to add.
+	 * @see #removeActiveLineRangeListener(ActiveLineRangeListener)
+	 */
+	public void addActiveLineRangeListener(ActiveLineRangeListener l) {
+		listenerList.add(ActiveLineRangeListener.class, l);
+	}
+
+
+	/**
+	 * Adds a hyperlink listener to this text area.
+	 *
+	 * @param l The listener to add.
+	 * @see #removeHyperlinkListener(HyperlinkListener)
+	 */
+	public void addHyperlinkListener(HyperlinkListener l) {
+		listenerList.add(HyperlinkListener.class, l);
+	}
+
+
+	/**
+	 * Updates the font metrics the first time we're displayed.
+	 */
+	public void addNotify() {
+
+		super.addNotify();
+
+		// We know we've just been connected to a screen resource (by
+		// definition), so initialize our font metrics objects.
+		refreshFontMetrics(getGraphics2D(getGraphics()));
+
+		// Re-start parsing if we were removed from one container and added
+		// to another
+		if (parserManager!=null) {
+			parserManager.restartParsing();
+		}
+
+	}
+
+
+	/**
+	 * Adds the parser to "validate" the source code in this text area.  This
+	 * can be anything from a spell checker to a "compiler" that verifies
+	 * source code.
+	 *
+	 * @param parser The new parser.  A value of <code>null</code> will
+	 *        do nothing.
+	 * @see #getParser(int)
+	 * @see #getParserCount()
+	 * @see #removeParser(Parser)
+	 */
+	public void addParser(Parser parser) {
+		if (parserManager==null) {
+			parserManager = new ParserManager(this);
+		}
+		parserManager.addParser(parser);
+	}
+
+
+	/**
+	 * Appends a submenu with code folding options to this text component's
+	 * popup menu.
+	 *
+	 * @param popup The popup menu to append to.
+	 * @see #createPopupMenu()
+	 */
+	protected void appendFoldingMenu(JPopupMenu popup) {
+		popup.addSeparator();
+		ResourceBundle bundle = ResourceBundle.getBundle(MSG);
+		foldingMenu = new JMenu(bundle.getString("ContextMenu.Folding"));
+		foldingMenu.add(createPopupMenuItem(toggleCurrentFoldAction));
+		foldingMenu.add(createPopupMenuItem(collapseAllCommentFoldsAction));
+		foldingMenu.add(createPopupMenuItem(collapseAllFoldsAction));
+		foldingMenu.add(createPopupMenuItem(expandAllFoldsAction));
+		popup.add(foldingMenu);
+		
+	}
+
+
+	/**
+	 * Recalculates the height of a line in this text area and the
+	 * maximum ascent of all fonts displayed.
+	 */
+	private void calculateLineHeight() {
+
+		lineHeight = maxAscent = 0;
+
+		// Each token style.
+		for (int i=0; i<syntaxScheme.getStyleCount(); i++) {
+			Style ss = syntaxScheme.getStyle(i);
+			if (ss!=null && ss.font!=null) {
+				FontMetrics fm = getFontMetrics(ss.font);
+				int height = fm.getHeight();
+				if (height>lineHeight)
+					lineHeight = height;
+				int ascent = fm.getMaxAscent();
+				if (ascent>maxAscent)
+					maxAscent = ascent;
+			}
+		}
+
+		// The text area's (default) font).
+		Font temp = getFont();
+		FontMetrics fm = getFontMetrics(temp);
+		int height = fm.getHeight();
+		if (height>lineHeight) {
+			lineHeight = height;
+		}
+		int ascent = fm.getMaxAscent();
+		if (ascent>maxAscent) {
+			maxAscent = ascent;
+		}
+
+	}
+
+
+	/**
+	 * Removes all parsers from this text area.
+	 *
+	 * @see #removeParser(Parser)
+	 */
+	public void clearParsers() {
+		if (parserManager!=null) {
+			parserManager.clearParsers();
+		}
+	}
+
+
+	/**
+	 * Clones a token list.  This is necessary as tokens are reused in
+	 * {@link RSyntaxDocument}, so we can't simply use the ones we
+	 * are handed from it.
+	 *
+	 * @param t The token list to clone.
+	 * @return The clone of the token list.
+	 */
+	private Token cloneTokenList(Token t) {
+
+		if (t==null) {
+			return null;
+		}
+
+		Token clone = new Token();
+		clone.copyFrom(t);
+		Token cloneEnd = clone;
+
+		while ((t=t.getNextToken())!=null) {
+			Token temp = new Token();
+			temp.copyFrom(t);
+			cloneEnd.setNextToken(temp);
+			cloneEnd = temp;
+		}
+
+		return clone;
+
+	}
+
+
+	/**
+	 * Overridden to toggle the enabled state of various
+	 * RSyntaxTextArea-specific menu items.
+	 * 
+	 * If you set the popup menu via {@link #setPopupMenu(JPopupMenu)}, you
+	 * will want to override this method, especially if you removed any of the
+	 * menu items in the default popup menu.
+	 *
+	 * @param popupMenu The popup menu.  This will never be <code>null</code>.
+	 * @see #createPopupMenu()
+	 * @see #setPopupMenu(JPopupMenu)
+	 */
+	protected void configurePopupMenu(JPopupMenu popupMenu) {
+
+		super.configurePopupMenu(popupMenu);
+
+		// They may have overridden createPopupMenu()...
+		if (popupMenu!=null && popupMenu.getComponentCount()>0 &&
+				foldingMenu!=null) {
+			foldingMenu.setEnabled(foldManager.
+						isCodeFoldingSupportedAndEnabled());
+		}
+	}
+
+
+	/**
+	 * Copies the currently selected text to the system clipboard, with
+	 * any necessary style information (font, foreground color and background
+	 * color).  Does nothing for <code>null</code> selections.
+	 */
+	public void copyAsRtf() {
+
+		int selStart = getSelectionStart();
+		int selEnd = getSelectionEnd();
+		if (selStart==selEnd) {
+			return;
+		}
+
+		// Make sure there is a system clipboard, and that we can write
+		// to it.
+		SecurityManager sm = System.getSecurityManager();
+		if (sm!=null) {
+			try {
+				sm.checkSystemClipboardAccess();
+			} catch (SecurityException se) {
+				UIManager.getLookAndFeel().provideErrorFeedback(null);
+				return;
+			}
+		}
+		Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
+
+		// Create the RTF selection.
+		RtfGenerator gen = getRTFGenerator();
+		Token tokenList = getTokenListFor(selStart, selEnd);
+		for (Token t=tokenList; t!=null; t=t.getNextToken()) {
+			if (t.isPaintable()) {
+				if (t.textCount==1 && t.text[t.textOffset]=='\n') {
+					gen.appendNewline();
+				}
+				else {
+					Font font = getFontForTokenType(t.type);
+					Color bg = getBackgroundForToken(t);
+					boolean underline = getUnderlineForToken(t);
+					// Small optimization - don't print fg color if this
+					// is a whitespace color.  Saves on RTF size.
+					if (t.isWhitespace()) {
+						gen.appendToDocNoFG(t.getLexeme(), font, bg, underline);
+					}
+					else {
+						Color fg = getForegroundForToken(t);
+						gen.appendToDoc(t.getLexeme(), font, fg, bg, underline);
+					}
+				}
+			}
+		}
+
+		// Set the system clipboard contents to the RTF selection.
+		RtfTransferable contents = new RtfTransferable(gen.getRtf().getBytes());
+		//System.out.println("*** " + new String(gen.getRtf().getBytes()));
+		try {
+			cb.setContents(contents, null);
+		} catch (IllegalStateException ise) {
+			UIManager.getLookAndFeel().provideErrorFeedback(null);
+			return;
+		}
+
+	}
+
+
+	/**
+	 * Returns the document to use for an <code>RSyntaxTextArea</code>
+	 *
+	 * @return The document.
+	 */
+	protected Document createDefaultModel() {
+		return new RSyntaxDocument(SYNTAX_STYLE_NONE);
+	}
+
+
+	/**
+	 * Returns the caret event/mouse listener for <code>RTextArea</code>s.
+	 *
+	 * @return The caret event/mouse listener.
+	 */
+	protected RTAMouseListener createMouseListener() {
+		return new RSyntaxTextAreaMutableCaretEvent(this);
+	}
+
+
+	/**
+	 * Overridden to add menu items related to cold folding.
+	 *
+	 * @return The popup menu.
+	 * @see #appendFoldingMenu(JPopupMenu)
+	 */
+	protected JPopupMenu createPopupMenu() {
+		JPopupMenu popup = super.createPopupMenu();
+		appendFoldingMenu(popup);
+		return popup;
+	}
+
+
+	/**
+	 * See createPopupMenuActions() in RTextArea.
+	 * TODO: Remove these horrible hacks and move localizing of actions into
+	 * the editor kits, where it should be!  The context menu should contain
+	 * actions from the editor kits.
+	 */
+	private static void createRstaPopupMenuActions() {
+
+		ResourceBundle msg = ResourceBundle.getBundle(MSG);
+
+		toggleCurrentFoldAction = new RSyntaxTextAreaEditorKit.
+				ToggleCurrentFoldAction();
+		toggleCurrentFoldAction.setProperties(msg, "Action.ToggleCurrentFold");
+
+		collapseAllCommentFoldsAction = new RSyntaxTextAreaEditorKit.
+				CollapseAllCommentFoldsAction();
+		collapseAllCommentFoldsAction.setProperties(msg, "Action.CollapseCommentFolds");
+
+		collapseAllFoldsAction = new RSyntaxTextAreaEditorKit.CollapseAllFoldsAction(true);
+		expandAllFoldsAction = new RSyntaxTextAreaEditorKit.ExpandAllFoldsAction(true);
+
+	}
+
+
+	/**
+	 * Returns the a real UI to install on this text area.
+	 *
+	 * @return The UI.
+	 */
+	protected RTextAreaUI createRTextAreaUI() {
+		return new RSyntaxTextAreaUI(this);
+	}
+
+
+	/**
+	 * If the caret is on a bracket, this method finds the matching bracket,
+	 * and if it exists, highlights it.
+	 */
+	protected final void doBracketMatching() {
+
+		// We always need to repaint the "matched bracket" highlight if it
+		// exists.
+		if (match!=null) {
+			repaint(match);
+			if (dotRect!=null) {
+				repaint(dotRect);
+			}
+		}
+
+		// If a matching bracket is found, get its bounds and paint it!
+		int lastCaretBracketPos = bracketInfo==null ? -1 : bracketInfo.x;
+		bracketInfo = RSyntaxUtilities.getMatchingBracketPosition(this,
+				bracketInfo);
+		if (bracketInfo.y>-1 &&
+				(bracketInfo.y!=lastBracketMatchPos ||
+				 bracketInfo.x!=lastCaretBracketPos)) {
+			try {
+				match = modelToView(bracketInfo.y);
+				if (match!=null) { // Happens if we're not yet visible
+					if (getPaintMatchedBracketPair()) {
+						dotRect = modelToView(bracketInfo.x);
+					}
+					else {
+						dotRect = null;
+					}
+					if (getAnimateBracketMatching()) {
+						bracketRepaintTimer.restart();
+					}
+					repaint(match);
+					if (dotRect!=null) {
+						repaint(dotRect);
+					}
+				}
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Shouldn't happen.
+			}
+		}
+		else if (bracketInfo.y==-1) {
+			// Set match to null so the old value isn't still repainted.
+			match = null;
+			dotRect = null;
+			bracketRepaintTimer.stop();
+		}
+		lastBracketMatchPos = bracketInfo.y;
+
+	}
+
+
+	/**
+	 * Notifies all listeners that a caret change has occurred.
+	 *
+	 * @param e The caret event.
+	 */
+	protected void fireCaretUpdate(CaretEvent e) {
+		super.fireCaretUpdate(e);
+		if (isBracketMatchingEnabled()) {
+			doBracketMatching();
+		}
+	}
+
+
+	/**
+	 * Notifies all listeners that the active line range has changed.
+	 *
+	 * @param min The minimum "active" line, or <code>-1</code>.
+	 * @param max The maximum "active" line, or <code>-1</code>.
+	 */
+	private void fireActiveLineRangeEvent(int min, int max) {
+		ActiveLineRangeEvent e = null; // Lazily created
+		// Guaranteed to return a non-null array
+		Object[] listeners = listenerList.getListenerList();
+		// Process the listeners last to first, notifying
+		// those that are interested in this event
+		for (int i = listeners.length-2; i>=0; i-=2) {
+			if (listeners[i]==ActiveLineRangeListener.class) {
+				if (e==null) {
+					e = new ActiveLineRangeEvent(this, min, max);
+				}
+				((ActiveLineRangeListener)listeners[i+1]).activeLineRangeChanged(e);
+			}
+		}
+	}
+
+
+	/**
+	 * Notifies all listeners that have registered interest for notification
+	 * on this event type.  The listener list is processed last to first.
+	 *
+	 * @param e The event to fire.
+	 * @see EventListenerList
+	 */
+	private void fireHyperlinkUpdate(HyperlinkEvent e) {
+		// Guaranteed to return a non-null array
+		Object[] listeners = listenerList.getListenerList();
+		// Process the listeners last to first, notifying
+		// those that are interested in this event
+		for (int i = listeners.length-2; i>=0; i-=2) {
+			if (listeners[i]==HyperlinkListener.class) {
+				((HyperlinkListener)listeners[i+1]).hyperlinkUpdate(e);
+			}          
+		}
+	}
+
+
+	/**
+	 * Notifies listeners that the marked occurrences for this text area
+	 * have changed.
+	 */
+	void fireMarkedOccurrencesChanged() {
+		firePropertyChange(RSyntaxTextArea.MARKED_OCCURRENCES_CHANGED_PROPERTY,
+							null, null);
+	}
+
+
+	/**
+	 * Fires a notification that the parser notices for this text area have
+	 * changed.
+	 */
+	void fireParserNoticesChange() {
+		firePropertyChange(PARSER_NOTICES_PROPERTY, null, null);
+	}
+
+
+	/**
+	 * Called whenever a fold is collapsed or expanded.  This causes the
+	 * text editor to revalidate.  This method is here because of poor design
+	 * and should be removed.
+	 *
+	 * @param fold The fold that was collapsed or expanded.
+	 */
+	public void foldToggled(Fold fold) {
+		match = null; // TODO: Update the bracket rect rather than hide it
+		dotRect = null;
+		possiblyUpdateCurrentLineHighlightLocation();
+		revalidate();
+		repaint();
+	}
+
+
+	/**
+	 * Forces the given {@link Parser} to re-parse the content of this text
+	 * area.<p>
+	 * 
+	 * This method can be useful when a <code>Parser</code> can be configured
+	 * as to what notices it returns.  For example, if a Java language parser
+	 * can be configured to set whether no serialVersionUID is a warning,
+	 * error, or ignored, this method can be called after changing the expected
+	 * notice type to have the document re-parsed.
+	 *
+	 * @param parser The index of the <code>Parser</code> to re-run.
+	 * @see #getParser(int)
+	 */
+	public void forceReparsing(int parser) {
+		parserManager.forceReparsing(parser);
+	}
+
+
+	/**
+	 * Forces re-parsing with a specific parser.  Note that if this parser is
+	 * not installed on this text area, nothing will happen.
+	 *
+	 * @param parser The parser that should re-parse this text area's contents.
+	 *        This should be installed on this text area.
+	 * @return Whether the parser was installed on this text area.
+	 * @see #forceReparsing(int)
+	 */
+	public boolean forceReparsing(Parser parser) {
+		for (int i=0; i<getParserCount(); i++) {
+			if (getParser(i)==parser) {
+				forceReparsing(i);
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns whether bracket matching should be animated.
+	 *
+	 * @return Whether bracket matching should be animated.
+	 * @see #setAnimateBracketMatching(boolean)
+	 */
+	public boolean getAnimateBracketMatching() {
+		return animateBracketMatching;
+	}
+
+
+	/**
+	 * Returns whether anti-aliasing is enabled in this editor.
+	 *
+	 * @return Whether anti-aliasing is enabled in this editor.
+	 * @see #setAntiAliasingEnabled(boolean)
+	 * @see #getFractionalFontMetricsEnabled()
+	 */
+	public boolean getAntiAliasingEnabled() {
+		return aaHints!=null;
+	}
+
+
+	/**
+	 * Returns the background color for a token.
+	 *
+	 * @param token The token.
+	 * @return The background color to use for that token.  If this value is
+	 *         is <code>null</code> then this token has no special background
+	 *         color.
+	 * @see #getForegroundForToken(Token)
+	 */
+	public Color getBackgroundForToken(Token token) {
+		Color c = null;
+		if (getHighlightSecondaryLanguages()) {
+			// 1-indexed, since 0 == main language.
+			int languageIndex = token.getLanguageIndex() - 1;
+			if (languageIndex>=0 &&
+					languageIndex<secondaryLanguageBackgrounds.length) {
+				c = secondaryLanguageBackgrounds[languageIndex];
+			}
+		}
+		if (c==null) {
+			c = syntaxScheme.getStyle(token.type).background;
+		}
+		// Don't default to this.getBackground(), as Tokens simply don't
+		// paint a background if they get a null Color.
+		return c;
+	}
+
+
+	/**
+	 * Returns whether curly braces should be automatically closed when a
+	 * newline is entered after an opening curly brace.  Note that this
+	 * property is only honored for languages that use curly braces to denote
+	 * code blocks.
+	 *
+	 * @return Whether curly braces should be automatically closed.
+	 * @see #setCloseCurlyBraces(boolean)
+	 */
+	public boolean getCloseCurlyBraces() {
+		return closeCurlyBraces;
+	}
+
+
+	/**
+	 * Returns whether closing markup tags should be automatically completed
+	 * when "<code></</code>" is typed.  Note that this property is only
+	 * honored for markup languages, such as HTML, XML and PHP.
+	 *
+	 * @return Whether closing markup tags should be automatically completed.
+	 * @see #setCloseMarkupTags(boolean)
+	 */
+	public boolean getCloseMarkupTags() {
+		return closeMarkupTags;
+	}
+
+
+	/**
+	 * Returns the code template manager for all instances of
+	 * <code>RSyntaxTextArea</code>.  The manager is lazily created.
+	 *
+	 * @return The code template manager.
+	 * @see #setTemplatesEnabled(boolean)
+	 */
+	public static synchronized CodeTemplateManager getCodeTemplateManager() {
+		if (codeTemplateManager==null) {
+			codeTemplateManager = new CodeTemplateManager();
+		}
+		return codeTemplateManager;
+	}
+
+
+	/**
+	 * Returns the default bracket-match background color.
+	 *
+	 * @return The color.
+	 * @see #getDefaultBracketMatchBorderColor
+	 */
+	public static final Color getDefaultBracketMatchBGColor() {
+		return DEFAULT_BRACKET_MATCH_BG_COLOR;
+	}
+
+
+	/**
+	 * Returns the default bracket-match border color.
+	 *
+	 * @return The color.
+	 * @see #getDefaultBracketMatchBGColor
+	 */
+	public static final Color getDefaultBracketMatchBorderColor() {
+		return DEFAULT_BRACKET_MATCH_BORDER_COLOR;
+	}
+
+
+	/**
+	 * Returns the default selection color for this text area.  This
+	 * color was chosen because it's light and <code>RSyntaxTextArea</code>
+	 * does not change text color between selected/unselected text for
+	 * contrast like regular <code>JTextArea</code>s do.
+	 *
+	 * @return The default selection color.
+	 */
+	public static Color getDefaultSelectionColor() {
+		return DEFAULT_SELECTION_COLOR;
+	}
+
+
+	/**
+	 * Returns the "default" syntax highlighting color scheme.  The colors
+	 * used are somewhat standard among syntax highlighting text editors.
+	 *
+	 * @return The default syntax highlighting color scheme.
+	 * @see #restoreDefaultSyntaxScheme()
+	 * @see #getSyntaxScheme()
+	 * @see #setSyntaxScheme(SyntaxScheme)
+	 */
+	public SyntaxScheme getDefaultSyntaxScheme() {
+		return new SyntaxScheme(getFont());
+	}
+
+
+	/**
+	 * Returns whether an EOL marker should be drawn at the end of each line.
+	 *
+	 * @return Whether EOL markers should be visible.
+	 * @see #setEOLMarkersVisible(boolean)
+	 * @see #isWhitespaceVisible()
+	 */
+	public boolean getEOLMarkersVisible() {
+		return eolMarkersVisible;
+	}
+
+
+	/**
+	 * Returns the fold manager for this text area.
+	 *
+	 * @return The fold manager.
+	 */
+	public FoldManager getFoldManager() {
+		return foldManager;
+	}
+
+
+	/**
+	 * Returns the font for tokens of the specified type.
+	 *
+	 * @param type The type of token.
+	 * @return The font to use for that token type.
+	 * @see #getFontMetricsForTokenType(int)
+	 */
+	public Font getFontForTokenType(int type) {
+		Font f = syntaxScheme.getStyle(type).font;
+		return f!=null ? f : getFont();
+	}
+
+
+	/**
+	 * Returns the font metrics for tokens of the specified type.
+	 *
+	 * @param type The type of token.
+	 * @return The font metrics to use for that token type.
+	 * @see #getFontForTokenType(int)
+	 */
+	public FontMetrics getFontMetricsForTokenType(int type) {
+		FontMetrics fm = syntaxScheme.getStyle(type).fontMetrics;
+		return fm!=null ? fm : defaultFontMetrics;
+	}
+
+
+	/**
+	 * Returns the foreground color to use when painting a token.
+	 *
+	 * @param t The token.
+	 * @return The foreground color to use for that token.  This
+	 *         value is never <code>null</code>.
+	 * @see #getBackgroundForToken(Token)
+	 */
+	public Color getForegroundForToken(Token t) {
+		if (getHyperlinksEnabled() && hoveredOverLinkOffset==t.offset &&
+				(t.isHyperlink() || linkGeneratorResult!=null)) {
+			return hyperlinkFG;
+		}
+		return getForegroundForTokenType(t.type);
+	}
+
+
+	/**
+	 * Returns the foreground color to use when painting a token.  This does
+	 * not take into account whether the token is a hyperlink.
+	 *
+	 * @param type The token type.
+	 * @return The foreground color to use for that token.  This
+	 *         value is never <code>null</code>.
+	 * @see #getForegroundForToken(Token)
+	 */
+	public Color getForegroundForTokenType(int type) {
+		Color fg = syntaxScheme.getStyle(type).foreground;
+		return fg!=null ? fg : getForeground();
+	}
+
+
+	/**
+	 * Returns whether fractional font metrics are enabled for this text area.
+	 *
+	 * @return Whether fractional font metrics are enabled.
+	 * @see #setFractionalFontMetricsEnabled
+	 * @see #getAntiAliasingEnabled()
+	 */
+	public boolean getFractionalFontMetricsEnabled() {
+		return fractionalFontMetricsEnabled;
+	}
+
+
+	/**
+	 * Returns a <code>Graphics2D</code> version of the specified graphics
+	 * that has been initialized with the proper rendering hints.
+	 *
+	 * @param g The graphics context for which to get a
+	 *        <code>Graphics2D</code>.
+	 * @return The <code>Graphics2D</code>.
+	 */
+	private final Graphics2D getGraphics2D(Graphics g) {
+		Graphics2D g2d = (Graphics2D)g;
+		if (aaHints!=null) {
+			g2d.addRenderingHints(aaHints);
+		}
+		if (fractionalFontMetricsEnabled) {
+			g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
+							RenderingHints.VALUE_FRACTIONALMETRICS_ON);
+		}
+		return g2d;
+	}
+
+
+	/**
+	 * Returns whether "secondary" languages should have their backgrounds
+	 * colored differently to visually differentiate them.  This feature
+	 * imposes a fair performance penalty.
+	 *
+	 * @return Whether secondary languages have their backgrounds colored
+	 *         differently.
+	 * @see #setHighlightSecondaryLanguages(boolean)
+	 * @see #getSecondaryLanguageBackground(int)
+	 * @see #getSecondaryLanguageCount()
+	 * @see #setSecondaryLanguageBackground(int, Color)
+	 */
+	public boolean getHighlightSecondaryLanguages() {
+		return highlightSecondaryLanguages;
+	}
+
+
+	/**
+	 * Returns the color to use when painting hyperlinks.
+	 *
+	 * @return The color to use when painting hyperlinks.
+	 * @see #setHyperlinkForeground(Color)
+	 * @see #getHyperlinksEnabled()
+	 */
+	public Color getHyperlinkForeground() {
+		return hyperlinkFG;
+	}
+
+
+	/**
+	 * Returns whether hyperlinks are enabled for this text area.
+	 *
+	 * @return Whether hyperlinks are enabled for this text area.
+	 * @see #setHyperlinksEnabled(boolean)
+	 */
+	public boolean getHyperlinksEnabled() {
+		return hyperlinksEnabled;
+	}
+
+
+	/**
+	 * Returns the last visible offset in this text area.  This may not be the
+	 * length of the document if code folding is enabled.
+	 *
+	 * @return The last visible offset in this text area.
+	 */
+	public int getLastVisibleOffset() {
+		if (isCodeFoldingEnabled()) {
+			int lastVisibleLine = foldManager.getLastVisibleLine();
+			if (lastVisibleLine<getLineCount()-1) { // Not the last line
+				try {
+					return getLineEndOffset(lastVisibleLine) - 1;
+				} catch (BadLocationException ble) { // Never happens
+					ble.printStackTrace();
+				}
+			}
+		}
+		return getDocument().getLength();
+	}
+
+
+	/**
+	 * Returns the height to use for a line of text in this text area.
+	 *
+	 * @return The height of a line of text in this text area.
+	 */
+	public int getLineHeight() {
+		//System.err.println("... getLineHeight() returning " + lineHeight);
+		return lineHeight;
+	}
+
+
+	public LinkGenerator getLinkGenerator() {
+		return linkGenerator;
+	}
+
+
+	/**
+	 * Returns a list of "marked occurrences" in the text area.  If there are
+	 * no marked occurrences, this will be an empty list.
+	 *
+	 * @return The list of marked occurrences.
+	 */
+	public List getMarkedOccurrences() {
+		return ((RSyntaxTextAreaHighlighter)getHighlighter()).
+											getMarkedOccurrences();
+	}
+
+
+	/**
+	 * Returns whether "Mark Occurrences" is enabled.
+	 *
+	 * @return Whether "Mark Occurrences" is enabled.
+	 * @see #setMarkOccurrences(boolean)
+	 */
+	public boolean getMarkOccurrences() {
+		return markOccurrencesSupport!=null;
+	}
+
+
+	/**
+	 * Returns the color used to "mark occurrences."
+	 *
+	 * @return The mark occurrences color.
+	 * @see #setMarkOccurrencesColor(Color)
+	 */
+	public Color getMarkOccurrencesColor() {
+		return markOccurrencesColor;
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	boolean getMarkOccurrencesOfTokenType(int type) {
+		RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+		return doc.getMarkOccurrencesOfTokenType(type);
+	}
+
+
+	/**
+	 * Gets the color used as the background for a matched bracket.
+	 *
+	 * @return The color used.  If this is <code>null</code>, no special
+	 *         background is painted behind a matched bracket.
+	 * @see #setMatchedBracketBGColor
+	 * @see #getMatchedBracketBorderColor
+	 */
+	public Color getMatchedBracketBGColor() {
+		return matchedBracketBGColor;
+	}
+
+
+	/**
+	 * Gets the color used as the border for a matched bracket.
+	 *
+	 * @return The color used.
+	 * @see #setMatchedBracketBorderColor
+	 * @see #getMatchedBracketBGColor
+	 */
+	public Color getMatchedBracketBorderColor() {
+		return matchedBracketBorderColor;
+	}
+
+
+	/**
+	 * Returns the caret's offset's rectangle, or <code>null</code> if there
+	 * is currently no matched bracket, bracket matching is disabled, or "paint
+	 * both matched brackets" is disabled.  This should never be called by the
+	 * programmer directly.
+	 *
+	 * @return The rectangle surrounding the matched bracket.
+	 * @see #getMatchRectangle()
+	 */
+	Rectangle getDotRectangle() {
+		return dotRect;
+	}
+
+
+	/**
+	 * Returns the matched bracket's rectangle, or <code>null</code> if there
+	 * is currently no matched bracket.  This should never be called by the
+	 * programmer directly.
+	 *
+	 * @return The rectangle surrounding the matched bracket.
+	 * @see #getDotRectangle()
+	 */
+	Rectangle getMatchRectangle() {
+		return match;
+	}
+
+
+	/**
+	 * Overridden to return the max ascent for any font used in the editor.
+	 *
+	 * @return The max ascent value.
+	 */
+	public int getMaxAscent() {
+		return maxAscent;
+	}
+
+
+	/**
+	 * Returns whether the bracket at the caret position is painted as a
+	 * "match" when a matched bracket is found.  Note that this property does
+	 * nothing if {@link #isBracketMatchingEnabled()} returns
+	 * <code>false</code>.
+	 * 
+	 * @return Whether both brackets in a bracket pair are highlighted when
+	 *         bracket matching is enabled.
+	 * @see #setPaintMatchedBracketPair(boolean)
+	 * @see #isBracketMatchingEnabled()
+	 * @see #setBracketMatchingEnabled(boolean)
+	 */
+	public boolean getPaintMatchedBracketPair() {
+		return paintMatchedBracketPair;
+	}
+
+
+	/**
+	 * Returns whether tab lines are painted.
+	 *
+	 * @return Whether tab lines are painted.
+	 * @see #setPaintTabLines(boolean)
+	 * @see #getTabLineColor()
+	 */
+	public boolean getPaintTabLines() {
+		return paintTabLines;
+	}
+
+
+	/**
+	 * Returns the specified parser.
+	 *
+	 * @param index The {@link Parser} to retrieve.
+	 * @return The <code>Parser</code>.
+	 * @see #getParserCount()
+	 * @see #addParser(Parser)
+	 */
+	public Parser getParser(int index) {
+		return parserManager.getParser(index);
+	}
+
+
+	/**
+	 * Returns the number of parsers operating on this text area.
+	 *
+	 * @return The parser count.
+	 * @see #addParser(Parser)
+	 */
+	public int getParserCount() {
+		return parserManager==null ? 0 : parserManager.getParserCount();
+	}
+
+
+	/**
+	 * Returns a list of the current parser notices for this text area.
+	 * This method (like most Swing methods) should only be called on the
+	 * EDT.
+	 *
+	 * @return The list of notices.  This will be an empty list if there are
+	 *         none.
+	 */
+	public List getParserNotices() {
+		return parserManager==null ? Collections.EMPTY_LIST :
+									parserManager.getParserNotices();
+	}
+
+
+	/**
+	 * Returns the RTF generator for this text area, lazily creating it
+	 * if necessary.
+	 *
+	 * @return The RTF generator.
+	 */
+	private RtfGenerator getRTFGenerator() {
+		if (rtfGenerator==null) {
+			rtfGenerator = new RtfGenerator();
+		}
+		else {
+			rtfGenerator.reset();
+		}
+		return rtfGenerator;
+	}
+
+
+	/**
+	 * If auto-indent is enabled, this method returns whether a new line after
+	 * this one should be indented (based on the standard indentation rules for
+	 * the current programming language). For example, in Java, for a line
+	 * containing:
+	 * 
+	 * <pre>
+	 * for (int i=0; i<10; i++) {
+	 * </pre>
+	 * 
+	 * the following line should be indented.
+	 *
+	 * @param line The line to check.
+	 * @return Whether a line inserted after this one should be auto-indented.
+	 *         If auto-indentation is disabled, this will always return
+	 *         <code>false</code>.
+	 * @see #isAutoIndentEnabled()
+	 */
+	public boolean getShouldIndentNextLine(int line) {
+		if (isAutoIndentEnabled()) {
+			RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+			return doc.getShouldIndentNextLine(line);
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns what type of syntax highlighting this editor is doing.
+	 *
+	 * @return The style being used, such as
+	 *         {@link SyntaxConstants#SYNTAX_STYLE_JAVA}.
+	 * @see #setSyntaxEditingStyle(String)
+	 * @see SyntaxConstants
+	 */
+	public String getSyntaxEditingStyle() {
+		return syntaxStyleKey;
+	}
+
+
+	/**
+	 * Returns all of the colors currently being used in syntax highlighting
+	 * by this text component.
+	 *
+	 * @return An instance of <code>SyntaxScheme</code> that represents
+	 *         the colors currently being used for syntax highlighting.
+	 * @see #setSyntaxScheme(SyntaxScheme)
+	 */
+	public SyntaxScheme getSyntaxScheme() {
+		return syntaxScheme;
+	}
+
+
+	/**
+	 * Returns the color used to paint tab lines.
+	 *
+	 * @return The color used to paint tab lines.
+	 * @see #setTabLineColor(Color)
+	 * @see #getPaintTabLines()
+	 * @see #setPaintTabLines(boolean)
+	 */
+	public Color getTabLineColor() {
+		return tabLineColor;
+	}
+
+
+	/**
+	 * Returns whether a border is painted around marked occurrences.
+	 *
+	 * @return Whether a border is painted.
+	 * @see #setPaintMarkOccurrencesBorder(boolean)
+	 * @see #getMarkOccurrencesColor()
+	 * @see #getMarkOccurrences()
+	 */
+	public boolean getPaintMarkOccurrencesBorder() {
+		return paintMarkOccurrencesBorder;
+	}
+
+
+	/**
+	 * Returns the background color for the specified secondary language.
+	 *
+	 * @param index The language index.  Note that these are 1-based, not
+	 *        0-based, and should be in the range
+	 *        <code>1-getSecondaryLanguageCount()</code>, inclusive.
+	 * @return The color, or <code>null</code> if none.
+	 * @see #getSecondaryLanguageCount()
+	 * @see #setSecondaryLanguageBackground(int, Color)
+	 * @see #getHighlightSecondaryLanguages()
+	 */
+	public Color getSecondaryLanguageBackground(int index) {
+		return secondaryLanguageBackgrounds[index];
+	}
+
+
+	/**
+	 * Returns the number of secondary language backgrounds.
+	 *
+	 * @return The number of secondary language backgrounds.
+	 * @see #getSecondaryLanguageBackground(int)
+	 * @see #setSecondaryLanguageBackground(int, Color)
+	 * @see #getHighlightSecondaryLanguages()
+	 */
+	public int getSecondaryLanguageCount() {
+		return secondaryLanguageBackgrounds.length;
+	}
+
+
+	/**
+	 * Returns whether or not templates are enabled for all instances
+	 * of <code>RSyntaxTextArea</code>.
+	 *
+	 * @return Whether templates are enabled.
+	 * @see #saveTemplates()
+	 * @see #setTemplateDirectory(String)
+	 * @see #setTemplatesEnabled(boolean)
+	 */
+	public static synchronized boolean getTemplatesEnabled() {
+		return templatesEnabled;
+	}
+
+
+	/**
+	 * Returns a token list for the given range in the document.
+	 *
+	 * @param startOffs The starting offset in the document.
+	 * @param endOffs The end offset in the document.
+	 * @return The first token in the token list.
+	 */
+	private Token getTokenListFor(int startOffs, int endOffs) {
+
+		Token tokenList = null;
+		Token lastToken = null;
+
+		Element map = getDocument().getDefaultRootElement();
+		int startLine = map.getElementIndex(startOffs);
+		int endLine = map.getElementIndex(endOffs);
+
+		for (int line=startLine; line<=endLine; line++) {
+			Token t = getTokenListForLine(line);
+			t = cloneTokenList(t);
+			if (tokenList==null) {
+				tokenList = t;
+				lastToken = tokenList;
+			}
+			else {
+				lastToken.setNextToken(t);
+			}
+			while (lastToken.getNextToken()!=null &&
+					lastToken.getNextToken().isPaintable()) {
+				lastToken = lastToken.getNextToken();
+			}
+			if (line<endLine) {
+				// Document offset MUST be correct to prevent exceptions
+				// in getTokenListFor()
+				int docOffs = map.getElement(line).getEndOffset()-1;
+				t = new Token(new char[] { '\n' }, 0,0, docOffs,
+								Token.WHITESPACE);
+				lastToken.setNextToken(t);
+				lastToken = t;
+			}
+		}
+
+		// Trim the beginning and end of the token list so that it starts
+		// at startOffs and ends at endOffs.
+
+		// Be careful and check that startOffs is actually in the list.
+		// startOffs can be < the token list's start if the end "newline"
+		// character of a line is the first character selected (the token
+		// list returned for that line will be null, so the first token in
+		// the final token list will be from the next line and have a
+		// starting offset > startOffs?).
+		if (startOffs>=tokenList.offset) {
+			while (!tokenList.containsPosition(startOffs)) {
+				tokenList = tokenList.getNextToken();
+			}
+			tokenList.makeStartAt(startOffs);
+		}
+
+		Token temp = tokenList;
+		// Be careful to check temp for null here.  It is possible that no
+		// token contains endOffs, if endOffs is at the end of a line.
+		while (temp!=null && !temp.containsPosition(endOffs)) {
+			temp = temp.getNextToken();
+		}
+		if (temp!=null) {
+			temp.textCount = endOffs - temp.offset;
+			temp.setNextToken(null);
+		}
+
+		return tokenList;
+
+	}
+
+
+	/**
+	 * Returns a list of tokens representing the given line.
+	 *
+	 * @param line The line number to get tokens for.
+	 * @return A linked list of tokens representing the line's text.
+	 */
+	public Token getTokenListForLine(int line) {
+		return ((RSyntaxDocument)getDocument()).getTokenListForLine(line);
+	}
+
+
+	/**
+	 * Returns the painter to use for rendering tokens.
+	 *
+	 * @return The painter to use for rendering tokens.
+	 */
+	TokenPainter getTokenPainter() {
+		return tokenPainter;
+	}
+
+
+	/**
+	 * Returns the tool tip to display for a mouse event at the given
+	 * location.  This method is overridden to give a registered parser a
+	 * chance to display a tool tip (such as an error description when the
+	 * mouse is over an error highlight).
+	 *
+	 * @param e The mouse event.
+	 */
+	public String getToolTipText(MouseEvent e) {
+
+		// Check parsers for tool tips first.
+		String text = null;
+		URL imageBase = null;
+		if (parserManager!=null) {
+			ToolTipInfo info = parserManager.getToolTipText(e);
+			if (info!=null) { // Should always be true
+				text = info.getToolTipText(); // May be null
+				imageBase = info.getImageBase(); // May be null
+			}
+		}
+		if (text==null) {
+			text = super.getToolTipText(e);
+		}
+
+		// Do we want to use "focusable" tips?
+		if (getUseFocusableTips()) {
+			if (text!=null) {
+				if (focusableTip==null) {
+					focusableTip = new FocusableTip(this, parserManager);
+				}
+				focusableTip.setImageBase(imageBase);
+				focusableTip.toolTipRequested(e, text);
+			}
+			// No tool tip text at new location - hide tip window if one is
+			// currently visible
+			else if (focusableTip!=null) {
+				focusableTip.possiblyDisposeOfTipWindow();
+			}
+			return null;
+		}
+
+		return text; // Standard tool tips
+
+	}
+
+
+	/**
+	 * Returns whether the specified token should be underlined.
+	 * A token is underlined if its syntax style includes underlining,
+	 * or if it is a hyperlink and hyperlinks are enabled.
+	 *
+	 * @param t The token.
+	 * @return Whether the specified token should be underlined.
+	 */
+	public boolean getUnderlineForToken(Token t) {
+		return (getHyperlinksEnabled() &&
+				(t.isHyperlink() ||
+					(linkGeneratorResult!=null && linkGeneratorResult.getSourceOffset()==t.offset))) ||
+				syntaxScheme.getStyle(t.type).underline;
+	}
+
+
+	/**
+	 * Returns whether "focusable" tool tips are used instead of standard
+	 * ones.  Focusable tool tips are tool tips that the user can click on,
+	 * resize, copy from, and click links in.
+	 *
+	 * @return Whether to use focusable tool tips.
+	 * @see #setUseFocusableTips(boolean)
+	 * @see FocusableTip
+	 */
+	public boolean getUseFocusableTips() {
+		return useFocusableTips;
+	}
+
+
+	/**
+	 * Returns whether selected text should use the "selected text color"
+	 * property set via {@link #setSelectedTextColor(Color)}.  This is the
+	 * typical behavior of text components.  By default, RSyntaxTextArea does
+	 * not do this, so that token styles are visible even in selected regions
+	 * of text.
+	 *
+	 * @return Whether the "selected text" color is used when painting text
+	 *         in selected regions.
+	 * @see #setUseSelectedTextColor(boolean)
+	 */
+	public boolean getUseSelectedTextColor() {
+		return useSelectedTextColor;
+	}
+
+
+	/**
+	 * Called by constructors to initialize common properties of the text
+	 * editor.
+	 */
+	protected void init() {
+
+		tokenPainter = new DefaultTokenPainter();
+
+		// NOTE: Our actions are created here instead of in a static block
+		// so they are only created when the first RTextArea is instantiated,
+		// not before.  There have been reports of users calling static getters
+		// (e.g. RSyntaxTextArea.getDefaultBracketMatchBGColor()) which would
+		// cause these actions to be created and (possibly) incorrectly
+		// localized, if they were in a static block.
+		if (toggleCurrentFoldAction==null) {
+			createRstaPopupMenuActions();
+		}
+
+		// Set some RSyntaxTextArea default values.
+		syntaxStyleKey = SYNTAX_STYLE_NONE;
+		setMatchedBracketBGColor(getDefaultBracketMatchBGColor());
+		setMatchedBracketBorderColor(getDefaultBracketMatchBorderColor());
+		setBracketMatchingEnabled(true);
+		setAnimateBracketMatching(true);
+		lastBracketMatchPos = -1;
+		setSelectionColor(getDefaultSelectionColor());
+		setTabLineColor(null);
+		setMarkOccurrencesColor(MarkOccurrencesSupport.DEFAULT_COLOR);
+
+		foldManager = new FoldManager(this);
+
+		// Set auto-indent related stuff.
+		setAutoIndentEnabled(true);
+		setCloseCurlyBraces(true);
+		setCloseMarkupTags(true);
+		setClearWhitespaceLinesEnabled(true);
+
+		setHyperlinksEnabled(true);
+		setLinkScanningMask(InputEvent.CTRL_DOWN_MASK);
+		setHyperlinkForeground(Color.BLUE);
+		isScanningForLinks = false;
+		setUseFocusableTips(true);
+
+		//setAntiAliasingEnabled(true);
+		setDefaultAntiAliasingState();
+		restoreDefaultSyntaxScheme();
+
+		setHighlightSecondaryLanguages(true);
+		secondaryLanguageBackgrounds = new Color[3];
+		secondaryLanguageBackgrounds[0] = new Color(0xfff0cc);
+		secondaryLanguageBackgrounds[1] = new Color(0xdafeda);
+		secondaryLanguageBackgrounds[2] = new Color(0xffe0f0);
+
+	}
+
+
+	/**
+	 * Returns whether or not auto-indent is enabled.
+	 *
+	 * @return Whether or not auto-indent is enabled.
+	 * @see #setAutoIndentEnabled(boolean)
+	 */
+	public boolean isAutoIndentEnabled() {
+		return autoIndentEnabled;
+	}
+
+
+	/**
+	 * Returns whether or not bracket matching is enabled.
+	 *
+	 * @return <code>true</code> iff bracket matching is enabled.
+	 * @see #setBracketMatchingEnabled
+	 */
+	public final boolean isBracketMatchingEnabled() {
+		return bracketMatchingEnabled;
+	}
+
+
+	/**
+	 * Returns whether or not lines containing nothing but whitespace are made
+	 * into blank lines when Enter is pressed in them.
+	 *
+	 * @return Whether or not whitespace-only lines are cleared when
+	 *         the user presses Enter on them.
+	 * @see #setClearWhitespaceLinesEnabled(boolean)
+	 */
+	public boolean isClearWhitespaceLinesEnabled() {
+		return clearWhitespaceLines;
+	}
+
+
+	/**
+	 * Returns whether code folding is enabled.  Note that only certain
+	 * languages support code folding; those that do not will ignore this
+	 * property.
+	 *
+	 * @return Whether code folding is enabled.
+	 * @see #setCodeFoldingEnabled(boolean)
+	 */
+	public boolean isCodeFoldingEnabled() {
+		return foldManager.isCodeFoldingEnabled();
+	}
+
+
+	/**
+	 * Returns whether whitespace (spaces and tabs) is visible.
+	 *
+	 * @return Whether whitespace is visible.
+	 * @see #setWhitespaceVisible(boolean)
+	 * @see #getEOLMarkersVisible()
+	 */
+	public boolean isWhitespaceVisible() {
+		return whitespaceVisible;
+	}
+
+
+	/**
+	 * Returns the token at the specified position in the model.
+	 *
+	 * @param offs The position in the model.
+	 * @return The token, or <code>null</code> if no token is at that
+	 *         position.
+	 * @see #viewToToken(Point)
+	 */
+	public Token modelToToken(int offs) {
+		if (offs>=0) {
+			try {
+				int line = getLineOfOffset(offs);
+				Token t = getTokenListForLine(line);
+				return RSyntaxUtilities.getTokenAtOffset(t, offs);
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Never happens
+			}
+		}
+		return null;
+	}
+
+
+	/**
+	 * The <code>paintComponent</code> method is overridden so we
+	 * apply any necessary rendering hints to the Graphics object.
+	 */
+	protected void paintComponent(Graphics g) {
+		super.paintComponent(getGraphics2D(g));
+	}
+
+
+	private void refreshFontMetrics(Graphics2D g2d) {
+		// It is assumed that any rendering hints are already applied to g2d.
+		defaultFontMetrics = g2d.getFontMetrics(getFont());
+		syntaxScheme.refreshFontMetrics(g2d);
+		if (getLineWrap()==false) {
+			// HORRIBLE HACK!  The un-wrapped view needs to refresh its cached
+			// longest line information.
+			SyntaxView sv = (SyntaxView)getUI().getRootView(this).getView(0);
+			sv.calculateLongestLine();
+		}
+	}
+
+
+	/**
+	 * Removes an "active line range" listener from this text area.
+	 *
+	 * @param l The listener to remove.
+	 * @see #removeActiveLineRangeListener(ActiveLineRangeListener)
+	 */
+	public void removeActiveLineRangeListener(ActiveLineRangeListener l) {
+		listenerList.remove(ActiveLineRangeListener.class, l);
+	}
+
+
+	/**
+	 * Removes a hyperlink listener from this text area.
+	 *
+	 * @param l The listener to remove.
+	 * @see #addHyperlinkListener(HyperlinkListener)
+	 */
+	public void removeHyperlinkListener(HyperlinkListener l) {
+		listenerList.remove(HyperlinkListener.class, l);
+	}
+
+
+	/**
+	 * Overridden so we stop this text area's parsers, if any.
+	 */
+	public void removeNotify() {
+		if (parserManager!=null) {
+			parserManager.stopParsing();
+		}
+		super.removeNotify();
+	}
+
+
+	/**
+	 * Removes a parser from this text area.
+	 *
+	 * @param parser The {@link Parser} to remove.
+	 * @return Whether the parser was found and removed.
+	 * @see #clearParsers()
+	 * @see #addParser(Parser)
+	 * @see #getParser(int)
+	 */
+	public boolean removeParser(Parser parser) {
+		boolean removed = false;
+		if (parserManager!=null) {
+			removed = parserManager.removeParser(parser);
+		}
+		return removed;
+	}
+
+
+	/**
+	 * Sets the colors used for syntax highlighting to their defaults.
+	 *
+	 * @see #setSyntaxScheme(SyntaxScheme)
+	 * @see #getSyntaxScheme()
+	 * @see #getDefaultSyntaxScheme()
+	 */
+	public void restoreDefaultSyntaxScheme() {
+		setSyntaxScheme(getDefaultSyntaxScheme());
+	}
+
+
+	/**
+	 * Attempts to save all currently-known templates to the current template
+	 * directory, as set by <code>setTemplateDirectory</code>.  Templates
+	 * will be saved as XML files with names equal to their abbreviations; for
+	 * example, a template that expands on the word "forb" will be saved as
+	 * <code>forb.xml</code>.
+	 *
+	 * @return Whether or not the save was successful.  The save will
+	 *         be unsuccessful if the template directory does not exist or
+	 *         if it has not been set (i.e., you have not yet called
+	 *         <code>setTemplateDirectory</code>).
+	 * @see #getTemplatesEnabled
+	 * @see #setTemplateDirectory
+	 * @see #setTemplatesEnabled
+	 */
+	public static synchronized boolean saveTemplates() {
+		if (!getTemplatesEnabled()) {
+			return false;
+		}
+		return getCodeTemplateManager().saveTemplates();
+	}
+
+
+	/**
+	 * Sets the "active line range."  Note that this
+	 * <code>RSyntaxTextArea</code> itself does nothing with this information,
+	 * but if it is contained inside an {@link RTextScrollPane}, the active
+	 * line range may be displayed in the icon area of the {@link Gutter}.<p>
+	 * 
+	 * Note that basic users of <code>RSyntaxTextArea</code> will not call this
+	 * method directly; rather, it is usually called by instances of
+	 * <code>LanguageSupport</code> in the <code>RSTALangaugeSupport</code>
+	 * library.  See <a href="http://fifesoft.com">http://fifesoft.com</a>
+	 * for more information about this library.
+	 *
+	 * @param min The "minimum" line in the active line range, or
+	 *        <code>-1</code> if the range is being cleared.
+	 * @param max The "maximum" line in the active line range, or
+	 *        <code>-1</code> if the range is being cleared.
+	 * @see #addActiveLineRangeListener(ActiveLineRangeListener)
+	 */
+	public void setActiveLineRange(int min, int max) {
+		if (min==-1) {
+			max = -1; // Force max to be -1 if min is.
+		}
+		fireActiveLineRangeEvent(min, max);
+	}
+
+
+	/**
+	 * Sets whether bracket matching should be animated.  This fires a property
+	 * change event of type {@link #ANIMATE_BRACKET_MATCHING_PROPERTY}.
+	 *
+	 * @param animate Whether to animate bracket matching.
+	 * @see #getAnimateBracketMatching()
+	 */
+	public void setAnimateBracketMatching(boolean animate) {
+		if (animate!=animateBracketMatching) {
+			animateBracketMatching = animate;
+			if (animate && bracketRepaintTimer==null) {
+				bracketRepaintTimer = new BracketMatchingTimer();
+			}
+			firePropertyChange(ANIMATE_BRACKET_MATCHING_PROPERTY,
+								!animate, animate);
+		}
+	}
+
+
+	/**
+	 * Sets whether anti-aliasing is enabled in this editor.  This method
+	 * fires a property change event of type {@link #ANTIALIAS_PROPERTY}.
+	 *
+	 * @param enabled Whether anti-aliasing is enabled.
+	 * @see #getAntiAliasingEnabled()
+	 */
+	public void setAntiAliasingEnabled(boolean enabled) {
+
+		boolean currentlyEnabled = aaHints!=null;
+
+		if (enabled!=currentlyEnabled) {
+
+			if (enabled) {
+				aaHints = RSyntaxUtilities.getDesktopAntiAliasHints();
+				// If the desktop query method comes up empty, use the standard
+				// Java2D greyscale method.  Note this will likely NOT be as
+				// nice as what would be used if the getDesktopAntiAliasHints()
+				// call worked.
+				if (aaHints==null) {
+					aaHints = new HashMap();
+					aaHints.put(RenderingHints.KEY_TEXT_ANTIALIASING,
+							RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+				}
+			}
+			else {
+				aaHints = null;
+			}
+
+			// We must be connected to a screen resource for our graphics
+			// to be non-null.
+			if (isDisplayable()) {
+				refreshFontMetrics(getGraphics2D(getGraphics()));
+			}
+			firePropertyChange(ANTIALIAS_PROPERTY, !enabled, enabled);
+			repaint();
+
+		}
+
+	}
+
+
+	/**
+	 * Sets whether or not auto-indent is enabled.  This fires a property
+	 * change event of type {@link #AUTO_INDENT_PROPERTY}.
+	 *
+	 * @param enabled Whether or not auto-indent is enabled.
+	 * @see #isAutoIndentEnabled()
+	 */
+	public void setAutoIndentEnabled(boolean enabled) {
+		if (autoIndentEnabled!=enabled) {
+			autoIndentEnabled = enabled;
+			firePropertyChange(AUTO_INDENT_PROPERTY, !enabled, enabled);
+		}
+	}
+
+
+	/**
+	 * Sets whether bracket matching is enabled.  This fires a property change
+	 * event of type {@link #BRACKET_MATCHING_PROPERTY}.
+	 *
+	 * @param enabled Whether or not bracket matching should be enabled.
+	 * @see #isBracketMatchingEnabled()
+	 */
+	public void setBracketMatchingEnabled(boolean enabled) {
+		if (enabled!=bracketMatchingEnabled) {
+			bracketMatchingEnabled = enabled;
+			repaint();
+			firePropertyChange(BRACKET_MATCHING_PROPERTY, !enabled, enabled);
+		}
+	}
+
+
+	/**
+	 * Sets whether or not lines containing nothing but whitespace are made
+	 * into blank lines when Enter is pressed in them.  This method fires
+	 * a property change event of type {@link #CLEAR_WHITESPACE_LINES_PROPERTY}.
+	 *
+	 * @param enabled Whether or not whitespace-only lines are cleared when
+	 *        the user presses Enter on them.
+	 * @see #isClearWhitespaceLinesEnabled()
+	 */
+	public void setClearWhitespaceLinesEnabled(boolean enabled) {
+		if (enabled!=clearWhitespaceLines) {
+			clearWhitespaceLines = enabled;
+			firePropertyChange(CLEAR_WHITESPACE_LINES_PROPERTY,
+							!enabled, enabled);
+		}
+	}
+
+
+	/**
+	 * Toggles whether curly braces should be automatically closed when a
+	 * newline is entered after an opening curly brace.  Note that this
+	 * property is only honored for languages that use curly braces to denote
+	 * code blocks.<p>
+	 *
+	 * This method fires a property change event of type
+	 * {@link #CLOSE_CURLY_BRACES_PROPERTY}.
+	 *
+	 * @param close Whether curly braces should be automatically closed.
+	 * @see #getCloseCurlyBraces()
+	 */
+	public void setCloseCurlyBraces(boolean close) {
+		if (close!=closeCurlyBraces) {
+			closeCurlyBraces = close;
+			firePropertyChange(CLOSE_CURLY_BRACES_PROPERTY, !close, close);
+		}
+	}
+
+
+	/**
+	 * Sets whether closing markup tags should be automatically completed
+	 * when "<code></</code>" is typed.  Note that this property is only
+	 * honored for markup languages, such as HTML, XML and PHP.<p>
+	 *
+	 * This method fires a property change event of type
+	 * {@link #CLOSE_MARKUP_TAGS_PROPERTY}.
+	 *
+	 * @param close Whether closing markup tags should be automatically
+	 *        completed.
+	 * @see #getCloseMarkupTags()
+	 */
+	public void setCloseMarkupTags(boolean close) {
+		if (close!=closeMarkupTags) {
+			closeMarkupTags = close;
+			firePropertyChange(CLOSE_MARKUP_TAGS_PROPERTY, !close, close);
+		}
+	}
+
+
+	/**
+	 * Sets whether code folding is enabled.  Note that only certain
+	 * languages will support code folding out of the box.  Those languages
+	 * which do not support folding will ignore this property.<p>
+	 * This method fires a property change event of type
+	 * {@link #CODE_FOLDING_PROPERTY}.
+	 *
+	 * @param enabled Whether code folding should be enabled.
+	 * @see #isCodeFoldingEnabled()
+	 */
+	public void setCodeFoldingEnabled(boolean enabled) {
+		if (enabled!=foldManager.isCodeFoldingEnabled()) {
+			foldManager.setCodeFoldingEnabled(enabled);
+			firePropertyChange(CODE_FOLDING_PROPERTY, !enabled, enabled);
+		}
+	}
+
+
+	/**
+	 * Sets anti-aliasing to whatever the user's desktop vaule is.
+	 *
+	 * @see #getAntiAliasingEnabled()
+	 */
+	private final void setDefaultAntiAliasingState() {
+
+		// Most accurate technique, but not available on all OSes.
+		aaHints = RSyntaxUtilities.getDesktopAntiAliasHints();
+		if (aaHints==null) {
+
+			aaHints = new HashMap();
+
+			// In Java 6+, you can figure out what text AA hint Swing uses for
+			// JComponents...
+			JLabel label = new JLabel();
+			FontMetrics fm = label.getFontMetrics(label.getFont());
+			Object hint = null;
+			//FontRenderContext frc = fm.getFontRenderContext();
+			//hint = fm.getAntiAliasingHint();
+			try {
+				Method m = FontMetrics.class.getMethod("getFontRenderContext", null);
+				FontRenderContext frc = (FontRenderContext)m.invoke(fm, null);
+				m = FontRenderContext.class.getMethod("getAntiAliasingHint", null);
+				hint = m.invoke(frc, null);
+			} catch (RuntimeException re) {
+				throw re; // FindBugs
+			} catch (Exception e) {
+				// Swallow, either Java 1.4 or 1.5, or running in an applet
+			}
+
+			// If not running Java 6+, default to AA enabled on Windows where
+			// the software AA is pretty fast, and default (e.g. disabled) on
+			// non-Windows.  Note that OS X always uses AA no matter what
+			// rendering hints you give it, so this is a moot point there.
+			//System.out.println("Rendering hint: " + hint);
+			if (hint==null) {
+				String os = System.getProperty("os.name").toLowerCase();
+				if (os.indexOf("windows")>-1) {
+					hint = RenderingHints.VALUE_TEXT_ANTIALIAS_ON;
+				}
+				else {
+					hint = RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT;
+				}
+			}
+			aaHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, hint);
+
+		}
+
+		// We must be connected to a screen resource for our graphics
+		// to be non-null.
+		if (isDisplayable()) {
+			refreshFontMetrics(getGraphics2D(getGraphics()));
+		}
+		repaint();
+
+	}
+
+
+	/**
+	 * Sets the document used by this text area.  This is overridden so that
+	 * only instances of {@link RSyntaxDocument} are accepted; for all
+	 * others, an exception will be thrown.
+	 *
+	 * @param document The new document for this text area.
+	 * @throws IllegalArgumentException If the document is not an
+	 *         <code>RSyntaxDocument</code>.
+	 */
+	public void setDocument(Document document) {
+		if (!(document instanceof RSyntaxDocument))
+			throw new IllegalArgumentException("Documents for " +
+					"RSyntaxTextArea must be instances of " +
+					"RSyntaxDocument!");
+		super.setDocument(document);
+	}
+
+
+	/**
+	 * Sets whether EOL markers are visible at the end of each line.  This
+	 * method fires a property change of type {@link #EOL_VISIBLE_PROPERTY}.
+	 *
+	 * @param visible Whether EOL markers are visible.
+	 * @see #getEOLMarkersVisible()
+	 * @see #setWhitespaceVisible(boolean)
+	 */
+	public void setEOLMarkersVisible(boolean visible) {
+		if (visible!=eolMarkersVisible) {
+			eolMarkersVisible = visible;
+			repaint();
+			firePropertyChange(EOL_VISIBLE_PROPERTY, !visible, visible);
+		}
+	}
+
+
+	/**
+	 * Sets the font used by this text area.  Note that if some token styles
+	 * are using a different font, they will not be changed by calling this
+	 * method.  To set different fonts on individual token types, use the
+	 * text area's <code>SyntaxScheme</code>.
+	 *
+	 * @param font The font.
+	 * @see SyntaxScheme#getStyle(int)
+	 */
+	public void setFont(Font font) {
+
+		Font old = super.getFont();
+		super.setFont(font); // Do this first.
+
+		// Usually programmers keep a single font for all token types, but
+		// may use bold or italic for styling some.
+		SyntaxScheme scheme = getSyntaxScheme();
+		if (scheme!=null && old!=null) {
+			scheme.changeBaseFont(old, font);
+			calculateLineHeight();
+		}
+
+		// We must be connected to a screen resource for our
+		// graphics to be non-null.
+		if (isDisplayable()) {
+			refreshFontMetrics(getGraphics2D(getGraphics()));
+			// Updates the margin line.
+			updateMarginLineX();
+			// Force the current line highlight to be repainted, even
+			// though the caret's location hasn't changed.
+			forceCurrentLineHighlightRepaint();
+			// Get line number border in text area to repaint again
+			// since line heights have updated.
+			firePropertyChange("font", old, font);
+			// So parent JScrollPane will have its scrollbars updated.
+			revalidate();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether fractional font metrics are enabled.  This method fires
+	 * a property change event of type {@link #FRACTIONAL_FONTMETRICS_PROPERTY}.
+	 *
+	 * @param enabled Whether fractional font metrics are enabled.
+	 * @see #getFractionalFontMetricsEnabled()
+	 */
+	public void setFractionalFontMetricsEnabled(boolean enabled) {
+		if (fractionalFontMetricsEnabled!=enabled) {
+			fractionalFontMetricsEnabled = enabled;
+			// We must be connected to a screen resource for our graphics to be
+			// non-null.
+			if (isDisplayable()) {
+				refreshFontMetrics(getGraphics2D(getGraphics()));
+			}
+			firePropertyChange(FRACTIONAL_FONTMETRICS_PROPERTY,
+											!enabled, enabled);
+		}
+	}
+
+
+	/**
+	 * Sets the highlighter used by this text area.
+	 *
+	 * @param h The highlighter.
+	 * @throws IllegalArgumentException If <code>h</code> is not an instance
+	 *         of {@link RSyntaxTextAreaHighlighter}.
+	 */
+	public void setHighlighter(Highlighter h) {
+		if (!(h instanceof RSyntaxTextAreaHighlighter)) {
+			throw new IllegalArgumentException("RSyntaxTextArea requires " +
+				"an RSyntaxTextAreaHighlighter for its Highlighter");
+		}
+		super.setHighlighter(h);
+	}
+
+
+	/**
+	 * Sets whether "secondary" languages should have their backgrounds
+	 * colored differently to visually differentiate them.  This feature
+	 * imposes a fair performance penalty.  This method fires a property change
+	 * event of type {@link #HIGHLIGHT_SECONDARY_LANGUAGES_PROPERTY}.
+	 *
+	 * @return Whether secondary languages have their backgrounds colored
+	 *         differently.
+	 * @see #getHighlightSecondaryLanguages()
+	 * @see #setSecondaryLanguageBackground(int, Color)
+	 * @see #getSecondaryLanguageCount()
+	 */
+	public void setHighlightSecondaryLanguages(boolean highlight) {
+		if (this.highlightSecondaryLanguages!=highlight) {
+			highlightSecondaryLanguages = highlight;
+			repaint();
+			firePropertyChange(HIGHLIGHT_SECONDARY_LANGUAGES_PROPERTY,
+					!highlight, highlight);
+		}
+	}
+
+
+	/**
+	 * Sets the color to use when painting hyperlinks.
+	 *
+	 * @param fg The color to use when painting hyperlinks.
+	 * @throws NullPointerException If <code>fg</code> is <code>null</code>.
+	 * @see #getHyperlinkForeground()
+	 * @see #setHyperlinksEnabled(boolean)
+	 */
+	public void setHyperlinkForeground(Color fg) {
+		if (fg==null) {
+			throw new NullPointerException("fg cannot be null");
+		}
+		hyperlinkFG = fg;
+	}
+
+
+	/**
+	 * Sets whether hyperlinks are enabled for this text area.  This method
+	 * fires a property change event of type
+	 * {@link #HYPERLINKS_ENABLED_PROPERTY}.
+	 *
+	 * @param enabled Whether hyperlinks are enabled.
+	 * @see #getHyperlinksEnabled()
+	 */
+	public void setHyperlinksEnabled(boolean enabled) {
+		if (this.hyperlinksEnabled!=enabled) {
+			this.hyperlinksEnabled = enabled;
+			repaint();
+			firePropertyChange(HYPERLINKS_ENABLED_PROPERTY, !enabled, enabled);
+		}
+	}
+
+
+	public void setLinkGenerator(LinkGenerator generator) {
+		this.linkGenerator = generator;
+	}
+
+
+	/**
+	 * Sets the mask for the key used to toggle whether we are scanning for
+	 * hyperlinks with mouse hovering.
+	 *
+	 * @param mask The mask to use.  This should be a value such as
+	 *        {@link InputEvent#CTRL_DOWN_MASK} or
+	 *        {@link InputEvent#META_DOWN_MASK}.
+	 *        For invalid values, behavior is undefined.
+	 * @see InputEvent
+	 */
+	public void setLinkScanningMask(int mask) {
+		if (mask==InputEvent.CTRL_DOWN_MASK ||
+				mask==InputEvent.META_DOWN_MASK ||
+				mask==InputEvent.ALT_DOWN_MASK ||
+				mask==InputEvent.SHIFT_DOWN_MASK) {
+			linkScanningMask = mask;
+		}
+	}
+
+
+	/**
+	 * Toggles whether "mark occurrences" is enabled.  This method fires a
+	 * property change event of type {@link #MARK_OCCURRENCES_PROPERTY}.
+	 *
+	 * @param markOccurrences Whether "Mark Occurrences" should be enabled.
+	 * @see #getMarkOccurrences()
+	 * @see #setMarkOccurrencesColor(Color)
+	 */
+	public void setMarkOccurrences(boolean markOccurrences) {
+		if (markOccurrences) {
+			if (markOccurrencesSupport==null) {
+				markOccurrencesSupport = new MarkOccurrencesSupport();
+				markOccurrencesSupport.install(this);
+				firePropertyChange(MARK_OCCURRENCES_PROPERTY, false, true);
+			}
+		}
+		else {
+			if (markOccurrencesSupport!=null) {
+				markOccurrencesSupport.uninstall();
+				markOccurrencesSupport = null;
+				firePropertyChange(MARK_OCCURRENCES_PROPERTY, true, false);
+			}
+		}
+	}
+
+
+	/**
+	 * Sets the "mark occurrences" color.
+	 *
+	 * @param color The new color.  This cannot be <code>null</code>.
+	 * @see #getMarkOccurrencesColor()
+	 * @see #setMarkOccurrences(boolean)
+	 */
+	public void setMarkOccurrencesColor(Color color) {
+		markOccurrencesColor = color;
+		if (markOccurrencesSupport!=null) {
+			markOccurrencesSupport.setColor(color);
+		}
+	}
+
+
+	/**
+	 * Sets the color used as the background for a matched bracket.
+	 *
+	 * @param color The color to use.  If this is <code>null</code>, then no
+	 *        special background is painted behind a matched bracket.
+	 * @see #getMatchedBracketBGColor
+	 * @see #setMatchedBracketBorderColor
+	 * @see #setPaintMarkOccurrencesBorder(boolean)
+	 */
+	public void setMatchedBracketBGColor(Color color) {
+		matchedBracketBGColor = color;
+		if (match!=null) {
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Sets the color used as the border for a matched bracket.
+	 *
+	 * @param color The color to use.
+	 * @see #getMatchedBracketBorderColor
+	 * @see #setMatchedBracketBGColor
+	 */
+	public void setMatchedBracketBorderColor(Color color) {
+		matchedBracketBorderColor = color;
+		if (match!=null) {
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Toggles whether a border should be painted around marked occurrences.
+	 *
+	 * @param paintBorder Whether to paint a border.
+	 * @see #getPaintMarkOccurrencesBorder()
+	 * @see #setMarkOccurrencesColor(Color)
+	 * @see #setMarkOccurrences(boolean)
+	 */
+	public void setPaintMarkOccurrencesBorder(boolean paintBorder) {
+		paintMarkOccurrencesBorder = paintBorder;
+		if (markOccurrencesSupport!=null) {
+			markOccurrencesSupport.setPaintBorder(paintBorder);
+		}
+	}
+
+
+	/**
+	 * Sets whether the bracket at the caret position is painted as a "match"
+	 * when a matched bracket is found.  Note that this property does nothing
+	 * if {@link #isBracketMatchingEnabled()} returns <code>false</code>.<p>
+	 *
+	 * This method fires a property change event of type
+	 * {@link #PAINT_MATCHED_BRACKET_PAIR_PROPERTY}.
+	 * 
+	 * @param paintPair Whether both brackets in a bracket pair should be
+	 *        highlighted when bracket matching is enabled.
+	 * @see #getPaintMatchedBracketPair()
+	 * @see #isBracketMatchingEnabled()
+	 * @see #setBracketMatchingEnabled(boolean)
+	 */
+	public void setPaintMatchedBracketPair(boolean paintPair) {
+		if (paintPair!=paintMatchedBracketPair) {
+			paintMatchedBracketPair = paintPair;
+			doBracketMatching();
+			repaint();
+			firePropertyChange(PAINT_MATCHED_BRACKET_PAIR_PROPERTY,
+					!paintMatchedBracketPair, paintMatchedBracketPair);
+		}
+	}
+
+
+	/**
+	 * Toggles whether tab lines are painted.  This method fires a property
+	 * change event of type {@link #TAB_LINES_PROPERTY}.
+	 *
+	 * @param paint Whether tab lines are painted.
+	 * @see #getPaintTabLines()
+	 * @see #setTabLineColor(Color)
+	 */
+	public void setPaintTabLines(boolean paint) {
+		if (paint!=paintTabLines) {
+			paintTabLines = paint;
+			repaint();
+			firePropertyChange(TAB_LINES_PROPERTY, !paint, paint);
+		}
+	}
+
+
+	/**
+	 * Sets the background color to use for a secondary language.
+	 *
+	 * @param index The language index.  Note that these are 1-based, not
+	 *        0-based, and should be in the range
+	 *        <code>1-getSecondaryLanguageCount()</code>, inclusive.
+	 * @param color The new color, or <code>null</code> for none.
+	 * @see #getSecondaryLanguageBackground(int)
+	 * @see #getSecondaryLanguageCount()
+	 */
+	public void setSecondaryLanguageBackground(int index, Color color) {
+		index--;
+		Color old = secondaryLanguageBackgrounds[index];
+		if ((color==null && old!=null) || (color!=null && !color.equals(old))) {
+			secondaryLanguageBackgrounds[index] = color;
+			if (getHighlightSecondaryLanguages()) {
+				repaint();
+			}
+		}
+	}
+
+
+	/**
+	 * Sets what type of syntax highlighting this editor is doing.  This method
+	 * fires a property change of type {@link #SYNTAX_STYLE_PROPERTY}.
+	 *
+	 * @param styleKey The syntax editing style to use, for example,
+	 *        {@link SyntaxConstants#SYNTAX_STYLE_NONE} or
+	 *        {@link SyntaxConstants#SYNTAX_STYLE_JAVA}.
+	 * @see #getSyntaxEditingStyle()
+	 * @see SyntaxConstants
+	 */
+	public void setSyntaxEditingStyle(String styleKey) {
+		if (styleKey==null) {
+			styleKey = SYNTAX_STYLE_NONE;
+		}
+		if (!styleKey.equals(syntaxStyleKey)) {
+			String oldStyle = syntaxStyleKey;
+			syntaxStyleKey = styleKey;
+			((RSyntaxDocument)getDocument()).setSyntaxStyle(styleKey);
+			firePropertyChange(SYNTAX_STYLE_PROPERTY, oldStyle, styleKey);
+			setActiveLineRange(-1, -1);
+		}
+
+	}
+
+
+	/**
+	 * Sets all of the colors used in syntax highlighting to the colors
+	 * specified.  This uses a shallow copy of the color scheme so that
+	 * multiple text areas can share the same color scheme and have their
+	 * properties changed simultaneously.<p>
+	 *
+	 * This method fires a property change event of type
+	 * {@link #SYNTAX_SCHEME_PROPERTY}.
+	 *
+	 * @param scheme The instance of <code>SyntaxScheme</code> to use.
+	 * @see #getSyntaxScheme()
+	 */
+	public void setSyntaxScheme(SyntaxScheme scheme) {
+
+		// NOTE:  We don't check whether colorScheme is the same as the
+		// current scheme because DecreaseFontSizeAction and
+		// IncreaseFontSizeAction need it this way.
+		// FIXME:  Find a way around this.
+
+		SyntaxScheme old = this.syntaxScheme;
+		this.syntaxScheme = scheme;
+
+		// Recalculate the line height.  We do this here instead of in
+		// refreshFontMetrics() as this method is called less often and we
+		// don't need the rendering hints to get the font's height.
+		calculateLineHeight();
+
+		if (isDisplayable()) {
+			refreshFontMetrics(getGraphics2D(getGraphics()));
+		}
+
+		// Updates the margin line.
+		updateMarginLineX();
+
+		// Force the current line highlight to be repainted, even though
+		// the caret's location hasn't changed.
+		forceCurrentLineHighlightRepaint();
+
+		// So encompassing JScrollPane will have its scrollbars updated.
+		revalidate();
+
+		firePropertyChange(SYNTAX_SCHEME_PROPERTY, old, this.syntaxScheme);
+
+	}
+
+
+	/**
+	 * If templates are enabled, all currently-known templates are forgotten
+	 * and all templates are loaded from all files in the specified directory
+	 * ending in "*.xml".  If templates aren't enabled, nothing happens.
+	 *
+	 * @param dir The directory containing files ending in extension
+	 *        <code>.xml</code> that contain templates to load.
+	 * @return <code>true</code> if the load was successful;
+	 *         <code>false</code> if either templates aren't currently
+	 *         enabled or the load failed somehow (most likely, the
+	 *         directory doesn't exist).	 
+	 * @see #getTemplatesEnabled
+	 * @see #setTemplatesEnabled
+	 * @see #saveTemplates
+	 */
+	public static synchronized boolean setTemplateDirectory(String dir) {
+		if (getTemplatesEnabled() && dir!=null) {
+			File directory = new File(dir);
+			if (directory.isDirectory()) {
+				return getCodeTemplateManager().
+						setTemplateDirectory(directory)>-1;
+			}
+			boolean created = directory.mkdir();
+			if (created) {
+				return getCodeTemplateManager().
+					setTemplateDirectory(directory)>-1;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Enables or disables templates.<p>
+	 *
+	 * Templates are a set of "shorthand identifiers" that you can configure
+	 * so that you only have to type a short identifier (such as "forb") to
+	 * insert a larger amount of code into the document (such as:<p>
+	 *
+	 * <pre>
+	 *   for (<caret>) {
+	 *
+	 *   }
+	 * </pre>
+	 *
+	 * Templates are a shared resource among all instances of
+	 * <code>RSyntaxTextArea</code>; that is, templates can only be
+	 * enabled/disabled for all text areas globally, not individually, and
+	 * all text areas have access of the same templates.  This should not
+	 * be an issue; rather, it should be beneficial as it promotes
+	 * uniformity among all text areas in an application.
+	 *
+	 * @param enabled Whether or not templates should be enabled.
+	 * @see #getTemplatesEnabled()
+	 */
+	public static synchronized void setTemplatesEnabled(boolean enabled) {
+		templatesEnabled = enabled;
+	}
+
+
+	/**
+	 * Sets the color use to paint tab lines.  This method fires a property
+	 * change event of type {@link #TAB_LINE_COLOR_PROPERTY}.
+	 *
+	 * @param c The color.  If this value is <code>null</code>, the default
+	 *        (gray) is used.
+	 * @see #getTabLineColor()
+	 * @see #setPaintTabLines(boolean)
+	 * @see #getPaintTabLines()
+	 */
+	public void setTabLineColor(Color c) {
+
+		if (c==null) {
+			c = Color.gray;
+		}
+
+		if (!c.equals(tabLineColor)) {
+			Color old = tabLineColor;
+			tabLineColor = c;
+			if (getPaintTabLines()) {
+				repaint();
+			}
+			firePropertyChange(TAB_LINE_COLOR_PROPERTY, old, tabLineColor);
+		}
+
+	}
+
+
+	/**
+	 * Sets whether "focusable" tool tips are used instead of standard ones.
+	 * Focusable tool tips are tool tips that the user can click on,
+	 * resize, copy from, and clink links in.  This method fires a property
+	 * change event of type {@link #FOCUSABLE_TIPS_PROPERTY}.
+	 *
+	 * @param use Whether to use focusable tool tips.
+	 * @see #getUseFocusableTips()
+	 * @see FocusableTip
+	 */
+	public void setUseFocusableTips(boolean use) {
+		if (use!=useFocusableTips) {
+			useFocusableTips = use;
+			firePropertyChange(FOCUSABLE_TIPS_PROPERTY, !use, use);
+		}
+	}
+
+
+	/**
+	 * Sets whether selected text should use the "selected text color" property
+	 * (set via {@link #setSelectedTextColor(Color)}).  This is the typical
+	 * behavior of text components.  By default, RSyntaxTextArea does not do
+	 * this, so that token styles are visible even in selected regions of text.
+	 * This method fires a property change event of type
+	 * {@link #USE_SELECTED_TEXT_COLOR_PROPERTY}.
+	 *
+	 * @param use Whether to use the "selected text" color when painting text
+	 *        in selected regions.
+	 * @see #getUseSelectedTextColor()
+	 */
+	public void setUseSelectedTextColor(boolean use) {
+		if (use!=useSelectedTextColor) {
+			useSelectedTextColor = use;
+			firePropertyChange(USE_SELECTED_TEXT_COLOR_PROPERTY, !use, use);
+		}
+	}
+
+
+	/**
+	 * Sets whether whitespace is visible.  This method fires a property change
+	 * of type {@link #VISIBLE_WHITESPACE_PROPERTY}.
+	 *
+	 * @param visible Whether whitespace should be visible.
+	 * @see #isWhitespaceVisible()
+	 */
+	public void setWhitespaceVisible(boolean visible) {
+		if (whitespaceVisible!=visible) {
+			this.whitespaceVisible = visible;
+			tokenPainter = visible ? new VisibleWhitespaceTokenPainter() :
+					(TokenPainter)new DefaultTokenPainter();
+			repaint();
+			firePropertyChange(VISIBLE_WHITESPACE_PROPERTY, !visible, visible);
+		}
+	}
+
+
+	/**
+	 * Resets the editor state after the user clicks on a hyperlink or releases
+	 * the hyperlink modifier.
+	 */
+	private void stopScanningForLinks() {
+		if (isScanningForLinks) {
+			Cursor c = getCursor();
+			isScanningForLinks = false;
+			linkGeneratorResult = null;
+			hoveredOverLinkOffset = -1;
+			if (c!=null && c.getType()==Cursor.HAND_CURSOR) {
+				setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
+				repaint(); // TODO: Repaint just the affected line.
+			}
+		}
+	}
+
+
+	/**
+	 * Returns the token at the specified position in the view.
+	 *
+	 * @param p The position in the view.
+	 * @return The token, or <code>null</code> if no token is at that
+	 *         position.
+	 * @see #modelToToken(int)
+	 */
+	/*
+	 * TODO: This is a little inefficient.  This should convert view
+	 * coordinates to the underlying token (if any).  The way things currently
+	 * are, we're calling getTokenListForLine() twice (once in viewToModel()
+	 * and once here).
+	 */
+	public Token viewToToken(Point p) {
+		return modelToToken(viewToModel(p));
+	}
+
+
+	/**
+	 * A timer that animates the "bracket matching" animation.
+	 */
+	private class BracketMatchingTimer extends Timer implements ActionListener {
+
+		private int pulseCount;
+
+		public BracketMatchingTimer() {
+			super(20, null);
+			addActionListener(this);
+			setCoalesce(false);
+		}
+
+		public void actionPerformed(ActionEvent e) {
+			if (isBracketMatchingEnabled()) {
+				if (match!=null) {
+					updateAndInvalidate(match);
+				}
+				if (dotRect!=null && getPaintMatchedBracketPair()) {
+					updateAndInvalidate(dotRect);
+				}
+				if (++pulseCount==8) {
+					pulseCount = 0;
+					stop();
+				}
+			}
+		}
+
+		private void init(Rectangle r) {
+			r.x += 3;
+			r.y += 3;
+			r.width -= 6;
+			r.height -= 6; // So animation can "grow" match
+		}
+
+		public void start() {
+			init(match);
+			if (dotRect!=null && getPaintMatchedBracketPair()) {
+				init(dotRect);
+			}
+			pulseCount = 0;
+			super.start();
+		}
+
+		private void updateAndInvalidate(Rectangle r) {
+			if (pulseCount<5) {
+				r.x--;
+				r.y--;
+				r.width += 2;
+				r.height += 2;
+				repaint(r.x,r.y, r.width,r.height);
+			}
+			else if (pulseCount<7) {
+				r.x++;
+				r.y++;
+				r.width -= 2;
+				r.height -= 2;
+				repaint(r.x-2,r.y-2, r.width+5,r.height+5);
+			}
+		}
+
+	}
+
+
+	/**
+	 * Handles hyperlinks.
+	 */
+	private class RSyntaxTextAreaMutableCaretEvent
+					extends RTextAreaMutableCaretEvent {
+
+		protected RSyntaxTextAreaMutableCaretEvent(RTextArea textArea) {
+			super(textArea);
+		}
+
+		private HyperlinkEvent createHyperlinkEvent() {
+			HyperlinkEvent he = null;
+			if (linkGeneratorResult!=null) {
+				he = linkGeneratorResult.execute();
+				linkGeneratorResult = null;
+			}
+			else {
+				Token t = modelToToken(hoveredOverLinkOffset);
+				URL url = null;
+				String desc = null;
+				try {
+					String temp = t.getLexeme();
+					// URI's need "http://" prefix for web URL's to work.
+					if (temp.startsWith("www.")) {
+						temp = "http://" + temp;
+					}
+					url = new URL(temp);
+				} catch (MalformedURLException mue) {
+					desc = mue.getMessage();
+				}
+				he = new HyperlinkEvent(RSyntaxTextArea.this,
+						HyperlinkEvent.EventType.ACTIVATED,
+						url, desc);
+			}
+			return he;
+		}
+
+		private final boolean equal(LinkGeneratorResult e1,
+				LinkGeneratorResult e2) {
+			return e1.getSourceOffset()==e2.getSourceOffset();
+		}
+
+		public void mouseClicked(MouseEvent e) {
+			if (getHyperlinksEnabled() && isScanningForLinks &&
+					hoveredOverLinkOffset>-1) {
+				HyperlinkEvent he = createHyperlinkEvent();
+				if (he!=null) {
+					fireHyperlinkUpdate(he);
+				}
+				stopScanningForLinks();
+			}
+		}
+
+		public void mouseMoved(MouseEvent e) {
+			super.mouseMoved(e);
+			if (getHyperlinksEnabled()) {
+				if ((e.getModifiersEx()&linkScanningMask)!=0) {
+					isScanningForLinks = true;
+					Token t = viewToToken(e.getPoint());
+					Cursor c2 = null;
+					if (t!=null && t.isHyperlink()) {
+						hoveredOverLinkOffset = t.offset;
+						c2 = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
+					}
+					else if (t!=null && linkGenerator!=null) {
+						int offs = viewToModel(e.getPoint());
+						LinkGeneratorResult newResult = linkGenerator.
+								isLinkAtOffset(RSyntaxTextArea.this, offs);
+						if (newResult!=null) {
+							// Repaint if we're at a new link now.
+							if (linkGeneratorResult==null ||
+									!equal(newResult, linkGeneratorResult)) {
+								repaint();
+							}
+							linkGeneratorResult = newResult;
+							hoveredOverLinkOffset = t.offset;
+							c2 = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
+						}
+						else {
+							// Repaint if we've moved off of a link.
+							if (linkGeneratorResult!=null) {
+								repaint();
+							}
+							c2 = Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR);
+							hoveredOverLinkOffset = -1;
+							linkGeneratorResult = null;
+						}
+					}
+					else {
+						c2 = Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR);
+						hoveredOverLinkOffset = -1;
+						linkGeneratorResult = null;
+					}
+					if (getCursor()!=c2) {
+						setCursor(c2);
+						// TODO: Repaint just the affected line(s).
+						repaint(); // Link either left or went into.
+					}
+				}
+				else {
+					if (isScanningForLinks) {
+						stopScanningForLinks();
+					}
+				}
+			}
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaDefaultInputMap.java b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaDefaultInputMap.java
new file mode 100644
index 0000000..f8866c8
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaDefaultInputMap.java
@@ -0,0 +1,79 @@
+/*
+ * 10/27/2004
+ *
+ * RSyntaxTextAreaDefaultInputMap.java - The default input map for
+ * RSyntaxTextAreas.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.KeyStroke;
+
+import org.fife.ui.rtextarea.RTADefaultInputMap;
+
+
+/**
+ * The default input map for an <code>RSyntaxTextArea</code>.
+ * Currently, the new key bindings include:
+ * <ul>
+ *   <li>Shift+Tab indents the current line or currently selected lines
+ *       to the left.
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RSyntaxTextAreaDefaultInputMap extends RTADefaultInputMap {
+
+	/**
+	 * Constructs the default input map for an <code>RSyntaxTextArea</code>.
+	 */
+	public RSyntaxTextAreaDefaultInputMap() {
+
+		int defaultMod = getDefaultModifier();
+		//int ctrl = InputEvent.CTRL_MASK;
+		int shift = InputEvent.SHIFT_MASK;
+		//int alt = InputEvent.ALT_MASK;
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB,   shift),				RSyntaxTextAreaEditorKit.rstaDecreaseIndentAction);
+		put(KeyStroke.getKeyStroke('}'),									RSyntaxTextAreaEditorKit.rstaCloseCurlyBraceAction);
+
+		put(KeyStroke.getKeyStroke('/'), 									RSyntaxTextAreaEditorKit.rstaCloseMarkupTagAction);
+		int os = RSyntaxUtilities.getOS();
+		if (os==RSyntaxUtilities.OS_WINDOWS || os==RSyntaxUtilities.OS_MAC_OSX) {
+			// *nix causes trouble with CloseMarkupTagAction and ToggleCommentAction.
+			// It triggers both KEY_PRESSED ctrl+'/' and KEY_TYPED '/' events when the
+			// user presses ctrl+'/', but Windows and OS X do not.  If we try to "move"
+			// the KEY_TYPED event for '/' to KEY_PRESSED, it'll work for Linux boxes
+			// with QWERTY keyboard layouts, but non-QUERTY users won't be able to type
+			// a '/' character at all then (!).  Rather than try to hack together a
+			// solution by trying to detect the IM locale and do different things for
+			// different OSes & keyboard layouts, we do the simplest thing and
+			// (unfortunately) don't have a ToggleCommentAction for *nix out-of-the-box.
+			// Applications can add one easily enough if they want one.
+			put(KeyStroke.getKeyStroke(KeyEvent.VK_SLASH, defaultMod),		RSyntaxTextAreaEditorKit.rstaToggleCommentAction);
+		}
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_OPEN_BRACKET, defaultMod),	RSyntaxTextAreaEditorKit.rstaGoToMatchingBracketAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_SUBTRACT, defaultMod),		RSyntaxTextAreaEditorKit.rstaCollapseFoldAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_ADD, defaultMod),			RSyntaxTextAreaEditorKit.rstaExpandFoldAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DIVIDE, defaultMod),			RSyntaxTextAreaEditorKit.rstaCollapseAllFoldsAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_MULTIPLY, defaultMod),		RSyntaxTextAreaEditorKit.rstaExpandAllFoldsAction);
+
+		// FIXME:  The keystroke associated with this action should be dynamic and
+		// configurable and synchronized with the "trigger" defined in RSyntaxTextArea's
+		// CodeTemplateManager.
+		// NOTE:  no modifiers => mapped to keyTyped.  If we had "0" as a second
+		// second parameter, we'd get the template action (keyPressed) AND the
+		// default space action (keyTyped).
+		//put(KeyStroke.getKeyStroke(' '),			RSyntaxTextAreaEditorKit.rstaPossiblyInsertTemplateAction);
+		put(CodeTemplateManager.TEMPLATE_KEYSTROKE,	RSyntaxTextAreaEditorKit.rstaPossiblyInsertTemplateAction);
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java
new file mode 100644
index 0000000..519c7d1
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java
@@ -0,0 +1,1903 @@
+/*
+ * 08/29/2004
+ *
+ * RSyntaxTextAreaEditorKit.java - The editor kit used by RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.ResourceBundle;
+import java.util.Stack;
+import javax.swing.*;
+import javax.swing.text.*;
+
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldCollapser;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+import org.fife.ui.rsyntaxtextarea.templates.CodeTemplate;
+import org.fife.ui.rtextarea.Gutter;
+import org.fife.ui.rtextarea.IconRowHeader;
+import org.fife.ui.rtextarea.RecordableTextAction;
+import org.fife.ui.rtextarea.RTextArea;
+import org.fife.ui.rtextarea.RTextAreaEditorKit;
+
+
+/**
+ * An extension of <code>RTextAreaEditorKit</code> that adds functionality for
+ * programming-specific stuff.  There are currently subclasses to handle:
+ *
+ * <ul>
+ *   <li>Toggling code folds.</li>
+ *   <li>Aligning "closing" curly braces with their matches, if the current
+ *       programming language uses curly braces to identify code blocks.</li>
+ *   <li>Copying the current selection as RTF.</li>
+ *   <li>Block indentation (increasing the indent of one or multiple lines)</li>
+ *   <li>Block un-indentation (decreasing the indent of one or multiple lines)
+ *       </li>
+ *   <li>Inserting a "code template" when a configurable key (e.g. a space) is
+ *       pressed</li>
+ *   <li>Decreasing the point size of all fonts in the text area</li>
+ *   <li>Increasing the point size of all fonts in the text area</li>
+ *   <li>Moving the caret to the "matching bracket" of the one at the current
+ *       caret position</li>
+ *   <li>Toggling whether the currently selected lines are commented out.</li>
+ *   <li>Better selection of "words" on mouse double-clicks for programming
+ *       languages.</li>
+ *   <li>Better keyboard navigation via Ctrl+arrow keys for programming
+ *       languages.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ */
+public class RSyntaxTextAreaEditorKit extends RTextAreaEditorKit {
+
+	private static final long serialVersionUID = 1L;
+
+	public static final String rstaCloseCurlyBraceAction	= "RSTA.CloseCurlyBraceAction";
+	public static final String rstaCloseMarkupTagAction		= "RSTA.CloseMarkupTagAction";
+	public static final String rstaCollapseAllFoldsAction	= "RSTA.CollapseAllFoldsAction";
+	public static final String rstaCollapseAllCommentFoldsAction = "RSTA.CollapseAllCommentFoldsAction";
+	public static final String rstaCollapseFoldAction		= "RSTA.CollapseFoldAction";
+	public static final String rstaCopyAsRtfAction			= "RSTA.CopyAsRtfAction";
+	public static final String rstaDecreaseIndentAction		= "RSTA.DecreaseIndentAction";
+	public static final String rstaExpandAllFoldsAction		= "RSTA.ExpandAllFoldsAction";
+	public static final String rstaExpandFoldAction			= "RSTA.ExpandFoldAction";
+	public static final String rstaGoToMatchingBracketAction	= "RSTA.GoToMatchingBracketAction";
+	public static final String rstaPossiblyInsertTemplateAction = "RSTA.TemplateAction";
+	public static final String rstaToggleCommentAction 		= "RSTA.ToggleCommentAction";
+	public static final String rstaToggleCurrentFoldAction	= "RSTA.ToggleCurrentFoldAction";
+
+	private static final String MSG	= "org.fife.ui.rsyntaxtextarea.RSyntaxTextArea";
+	private static final ResourceBundle msg = ResourceBundle.getBundle(MSG);
+
+
+	/**
+	 * The actions that <code>RSyntaxTextAreaEditorKit</code> adds to those of
+	 * <code>RTextAreaEditorKit</code>.
+	 */
+	private static final Action[] defaultActions = {
+		new CloseCurlyBraceAction(),
+		new CloseMarkupTagAction(),
+		new BeginWordAction(beginWordAction, false),
+		new BeginWordAction(selectionBeginWordAction, true),
+		new ChangeFoldStateAction(rstaCollapseFoldAction, true),
+		new ChangeFoldStateAction(rstaExpandFoldAction, false),
+		new CollapseAllFoldsAction(),
+		new CopyAsRtfAction(),
+		//new DecreaseFontSizeAction(),
+		new DecreaseIndentAction(),
+		new DeletePrevWordAction(),
+		new EndAction(endAction, false),
+		new EndAction(selectionEndAction, true),
+		new EndWordAction(endWordAction, false),
+		new EndWordAction(endWordAction, true),
+		new ExpandAllFoldsAction(),
+		new GoToMatchingBracketAction(),
+		new InsertBreakAction(),
+		//new IncreaseFontSizeAction(),
+		new InsertTabAction(),
+		new NextWordAction(nextWordAction, false),
+		new NextWordAction(selectionNextWordAction, true),
+		new PossiblyInsertTemplateAction(),
+		new PreviousWordAction(previousWordAction, false),  
+		new PreviousWordAction(selectionPreviousWordAction, true),
+		new SelectWordAction(),
+		new ToggleCommentAction(),
+	};
+
+
+	/**
+	 * Constructor.
+	 */
+	public RSyntaxTextAreaEditorKit() {
+	}
+
+
+	/**
+	 * Returns the default document used by <code>RSyntaxTextArea</code>s.
+	 *
+	 * @return The document.
+	 */
+	public Document createDefaultDocument() {
+		return new RSyntaxDocument(SyntaxConstants.SYNTAX_STYLE_NONE);
+	}
+
+
+	/**
+	 * Overridden to return a row header that is aware of folding.
+	 *
+	 * @param textArea The text area.
+	 * @return The icon row header.
+	 */
+	public IconRowHeader createIconRowHeader(RTextArea textArea) {
+		return new FoldingAwareIconRowHeader((RSyntaxTextArea)textArea);
+	}
+
+
+	/**
+	 * Fetches the set of commands that can be used
+	 * on a text component that is using a model and
+	 * view produced by this kit.
+	 *
+	 * @return the command list
+	 */ 
+	public Action[] getActions() {
+		return TextAction.augmentList(super.getActions(),
+							RSyntaxTextAreaEditorKit.defaultActions);
+	}
+
+
+	/**
+	 * Returns localized text for an action.  There's definitely a better place
+	 * for this functionality.
+	 *
+	 * @param key The key into the action resource bundle.
+	 * @return The localized text.
+	 */
+	public static String getString(String key) {
+		return msg.getString(key);
+	}
+
+
+	/**
+	 * Positions the caret at the beginning of the word.  This class is here
+	 * to better handle finding the "beginning of the word" for programming
+	 * languages.
+	 */
+	protected static class BeginWordAction
+							extends RTextAreaEditorKit.BeginWordAction {
+
+		private Segment seg;
+
+		protected BeginWordAction(String name, boolean select) {
+			super(name, select);
+			seg = new Segment();
+		}
+
+		protected int getWordStart(RTextArea textArea, int offs)
+										throws BadLocationException {
+
+			if (offs==0) {
+				return offs;
+			}
+
+			RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+			int line = textArea.getLineOfOffset(offs);
+			int start = textArea.getLineStartOffset(line);
+			if (offs==start) {
+				return start;
+			}
+			int end = textArea.getLineEndOffset(line);
+			if (line!=textArea.getLineCount()-1) {
+				end--;
+			}
+			doc.getText(start, end-start, seg);
+
+			// Determine the "type" of char at offs - lower case, upper case,
+			// whitespace or other.  We take special care here as we're starting
+			// in the middle of the Segment to check whether we're already at
+			// the "beginning" of a word.
+			int firstIndex = seg.getBeginIndex() + (offs-start) - 1;
+			seg.setIndex(firstIndex);
+			char ch = seg.current();
+			char nextCh = offs==end ? 0 : seg.array[seg.getIndex() + 1];
+
+			// The "word" is a group of letters and/or digits
+			if (Character.isLetterOrDigit(ch)) {
+				if (offs!=end && !Character.isLetterOrDigit(nextCh)) {
+					return offs;
+				}
+				do {
+					ch = seg.previous();
+				} while (Character.isLetterOrDigit(ch));
+			}
+
+			// The "word" is whitespace
+			else if (Character.isWhitespace(ch)) {
+				if (offs!=end && !Character.isWhitespace(nextCh)) {
+					return offs;
+				}
+				do {
+					ch = seg.previous();
+				} while (Character.isWhitespace(ch));
+			}
+
+			// Otherwise, the "word" a single "something else" char (operator,
+			// etc.).
+
+			offs -= firstIndex - seg.getIndex() + 1;//seg.getEndIndex() - seg.getIndex();
+			if (ch!=Segment.DONE && nextCh!='\n') {
+				offs++;
+			}
+
+			return offs;
+
+		}
+
+	}
+
+
+	/**
+	 * Expands or collapses the nearest fold.
+	 */
+	public static class ChangeFoldStateAction extends FoldRelatedAction {
+
+		private boolean collapse;
+
+		public ChangeFoldStateAction(String name, boolean collapse) {
+			super(name);
+			this.collapse = collapse;
+		}
+
+		public ChangeFoldStateAction(String name, Icon icon,
+				String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			if (rsta.isCodeFoldingEnabled()) {
+				Fold fold = getClosestFold(rsta);
+				if (fold!=null) {
+					fold.setCollapsed(collapse);
+				}
+				possiblyRepaintGutter(textArea);
+			}
+			else {
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+			}
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action that (optionally) aligns a closing curly brace with the line
+	 * containing its matching opening curly brace.
+	 */
+	public static class CloseCurlyBraceAction extends RecordableTextAction {
+		
+		private static final long serialVersionUID = 1L;
+
+		private Point bracketInfo;
+		private Segment seg;
+
+		public CloseCurlyBraceAction() {
+			super(rstaCloseCurlyBraceAction);
+			seg = new Segment();
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			RSyntaxDocument doc = (RSyntaxDocument)rsta.getDocument();
+			boolean alignCurlyBraces = rsta.isAutoIndentEnabled() &&
+										doc.getCurlyBracesDenoteCodeBlocks();
+
+			if (alignCurlyBraces) {
+				textArea.beginAtomicEdit();
+			}
+
+			try {
+
+				textArea.replaceSelection("}");
+
+				// If the user wants to align curly braces...
+				if (alignCurlyBraces) {
+
+					Element root = doc.getDefaultRootElement();
+					int dot = rsta.getCaretPosition() - 1; // Start before '{'
+					int line = root.getElementIndex(dot);
+					Element elem = root.getElement(line);
+					int start = elem.getStartOffset();
+
+					// Get the current line's text up to the '}' entered.
+					try {
+						doc.getText(start, dot-start, seg);
+					} catch (BadLocationException ble) { // Never happens
+						ble.printStackTrace();
+						return;
+					}
+
+					// Only attempt to align if there's only whitespace up to
+					// the '}' entered.
+					for (int i=0; i<seg.count; i++) {
+						char ch = seg.array[seg.offset+i];
+						if (!Character.isWhitespace(ch)) {
+							return;
+						}
+					}
+
+					// Locate the matching '{' bracket, and replace the leading
+					// whitespace for the '}' to match that of the '{' char's line.
+					bracketInfo = RSyntaxUtilities.getMatchingBracketPosition(
+							rsta, bracketInfo);
+					if (bracketInfo.y>-1) {
+						try {
+							String ws = RSyntaxUtilities.getLeadingWhitespace(
+									doc, bracketInfo.y);
+							rsta.replaceRange(ws, start, dot);
+						} catch (BadLocationException ble) {
+							ble.printStackTrace();
+							return;
+						}
+					}
+
+				}
+
+			} finally {
+				if (alignCurlyBraces) {
+					textArea.endAtomicEdit();
+				}
+			}
+
+		}
+
+		public final String getMacroID() {
+			return rstaCloseCurlyBraceAction;
+		}
+
+	}
+
+
+	/**
+	 * (Optionally) completes a closing markup tag.
+	 */
+	public static class CloseMarkupTagAction extends RecordableTextAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public CloseMarkupTagAction() {
+			super(rstaCloseMarkupTagAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			RSyntaxDocument doc = (RSyntaxDocument)rsta.getDocument();
+
+			Caret c = rsta.getCaret();
+			boolean selection = c.getDot()!=c.getMark();
+			rsta.replaceSelection("/");
+
+			// Don't automatically complete a tag if there was a selection
+			int dot = c.getDot();
+
+			if (doc.getLanguageIsMarkup() && 
+					doc.getCompleteMarkupCloseTags() &&
+					!selection && rsta.getCloseMarkupTags() && dot>1) {
+
+				try {
+
+					// Check actual char before token type, since it's quicker
+					char ch = doc.charAt(dot-2);
+					if (ch=='<' || ch=='[') {
+
+						Token t = doc.getTokenListForLine(
+											rsta.getCaretLineNumber());
+						t = RSyntaxUtilities.getTokenAtOffset(t, dot-1);
+						if (t!=null && t.type==Token.MARKUP_TAG_DELIMITER) {
+							//System.out.println("Huzzah - closing tag!");
+							String tagName = discoverTagName(doc, dot);
+							if (tagName!=null) {
+								rsta.replaceSelection(tagName + (char)(ch+2));
+							}
+						}
+
+					}
+
+				} catch (BadLocationException ble) { // Never happens
+					UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+					ble.printStackTrace();
+				}
+
+			}
+
+		}
+
+		/**
+		 * Discovers the name of the tag being closed.  Assumes standard
+		 * SGML-style markup tags.
+		 *
+		 * @param doc The document to parse.
+		 * @param dot The location of the caret.  This should be right after
+		 *        the start of a closing tag token (e.g. "<code></</code>"
+		 *        or "<code>[</code>" in the case of BBCode).
+		 * @return The name of the tag to close, or <code>null</code> if it
+		 *         could not be determined.
+		 */
+		private String discoverTagName(RSyntaxDocument doc, int dot) {
+
+			Stack stack = new Stack();
+
+			Element root = doc.getDefaultRootElement();
+			int curLine = root.getElementIndex(dot);
+
+			for (int i=0; i<=curLine; i++) {
+
+				Token t = doc.getTokenListForLine(i);
+				while (t!=null && t.isPaintable()) {
+
+					if (t.type==Token.MARKUP_TAG_DELIMITER) {
+						if (t.isSingleChar('<') || t.isSingleChar('[')) {
+							t = t.getNextToken();
+							while (t!=null && t.isPaintable()) {
+								if (t.type==Token.MARKUP_TAG_NAME ||
+										// Being lenient here and also checking
+										// for attributes, in case they
+										// (incorrectly) have whitespace between
+										// the '<' char and the element name.
+										t.type==Token.MARKUP_TAG_ATTRIBUTE) {
+									stack.push(t.getLexeme());
+									break;
+								}
+								t = t.getNextToken();
+							}
+						}
+						else if (t.textCount==2 && t.text[t.textOffset]=='/' &&
+								(t.text[t.textOffset+1]=='>' ||
+										t.text[t.textOffset+1]==']')) {
+							if (!stack.isEmpty()) { // Always true for valid XML
+								stack.pop();
+							}
+						}
+						else if (t.textCount==2 && 
+								(t.text[t.textOffset]=='<' || t.text[t.textOffset]=='[') &&
+								t.text[t.textOffset+1]=='/') {
+							String tagName = null;
+							if (!stack.isEmpty()) { // Always true for valid XML
+								tagName = (String)stack.pop();
+							}
+							if (t.offset+t.textCount>=dot) {
+								return tagName;
+							}
+						}
+					}
+
+					t = t.getNextToken();
+
+				}
+
+			}
+
+			return null; // Should never happen
+
+		}
+
+		public String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Collapses all comment folds.
+	 */
+	public static class CollapseAllCommentFoldsAction extends FoldRelatedAction{
+
+		private static final long serialVersionUID = 1L;
+
+		public CollapseAllCommentFoldsAction() {
+			super(rstaCollapseAllCommentFoldsAction);
+			setProperties(msg, "Action.CollapseCommentFolds");
+		}
+
+		public CollapseAllCommentFoldsAction(String name, Icon icon,
+				String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			if (rsta.isCodeFoldingEnabled()) {
+				FoldCollapser collapser = new FoldCollapser();
+				collapser.collapseFolds(rsta.getFoldManager());
+				possiblyRepaintGutter(textArea);
+			}
+			else {
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+			}
+		}
+
+		public final String getMacroID() {
+			return rstaCollapseAllCommentFoldsAction;
+		}
+
+	}
+
+
+	/**
+	 * Collapses all folds.
+	 */
+	public static class CollapseAllFoldsAction extends FoldRelatedAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public CollapseAllFoldsAction() {
+			this(false);
+		}
+
+		public CollapseAllFoldsAction(boolean localizedName) {
+			super(rstaCollapseAllFoldsAction);
+			if (localizedName) {
+				setProperties(msg, "Action.CollapseAllFolds");
+			}
+		}
+
+		public CollapseAllFoldsAction(String name, Icon icon,
+				String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			if (rsta.isCodeFoldingEnabled()) {
+				FoldCollapser collapser = new FoldCollapser() {
+					public boolean getShouldCollapse(Fold fold) {
+						return true;
+					}
+				};
+				collapser.collapseFolds(rsta.getFoldManager());
+				possiblyRepaintGutter(textArea);
+			}
+			else {
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+			}
+		}
+
+		public final String getMacroID() {
+			return rstaCollapseAllFoldsAction;
+		}
+
+	}
+
+
+	/**
+	 * Action for copying text as RTF.
+	 */
+	public static class CopyAsRtfAction extends RecordableTextAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public CopyAsRtfAction() {
+			super(rstaCopyAsRtfAction);
+		}
+
+		public CopyAsRtfAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			((RSyntaxTextArea)textArea).copyAsRtf();
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action for decreasing the font size of all fonts in the text area.
+	 */
+	public static class DecreaseFontSizeAction
+					extends RTextAreaEditorKit.DecreaseFontSizeAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public DecreaseFontSizeAction() {
+			super();
+		}
+
+		public DecreaseFontSizeAction(String name, Icon icon, String desc,
+							Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			SyntaxScheme scheme = rsta.getSyntaxScheme();
+
+			// All we need to do is update all of the fonts in syntax
+			// schemes, then call setSyntaxHighlightingColorScheme with the
+			// same scheme already being used.  This relies on the fact that
+			// that method does not check whether the new scheme is different
+			// from the old scheme before updating.
+
+			boolean changed = false;
+			int count = scheme.getStyleCount();
+			for (int i=0; i<count; i++) {
+				Style ss = scheme.getStyle(i);
+				if (ss!=null) {
+					Font font = ss.font;
+					if (font!=null) {
+						float oldSize = font.getSize2D();
+						float newSize = oldSize - decreaseAmount;
+						if (newSize>=MINIMUM_SIZE) {
+							// Shrink by decreaseAmount.
+							ss.font = font.deriveFont(newSize);
+							changed = true;
+						}
+						else if (oldSize>MINIMUM_SIZE) {
+							// Can't shrink by full decreaseAmount, but
+							// can shrink a little bit.
+							ss.font = font.deriveFont(MINIMUM_SIZE);
+							changed = true;
+						}
+					}
+				}
+			}
+
+			// Do the text area's font also.
+			Font font = rsta.getFont();
+			float oldSize = font.getSize2D();
+			float newSize = oldSize - decreaseAmount;
+			if (newSize>=MINIMUM_SIZE) {
+				// Shrink by decreaseAmount.
+				rsta.setFont(font.deriveFont(newSize));
+				changed = true;
+			}
+			else if (oldSize>MINIMUM_SIZE) {
+				// Can't shrink by full decreaseAmount, but
+				// can shrink a little bit.
+				rsta.setFont(font.deriveFont(MINIMUM_SIZE));
+				changed = true;
+			}
+
+			// If we updated at least one font, update the screen.  If
+			// all of the fonts were already the minimum size, beep.
+			if (changed) {
+				rsta.setSyntaxScheme(scheme);
+				// NOTE:  This is a hack to get an encompassing
+				// RTextScrollPane to repaint its line numbers to account
+				// for a change in line height due to a font change.  I'm
+				// not sure why we need to do this here but not when we
+				// change the syntax highlighting color scheme via the
+				// Options dialog... setSyntaxHighlightingColorScheme()
+				// calls revalidate() which won't repaint the scroll pane
+				// if scrollbars don't change, which is why we need this.
+				Component parent = rsta.getParent();
+				if (parent instanceof javax.swing.JViewport) {
+					parent = parent.getParent();
+					if (parent instanceof JScrollPane) {
+						parent.repaint();
+					}
+				}
+			}
+			else
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+
+		}
+
+	}
+
+
+	/**
+	 * Action for when un-indenting lines (either the current line if there is
+	 * selection, or all selected lines if there is one).
+	 */
+	public static class DecreaseIndentAction extends RecordableTextAction {
+
+		private static final long serialVersionUID = 1L;
+	
+		private Segment s;
+
+		public DecreaseIndentAction() {
+			this(rstaDecreaseIndentAction);
+		}
+
+		public DecreaseIndentAction(String name) {
+			super(name);
+			s = new Segment();
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			Document document = textArea.getDocument();
+			Element map = document.getDefaultRootElement();
+			Caret c = textArea.getCaret();
+			int dot = c.getDot();
+			int mark = c.getMark();
+			int line1 = map.getElementIndex(dot);
+			int tabSize = textArea.getTabSize();
+
+			// If there is a selection, indent all lines in the selection.
+			// Otherwise, indent the line the caret is on.
+			if (dot!=mark) {
+				// Note that we cheaply reuse variables here, so don't
+				// take their names to mean what they are.
+				int line2 = map.getElementIndex(mark);
+				dot = Math.min(line1, line2);
+				mark = Math.max(line1, line2);
+				Element elem;
+				try {
+					for (line1=dot; line1<mark; line1++) {
+						elem = map.getElement(line1);
+						handleDecreaseIndent(elem, document, tabSize);
+					}
+					// Don't do the last line if the caret is at its
+					// beginning.  We must call getDot() again and not just
+					// use 'dot' as the caret's position may have changed
+					// due to the insertion of the tabs above.
+					elem = map.getElement(mark);
+					int start = elem.getStartOffset();
+					if (Math.max(c.getDot(),c.getMark())!=start) {
+						handleDecreaseIndent(elem, document, tabSize);
+					}
+				} catch (BadLocationException ble) {
+					ble.printStackTrace();
+					UIManager.getLookAndFeel().
+								provideErrorFeedback(textArea);
+				}
+			}
+			else {
+				Element elem = map.getElement(line1);
+				try {
+					handleDecreaseIndent(elem, document, tabSize);
+				} catch (BadLocationException ble) {
+					ble.printStackTrace();
+					UIManager.getLookAndFeel().
+								provideErrorFeedback(textArea);
+				}
+			}
+
+		}
+
+		public final String getMacroID() {
+			return rstaDecreaseIndentAction;
+		}
+
+		/**
+		 * Actually does the "de-indentation."  This method finds where the
+		 * given element's leading whitespace ends, then, if there is indeed
+		 * leading whitespace, removes either the last char in it (if it is a
+		 * tab), or removes up to the number of spaces equal to a tab in the
+		 * specified document (i.e., if the tab size was 5 and there were 3
+		 * spaces at the end of the leading whitespace, the three will be
+		 * removed; if there were 8 spaces, only the first 5 would be
+		 * removed).
+		 *
+		 * @param elem The element to "de-indent."
+		 * @param doc The document containing the specified element.
+		 * @param tabSize The size of a tab, in spaces.
+		 */
+		private final void handleDecreaseIndent(Element elem, Document doc,
+									int tabSize)
+									throws BadLocationException {
+			int start = elem.getStartOffset();
+			int end = elem.getEndOffset() - 1; // Why always true??
+			doc.getText(start,end-start, s);
+			int i = s.offset;
+			end = i+s.count;
+			if (end>i) {
+				// If the first character is a tab, remove it.
+				if (s.array[i]=='\t') {
+					doc.remove(start, 1);
+				}
+				// Otherwise, see if the first character is a space.  If it
+				// is, remove all contiguous whitespaces at the beginning of
+				// this line, up to the tab size.
+				else if (s.array[i]==' ') {
+					i++;
+					int toRemove = 1;
+					while (i<end && s.array[i]==' ' && toRemove<tabSize) {
+						i++;
+						toRemove++;
+					}
+					doc.remove(start, toRemove);
+				}
+			}
+		}
+
+	}
+
+
+	/**
+	 * Deletes the previous word, but differentiates symbols from "words" to
+	 * match the behavior of code editors.
+	 */
+	public static class DeletePrevWordAction
+			extends RTextAreaEditorKit.DeletePrevWordAction {
+
+		private Segment seg = new Segment();
+
+		protected int getPreviousWordStart(RTextArea textArea, int offs)
+				throws BadLocationException {
+
+			if (offs==0) {
+				return offs;
+			}
+
+			RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+			int line = textArea.getLineOfOffset(offs);
+			int start = textArea.getLineStartOffset(line);
+			if (offs==start) {
+				return start-1; // Just delete the newline
+			}
+			int end = textArea.getLineEndOffset(line);
+			if (line!=textArea.getLineCount()-1) {
+				end--;
+			}
+			doc.getText(start, end-start, seg);
+
+			// Determine the "type" of char at offs - lower case, upper case,
+			// whitespace or other.  We take special care here as we're starting
+			// in the middle of the Segment to check whether we're already at
+			// the "beginning" of a word.
+			int firstIndex = seg.getBeginIndex() + (offs-start) - 1;
+			seg.setIndex(firstIndex);
+			char ch = seg.current();
+
+			// Always strip off whitespace first
+			if (Character.isWhitespace(ch)) {
+				do {
+					ch = seg.previous();
+				} while (Character.isWhitespace(ch));
+			}
+
+			// The "word" is a group of letters and/or digits
+			if (Character.isLetterOrDigit(ch)) {
+				do {
+					ch = seg.previous();
+				} while (Character.isLetterOrDigit(ch));
+			}
+
+			// The "word" is a series of symbols.
+			else {
+				while (!Character.isWhitespace(ch) &&
+						!Character.isLetterOrDigit(ch)
+						&& ch!=Segment.DONE) {
+					ch = seg.previous();
+				}
+			}
+
+			if (ch==Segment.DONE) {
+				return start; // Removed last "token" of the line
+			}
+			offs -= firstIndex - seg.getIndex();
+			return offs;
+
+		}
+
+	}
+
+
+	/**
+	 * Moves the caret to the end of the document, taking into account code
+	 * folding.
+	 */
+	public static class EndAction extends RTextAreaEditorKit.EndAction {
+
+		public EndAction(String name, boolean select) {
+			super(name, select);
+		}
+
+		protected int getVisibleEnd(RTextArea textArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			return rsta.getLastVisibleOffset();
+		}
+
+	}
+
+
+	/**
+	 * Positions the caret at the end of the word.  This class is here to
+	 * better handle finding the "end of the word" in programming languages.
+	 */
+	protected static class EndWordAction
+							extends RTextAreaEditorKit.EndWordAction {
+
+ 		private Segment seg;
+
+		protected EndWordAction(String name, boolean select) {
+			super(name, select);
+			seg = new Segment();
+		}
+
+		protected int getWordEnd(RTextArea textArea, int offs)
+									throws BadLocationException {
+
+			RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+			if (offs==doc.getLength()) {
+				return offs;
+			}
+
+			int line = textArea.getLineOfOffset(offs);
+			int end = textArea.getLineEndOffset(line);
+			if (line!=textArea.getLineCount()-1) {
+				end--; // Hide newline
+			}
+			if (offs==end) {
+				return end;
+			}
+			doc.getText(offs, end-offs, seg);
+
+			// Determine the "type" of char at offs - letter/digit,
+			// whitespace or other
+			char ch = seg.first();
+
+			// The "word" is a group of letters and/or digits
+			if (Character.isLetterOrDigit(ch)) {
+				do {
+					ch = seg.next();
+				} while (Character.isLetterOrDigit(ch));
+			}
+
+			// The "word" is whitespace.
+			else if (Character.isWhitespace(ch)) {
+
+				do {
+					ch = seg.next();
+				} while (Character.isWhitespace(ch));
+			}
+
+			// Otherwise, the "word" is a single character of some other type
+			// (operator, etc.).
+
+			offs += seg.getIndex() - seg.getBeginIndex();
+			return offs;
+
+		}
+
+	}
+
+
+	/**
+	 * Expands all folds.
+	 */
+	public static class ExpandAllFoldsAction extends FoldRelatedAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public ExpandAllFoldsAction() {
+			this(false);
+		}
+
+		public ExpandAllFoldsAction(boolean localizedName) {
+			super(rstaExpandAllFoldsAction);
+			if (localizedName) {
+				setProperties(msg, "Action.ExpandAllFolds");
+			}
+		}
+
+		public ExpandAllFoldsAction(String name, Icon icon,
+				String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			if (rsta.isCodeFoldingEnabled()) {
+				FoldManager fm = rsta.getFoldManager();
+				for (int i=0; i<fm.getFoldCount(); i++) {
+					expand(fm.getFold(i));
+				}
+				possiblyRepaintGutter(rsta);
+			}
+			else {
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+			}
+		}
+
+		private void expand(Fold fold) {
+			fold.setCollapsed(false);
+			for (int i=0; i<fold.getChildCount(); i++) {
+				expand(fold.getChild(i));
+			}
+		}
+
+		public final String getMacroID() {
+			return rstaExpandAllFoldsAction;
+		}
+
+	}
+
+
+	/**
+	 * Base class for folding-related actions.
+	 */
+	static abstract class FoldRelatedAction extends RecordableTextAction {
+
+		public FoldRelatedAction(String name) {
+			super(name);
+		}
+
+		public FoldRelatedAction(String name, Icon icon,
+				String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		protected Fold getClosestFold(RSyntaxTextArea textArea) {
+			int offs = textArea.getCaretPosition();
+			int line = textArea.getCaretLineNumber();
+			FoldManager fm = textArea.getFoldManager();
+			Fold fold = fm.getFoldForLine(line);
+			if (fold==null) {
+				fold = fm.getDeepestOpenFoldContaining(offs);
+			}
+			return fold;
+		}
+
+		/**
+		 * Repaints the gutter in a text area's scroll pane, if necessary.
+		 *
+		 * @param textArea The text area.
+		 */
+		protected void possiblyRepaintGutter(RTextArea textArea) {
+			Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+			if (gutter!=null) {
+				gutter.repaint();
+			}
+		}
+
+	}
+
+
+	/**
+	 * Action for moving the caret to the "matching bracket" of the bracket
+	 * at the caret position (either before or after).
+	 */
+	public static class GoToMatchingBracketAction
+									extends RecordableTextAction {
+
+		private static final long serialVersionUID = 1L;
+
+		private Point bracketInfo;
+
+		public GoToMatchingBracketAction() {
+			super(rstaGoToMatchingBracketAction);
+		}
+
+		public GoToMatchingBracketAction(String name, Icon icon, String desc,
+							Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			bracketInfo = RSyntaxUtilities.getMatchingBracketPosition(rsta,
+					bracketInfo);
+			if (bracketInfo.y>-1) {
+				// Go to the position AFTER the bracket so the previous
+				// bracket (which we were just on) is highlighted.
+				rsta.setCaretPosition(bracketInfo.y+1);
+			}
+			else {
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+			}
+		}
+
+		public final String getMacroID() {
+			return rstaGoToMatchingBracketAction;
+		}
+
+	}
+
+
+	/**
+	 * Action for increasing the font size of all fonts in the text area.
+	 */
+	public static class IncreaseFontSizeAction
+					extends RTextAreaEditorKit.IncreaseFontSizeAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public IncreaseFontSizeAction() {
+			super();
+		}
+
+		public IncreaseFontSizeAction(String name, Icon icon, String desc,
+							Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			SyntaxScheme scheme = rsta.getSyntaxScheme();
+
+			// All we need to do is update all of the fonts in syntax
+			// schemes, then call setSyntaxHighlightingColorScheme with the
+			// same scheme already being used.  This relies on the fact that
+			// that method does not check whether the new scheme is different
+			// from the old scheme before updating.
+
+			boolean changed = false;
+			int count = scheme.getStyleCount();
+			for (int i=0; i<count; i++) {
+				Style ss = scheme.getStyle(i);
+				if (ss!=null) {
+					Font font = ss.font;
+					if (font!=null) {
+						float oldSize = font.getSize2D();
+						float newSize = oldSize + increaseAmount;
+						if (newSize<=MAXIMUM_SIZE) {
+							// Grow by increaseAmount.
+							ss.font = font.deriveFont(newSize);
+							changed = true;
+						}
+						else if (oldSize<MAXIMUM_SIZE) {
+							// Can't grow by full increaseAmount, but
+							// can grow a little bit.
+							ss.font = font.deriveFont(MAXIMUM_SIZE);
+							changed = true;
+						}
+					}
+				}
+			}
+
+			// Do the text area's font also.
+			Font font = rsta.getFont();
+			float oldSize = font.getSize2D();
+			float newSize = oldSize + increaseAmount;
+			if (newSize<=MAXIMUM_SIZE) {
+				// Grow by increaseAmount.
+				rsta.setFont(font.deriveFont(newSize));
+				changed = true;
+			}
+			else if (oldSize<MAXIMUM_SIZE) {
+				// Can't grow by full increaseAmount, but
+				// can grow a little bit.
+				rsta.setFont(font.deriveFont(MAXIMUM_SIZE));
+				changed = true;
+			}
+
+			// If we updated at least one font, update the screen.  If
+			// all of the fonts were already the minimum size, beep.
+			if (changed) {
+				rsta.setSyntaxScheme(scheme);
+				// NOTE:  This is a hack to get an encompassing
+				// RTextScrollPane to repaint its line numbers to account
+				// for a change in line height due to a font change.  I'm
+				// not sure why we need to do this here but not when we
+				// change the syntax highlighting color scheme via the
+				// Options dialog... setSyntaxHighlightingColorScheme()
+				// calls revalidate() which won't repaint the scroll pane
+				// if scrollbars don't change, which is why we need this.
+				Component parent = rsta.getParent();
+				if (parent instanceof javax.swing.JViewport) {
+					parent = parent.getParent();
+					if (parent instanceof JScrollPane) {
+						parent.repaint();
+					}
+				}
+			}
+			else
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+
+		}
+
+	}
+
+
+	/**
+	 * Action for when the user presses the Enter key.  This is here so we can
+	 * be smart and "auto-indent" for programming languages.
+	 */
+	public static class InsertBreakAction
+							extends RTextAreaEditorKit.InsertBreakAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			RSyntaxTextArea sta = (RSyntaxTextArea)textArea;
+			boolean noSelection= sta.getSelectionStart()==sta.getSelectionEnd();
+
+			// First, see if this language wants to handle inserting newlines
+			// itself.
+			boolean handled = false;
+			if (noSelection) {
+				RSyntaxDocument doc = (RSyntaxDocument)sta.getDocument();
+				handled = doc.insertBreakSpecialHandling(e);
+			}
+
+			// If not...
+			if (!handled) {
+				handleInsertBreak(sta, noSelection);
+			}
+
+		}
+
+		/**
+		 * @return The first location in the string past <code>pos</code> that
+		 *         is NOT a whitespace char, or <code>-1</code> if only
+		 *         whitespace chars follow <code>pos</code> (or it is the end
+		 *         position in the string).
+		 */
+		private static final int atEndOfLine(int pos, String s, int sLen) {
+			for (int i=pos; i<sLen; i++) {
+				if (!RSyntaxUtilities.isWhitespace(s.charAt(i)))
+					return i;
+			}
+			return -1;
+		}
+
+		private static final int getOpenBraceCount(RSyntaxDocument doc) {
+			int openCount = 0;
+			Element root = doc.getDefaultRootElement();
+			int lineCount = root.getElementCount();
+			for (int i=0; i<lineCount; i++) {
+				Token t = doc.getTokenListForLine(i);
+				while (t!=null && t.isPaintable()) {
+					if (t.type==Token.SEPARATOR && t.textCount==1) {
+						char ch = t.text[t.textOffset];
+						if (ch=='{') {
+							openCount++;
+						}
+						else if (ch=='}') {
+							openCount--;
+						}
+					}
+					t = t.getNextToken();
+				}
+			}
+			return openCount;
+		}
+
+		/**
+		 * Actually inserts the newline into the document, and auto-indents
+		 * if appropriate.  This method can be called by token makers who
+		 * implement a custom action for inserting newlines.
+		 *
+		 * @param textArea
+		 * @param noSelection Whether there is no selection.
+		 */
+		protected void handleInsertBreak(RSyntaxTextArea textArea,
+										boolean noSelection) {
+			// If we're auto-indenting...
+			if (noSelection && textArea.isAutoIndentEnabled()) {
+				insertNewlineWithAutoIndent(textArea);
+			}
+			else {
+				textArea.replaceSelection("\n");
+				if (noSelection) {
+					possiblyCloseCurlyBrace(textArea, null);
+				}
+			}
+		}
+
+		private void insertNewlineWithAutoIndent(RSyntaxTextArea sta) {
+
+			try {
+
+				int caretPos = sta.getCaretPosition();
+				Document doc = sta.getDocument();
+				Element map = doc.getDefaultRootElement();
+				int lineNum = map.getElementIndex(caretPos);
+				Element line = map.getElement(lineNum);
+				int start = line.getStartOffset();
+				int end = line.getEndOffset()-1; // Why always "-1"?
+				int len = end-start;
+				String s = doc.getText(start, len);
+
+				// endWS is the end of the leading whitespace of the
+				// current line.
+				String leadingWS = RSyntaxUtilities.getLeadingWhitespace(s);
+				StringBuffer sb = new StringBuffer("\n");
+				sb.append(leadingWS);
+
+				// If there is only whitespace between the caret and
+				// the EOL, pressing Enter auto-indents the new line to
+				// the same place as the previous line.
+				int nonWhitespacePos = atEndOfLine(caretPos-start, s, len);
+				if (nonWhitespacePos==-1) {
+					if (leadingWS.length()==len &&
+							sta.isClearWhitespaceLinesEnabled()) {
+						// If the line was nothing but whitespace, select it
+						// so its contents get removed.
+						sta.setSelectionStart(start);
+						sta.setSelectionEnd(end);
+					}
+					sta.replaceSelection(sb.toString());
+				}
+
+				// If there is non-whitespace between the caret and the
+				// EOL, pressing Enter takes that text to the next line
+				// and auto-indents it to the same place as the last
+				// line.
+				else {
+					sb.append(s.substring(nonWhitespacePos));
+					sta.replaceRange(sb.toString(), caretPos, end);
+					sta.setCaretPosition(caretPos + leadingWS.length()+1);
+				}
+
+				// Must do it after everything else, as the "smart indent"
+				// calculation depends on the previous line's state
+				// AFTER the Enter press (stuff may have been moved down).
+				if (sta.getShouldIndentNextLine(lineNum)) {
+					sta.replaceSelection("\t");
+				}
+
+				possiblyCloseCurlyBrace(sta, leadingWS);
+
+			} catch (BadLocationException ble) { // Never happens
+				sta.replaceSelection("\n");
+				ble.printStackTrace();
+			}
+
+		}
+
+		private void possiblyCloseCurlyBrace(RSyntaxTextArea textArea,
+											String leadingWS) {
+
+			RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+
+			if (textArea.getCloseCurlyBraces() &&
+					doc.getCurlyBracesDenoteCodeBlocks()) {
+
+				int line = textArea.getCaretLineNumber();
+				Token t = doc.getTokenListForLine(line-1);
+				t = t.getLastNonCommentNonWhitespaceToken();
+
+				if (t!=null && t.isLeftCurly()) {
+
+					if (getOpenBraceCount(doc)>0) {
+						StringBuffer sb = new StringBuffer();
+						if (line==textArea.getLineCount()-1) {
+							sb.append('\n');
+						}
+						if (leadingWS!=null) {
+							sb.append(leadingWS);
+						}
+						sb.append("}\n");
+						int dot = textArea.getCaretPosition();
+						int end = textArea.getLineEndOffsetOfCurrentLine();
+						// Insert at end of line, not at dot: they may have
+						// pressed Enter in the middle of the line and brought
+						// some text (though it must be whitespace and/or
+						// comments) down onto the new line.
+						textArea.insert(sb.toString(), end);
+						textArea.setCaretPosition(dot); // Caret may have moved
+					}
+
+				}
+
+			}
+
+		}
+
+	}
+
+
+	/**
+	 * Action for inserting tabs.  This is extended to "block indent" a
+	 * group of contiguous lines if they are selected.
+	 */
+	public static class InsertTabAction extends RecordableTextAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public InsertTabAction() {
+			super(insertTabAction);
+		}
+
+		public InsertTabAction(String name) {
+			super(name);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			Document document = textArea.getDocument();
+			Element map = document.getDefaultRootElement();
+			Caret c = textArea.getCaret();
+			int dot = c.getDot();
+			int mark = c.getMark();
+			int dotLine = map.getElementIndex(dot);
+			int markLine = map.getElementIndex(mark);
+
+			// If there is a multi-line selection, indent all lines in
+			// the selection.
+			if (dotLine!=markLine) {
+				int first = Math.min(dotLine, markLine);
+				int last = Math.max(dotLine, markLine);
+				Element elem; int start;
+
+				// Since we're using Document.insertString(), we must mimic the
+				// soft tab behavior provided by RTextArea.replaceSelection().
+				String replacement = "\t";
+				if (textArea.getTabsEmulated()) {
+					StringBuffer sb = new StringBuffer();
+					int temp = textArea.getTabSize();
+					for (int i=0; i<temp; i++) {
+						sb.append(' ');
+					}
+					replacement = sb.toString();
+				}
+
+				textArea.beginAtomicEdit();
+				try {
+					for (int i=first; i<last; i++) {
+						elem = map.getElement(i);
+						start = elem.getStartOffset();
+						document.insertString(start, replacement, null);
+					}
+					// Don't do the last line if the caret is at its
+					// beginning.  We must call getDot() again and not just
+					// use 'dot' as the caret's position may have changed
+					// due to the insertion of the tabs above.
+					elem = map.getElement(last);
+					start = elem.getStartOffset();
+					if (Math.max(c.getDot(), c.getMark())!=start) {
+						document.insertString(start, replacement, null);
+					}
+				} catch (BadLocationException ble) { // Never happens.
+					ble.printStackTrace();
+					UIManager.getLookAndFeel().
+									provideErrorFeedback(textArea);
+				} finally {
+					textArea.endAtomicEdit();
+				}
+			}
+			else {
+				textArea.replaceSelection("\t");
+			}
+
+		}
+
+		public final String getMacroID() {
+			return insertTabAction;
+		}
+
+	}
+
+
+	/**
+	 * Action to move the selection and/or caret. Constructor indicates
+	 * direction to use.  This class overrides the behavior defined in
+	 * {@link RTextAreaEditorKit} to better skip "words" in source code.
+	 */
+	public static class NextWordAction
+						extends RTextAreaEditorKit.NextWordAction {
+
+		private Segment seg;
+
+		public NextWordAction(String nm, boolean select) {
+			super(nm, select);
+			seg = new Segment();
+		}
+
+		/**
+		 * Overridden to do better with skipping "words" in code.
+		 */
+		protected int getNextWord(RTextArea textArea, int offs)
+									throws BadLocationException {
+
+			RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+			if (offs==doc.getLength()) {
+				return offs;
+			}
+
+			Element root = doc.getDefaultRootElement();
+			int line = root.getElementIndex(offs);
+			int end = root.getElement(line).getEndOffset() - 1;
+			if (offs==end) {// If we're already at the end of the line...
+				RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+				if (rsta.isCodeFoldingEnabled()) { // Start of next visible line
+					FoldManager fm = rsta.getFoldManager();
+					int lineCount = root.getElementCount();
+					while (++line<lineCount && fm.isLineHidden(line));
+					if (line<lineCount) { // Found a lower visible line
+						offs = root.getElement(line).getStartOffset();
+					}
+					// No lower visible line - we're already at last visible offset
+					return offs;
+				}
+				else {
+					return offs+1; // Start of next line.
+				}
+			}
+			doc.getText(offs, end-offs, seg);
+
+			// Determine the "type" of char at offs - letter/digit,
+			// whitespace or other
+			char ch = seg.first();
+
+			// Skip the group of letters and/or digits
+			if (Character.isLetterOrDigit(ch)) {
+				do {
+					ch = seg.next();
+				} while (Character.isLetterOrDigit(ch));
+			}
+
+			// Skip groups of "anything else" (operators, etc.).
+			else if (!Character.isWhitespace(ch)) {
+				do {
+					ch = seg.next();
+				} while (ch!=Segment.DONE &&
+						!(Character.isLetterOrDigit(ch) ||
+								Character.isWhitespace(ch)));
+			}
+
+			// Skip any trailing whitespace
+			while (Character.isWhitespace(ch)) {
+				ch = seg.next();
+			}
+
+			offs += seg.getIndex() - seg.getBeginIndex();
+			return offs;
+
+		}
+
+	}
+
+
+	/**
+	 * Action for when the user tries to insert a template (that is,
+	 * they've typed a template ID and pressed the trigger character
+	 * (a space) in an attempt to do the substitution).
+	 */
+	public static class PossiblyInsertTemplateAction extends RecordableTextAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public PossiblyInsertTemplateAction() {
+			super(rstaPossiblyInsertTemplateAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled())
+				return;
+
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+
+			if (RSyntaxTextArea.getTemplatesEnabled()) {
+
+				Document doc = textArea.getDocument();
+				if (doc != null) {
+
+					try {
+
+						CodeTemplateManager manager = RSyntaxTextArea.
+											getCodeTemplateManager();
+						CodeTemplate template =  manager==null ? null :
+													manager.getTemplate(rsta);
+
+						// A non-null template means modify the text to insert!
+						if (template!=null) {
+							template.invoke(rsta);
+						}
+
+						// No template - insert default text.  This is
+						// exactly what DefaultKeyTypedAction does.
+						else {
+							doDefaultInsert(rsta);
+						}
+
+					} catch (BadLocationException ble) {
+						UIManager.getLookAndFeel().
+								provideErrorFeedback(textArea);
+					}
+
+
+				} // End of if (doc!=null).
+
+			} // End of if (textArea.getTemplatesEnabled()).
+
+			// If templates aren't enabled, just insert the text as usual.
+			else {
+				doDefaultInsert(rsta);
+			}
+
+		}
+
+		private final void doDefaultInsert(RTextArea textArea) {
+			// FIXME:  We need a way to get the "trigger string" (i.e.,
+			// the text that was just typed); however, the text area's
+			// template manager might be null (if templates are disabled).
+			// Also, the manager's trigger string doesn't yet match up with
+			// that defined in RSyntaxTextAreaEditorKit.java (which is
+			// hardcoded as a space)...
+			//String str = manager.getInsertTriggerString();
+			//int mod = manager.getInsertTrigger().getModifiers();
+			//if (str!=null && str.length()>0 &&
+			//	((mod&ActionEvent.ALT_MASK)==(mod&ActionEvent.CTRL_MASK))) {
+			//	char ch = str.charAt(0);
+			//	if (ch>=0x20 && ch!=0x7F)
+			//		textArea.replaceSelection(str);
+			//}
+			textArea.replaceSelection(" ");
+		}
+
+		public final String getMacroID() {
+			return rstaPossiblyInsertTemplateAction;
+		}
+
+	}
+
+
+	/**
+	 * Action to move the selection and/or caret. Constructor indicates
+	 * direction to use.  This class overrides the behavior defined in
+	 * {@link RTextAreaEditorKit} to better skip "words" in source code.
+	 */
+	public static class PreviousWordAction
+						extends RTextAreaEditorKit.PreviousWordAction {
+
+		private Segment seg;
+
+		public PreviousWordAction(String nm, boolean select) {
+			super(nm, select);
+			seg = new Segment();
+		}
+
+		/**
+		 * Overridden to do better with skipping "words" in code.
+		 */
+		protected int getPreviousWord(RTextArea textArea, int offs)
+										throws BadLocationException {
+
+			if (offs==0) {
+				return offs;
+			}
+
+			RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+			Element root = doc.getDefaultRootElement();
+			int line = root.getElementIndex(offs);
+			int start = root.getElement(line).getStartOffset();
+			if (offs==start) {// If we're already at the start of the line...
+				RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+				if (rsta.isCodeFoldingEnabled()) { // End of next visible line
+					FoldManager fm = rsta.getFoldManager();
+					while (--line>=0 && fm.isLineHidden(line));
+					if (line>=0) { // Found an earlier visible line
+						offs = root.getElement(line).getEndOffset() - 1;
+					}
+					// No earlier visible line - we must be at offs==0...
+					return offs;
+				}
+				else {
+					return start-1; // End of previous line.
+				}
+			}
+			doc.getText(start, offs-start, seg);
+
+			// Determine the "type" of char at offs - lower case, upper case,
+			// whitespace or other
+			char ch = seg.last();
+
+			// Skip any "leading" whitespace
+			while (Character.isWhitespace(ch)) {
+				ch = seg.previous();
+			}
+
+			// Skip the group of letters and/or digits
+			if (Character.isLetterOrDigit(ch)) {
+				do {
+					ch = seg.previous();
+				} while (Character.isLetterOrDigit(ch));
+			}
+
+			// Skip groups of "anything else" (operators, etc.).
+			else if (!Character.isWhitespace(ch)) {
+				do {
+					ch = seg.previous();
+				} while (ch!=Segment.DONE &&
+						!(Character.isLetterOrDigit(ch) ||
+								Character.isWhitespace(ch)));
+			}
+
+			offs -= seg.getEndIndex() - seg.getIndex();
+			if (ch!=Segment.DONE) {
+				offs++;
+			}
+
+			return offs;
+
+		}
+
+	}
+
+
+	/**
+	 * Selects the word around the caret.  This class is here to better
+	 * handle selecting "words" in programming languages.
+	 */
+	public static class SelectWordAction
+					extends RTextAreaEditorKit.SelectWordAction {
+
+		protected void createActions() {
+			start = new BeginWordAction("pigdog", false);
+			end = new EndWordAction("pigdog", true);
+		}
+
+	}
+
+
+	/**
+	 * Action that toggles whether the currently selected lines are
+	 * commented.
+	 */
+	public static class ToggleCommentAction extends RecordableTextAction {
+
+		public ToggleCommentAction() {
+			super(rstaToggleCommentAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+			String[] startEnd = doc.getLineCommentStartAndEnd();
+
+			if (startEnd==null) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			Element map = doc.getDefaultRootElement();
+			Caret c = textArea.getCaret();
+			int dot = c.getDot();
+			int mark = c.getMark();
+			int line1 = map.getElementIndex(dot);
+			int line2 = map.getElementIndex(mark);
+			int start = Math.min(line1, line2);
+			int end   = Math.max(line1, line2);
+
+			// Don't toggle comment on last line if there is no
+			// text selected on it.
+			if (start!=end) {
+				Element elem = map.getElement(end);
+				if (Math.max(dot, mark)==elem.getStartOffset()) {
+					end--;
+				}
+			}
+
+			textArea.beginAtomicEdit();
+			try {
+				boolean add = getDoAdd(doc,map, start,end, startEnd);
+				for (line1=start; line1<=end; line1++) {
+					Element elem = map.getElement(line1);
+					handleToggleComment(elem, doc, startEnd, add);
+				}
+			} catch (BadLocationException ble) {
+				ble.printStackTrace();
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			} finally {
+				textArea.endAtomicEdit();
+			}
+
+		}
+
+		private boolean getDoAdd(Document doc, Element map, int startLine,
+							int endLine, String[] startEnd)
+								throws BadLocationException {
+			boolean doAdd = false;
+			for (int i=startLine; i<=endLine; i++) {
+				Element elem = map.getElement(i);
+				int start = elem.getStartOffset();
+				String t = doc.getText(start, elem.getEndOffset()-start-1);
+				if (!t.startsWith(startEnd[0]) ||
+						(startEnd[1]!=null && !t.endsWith(startEnd[1]))) {
+					doAdd = true;
+					break;
+				}
+			}
+			return doAdd;
+		}
+
+		private void handleToggleComment(Element elem, Document doc,
+			String[] startEnd, boolean add) throws BadLocationException {
+			int start = elem.getStartOffset();
+			int end = elem.getEndOffset() - 1;
+			if (add) {
+				doc.insertString(start, startEnd[0], null);
+				if (startEnd[1]!=null) {
+					doc.insertString(end+startEnd[0].length(), startEnd[1],
+									null);
+				}
+			}
+			else {
+				doc.remove(start, startEnd[0].length());
+				if (startEnd[1]!=null) {
+					int temp = startEnd[1].length();
+					doc.remove(end-startEnd[0].length()-temp, temp);
+				}
+			}
+		}
+
+		public final String getMacroID() {
+			return rstaToggleCommentAction;
+		}
+
+	}
+
+
+	/**
+	 * Toggles the fold at the current caret position or line.
+	 */
+	public static class ToggleCurrentFoldAction extends FoldRelatedAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public ToggleCurrentFoldAction() {
+			super(rstaToggleCurrentFoldAction);
+			setProperties(msg, "Action.ToggleCurrentFold");
+		}
+
+		public ToggleCurrentFoldAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			if (rsta.isCodeFoldingEnabled()) {
+				Fold fold = getClosestFold(rsta);
+				if (fold!=null) {
+					fold.toggleCollapsedState();
+				}
+				possiblyRepaintGutter(textArea);
+			}
+			else {
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+			}
+		}
+
+		public final String getMacroID() {
+			return rstaToggleCurrentFoldAction;
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaHighlighter.java b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaHighlighter.java
new file mode 100644
index 0000000..d170eb9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaHighlighter.java
@@ -0,0 +1,449 @@
+/*
+ * 04/23/2009
+ *
+ * RSyntaxTextAreaHighlighter.java - Highlighter for RTextAreas.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import javax.swing.plaf.TextUI;
+import javax.swing.plaf.basic.BasicTextUI.BasicHighlighter;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Highlighter;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.LayeredHighlighter;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+import org.fife.ui.rsyntaxtextarea.parser.Parser;
+import org.fife.ui.rsyntaxtextarea.parser.ParserNotice;
+import org.fife.ui.rtextarea.RTextArea;
+
+
+/**
+ * The highlighter implementation used by {@link RSyntaxTextArea}s.  It knows to
+ * always paint "marked occurrences" highlights below selection highlights,
+ * and squiggle underline highlights above all other highlights.<p>
+ *
+ * Most of this code is copied from javax.swing.text.DefaultHighlighter;
+ * unfortunately, we cannot re-use much of it since it is package private.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RSyntaxTextAreaHighlighter extends BasicHighlighter {
+
+	/**
+	 * The text component we are the highlighter for.
+	 */
+	private RTextArea textArea;
+
+	/**
+	 * Marked occurrences in the document (to be painted separately from
+	 * other highlights).
+	 */
+	private List markedOccurrences;
+
+	/**
+	 * Highlights from document parsers.  These should be painted "on top of"
+	 * all other highlights to ensure they are always above the selection.
+	 */
+	private List parserHighlights;
+
+	/**
+	 * The default color used for parser notices when none is specified.
+	 */
+	private static final Color DEFAULT_PARSER_NOTICE_COLOR	= Color.RED;
+
+
+	/**
+	 * Constructor.
+	 */
+	public RSyntaxTextAreaHighlighter() {
+		markedOccurrences = new ArrayList();
+		parserHighlights = new ArrayList(0); // Often unused
+	}
+
+
+	/**
+	 * Adds a special "marked occurrence" highlight.
+	 *
+	 * @param start
+	 * @param end
+	 * @param p
+	 * @return A tag to reference the highlight later.
+	 * @throws BadLocationException
+	 * @see {@link #clearMarkOccurrencesHighlights()}
+	 */
+	Object addMarkedOccurrenceHighlight(int start, int end,
+			MarkOccurrencesHighlightPainter p) throws BadLocationException {
+		Document doc = textArea.getDocument();
+		TextUI mapper = textArea.getUI();
+		// Always layered highlights for marked occurrences.
+		HighlightInfo i = new LayeredHighlightInfo();
+		i.painter = p;
+		i.p0 = doc.createPosition(start);
+		// HACK: Use "end-1" to prevent chars the user types at the "end" of
+		// the highlight to be absorbed into the highlight (default Highlight
+		// behavior).
+		i.p1 = doc.createPosition(end-1);
+		markedOccurrences.add(i);
+		mapper.damageRange(textArea, start, end);
+		return i;
+	}
+
+
+	/**
+	 * Adds a special "marked occurrence" highlight.
+	 *
+	 * @param notice The notice from a {@link Parser}.
+	 * @return A tag with which to reference the highlight.
+	 * @throws BadLocationException
+	 * @see {@link #clearParserHighlights()}
+	 */
+	Object addParserHighlight(ParserNotice notice, HighlightPainter p)
+								throws BadLocationException {
+
+		Document doc = textArea.getDocument();
+		TextUI mapper = textArea.getUI();
+
+		int start = notice.getOffset();
+		int end = 0;
+		if (start==-1) { // Could just define an invalid line number
+			int line = notice.getLine();
+			Element root = doc.getDefaultRootElement();
+			if (line>=0 && line<root.getElementCount()) {
+				Element elem = root.getElement(line);
+				start = elem.getStartOffset();
+				end = elem.getEndOffset();
+			}
+		}
+		else {
+			end = start + notice.getLength();
+		}
+
+		// Always layered highlights for parser highlights.
+		HighlightInfo i = new LayeredHighlightInfo();
+		i.painter = p;
+		i.p0 = doc.createPosition(start);
+		i.p1 = doc.createPosition(end);
+		i.notice = notice;//i.color = notice.getColor();
+
+		parserHighlights.add(i);
+		mapper.damageRange(textArea, start, end);
+		return i;
+
+	}
+
+
+	/**
+	 * Removes all "marked occurrences" highlights from the view.
+	 *
+	 * @see #addMarkedOccurrenceHighlight(int, int, MarkOccurrencesHighlightPainter)
+	 */
+	void clearMarkOccurrencesHighlights() {
+		// Don't remove via the iterator; since our List is an ArrayList, this
+		// implies tons of System.arrayCopy()s 
+		for (Iterator i=markedOccurrences.iterator(); i.hasNext(); ) {
+			repaintListHighlight(i.next());
+		}
+		markedOccurrences.clear();
+	}
+
+
+	/**
+	 * Removes all parser highlights.
+	 *
+	 * @see #addParserHighlight(ParserNotice, javax.swing.text.Highlighter.HighlightPainter)
+	 */
+	void clearParserHighlights() {
+		// Don't remove via an iterator; since our List is an ArrayList, this
+		// implies tons of System.arrayCopy()s 
+		for (int i=0; i<parserHighlights.size(); i++) {
+			repaintListHighlight(parserHighlights.get(i));
+		}
+		parserHighlights.clear();
+	}
+
+
+	/**
+	 * Removes all of the highlights for a specific parser.
+	 *
+	 * @param parser The parser.
+	 */
+	public void clearParserHighlights(Parser parser) {
+
+		for (Iterator i=parserHighlights.iterator(); i.hasNext(); ) {
+
+			HighlightInfo info = (HighlightInfo)i.next();
+
+			if (info.notice.getParser()==parser) {
+				if (info instanceof LayeredHighlightInfo) {
+					LayeredHighlightInfo lhi = (LayeredHighlightInfo)info;
+				    if (lhi.width > 0 && lhi.height > 0) {
+				    	textArea.repaint(lhi.x, lhi.y, lhi.width, lhi.height);
+				    }
+				}
+				else {
+					TextUI ui = textArea.getUI();
+					ui.damageRange(textArea, info.getStartOffset(),info.getEndOffset());
+					//safeDamageRange(info.p0, info.p1);
+				}
+				i.remove();
+			}
+
+		}
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void deinstall(JTextComponent c) {
+		this.textArea = null;
+		markedOccurrences.clear();
+		parserHighlights.clear();
+	}
+
+
+	/**
+	 * Returns a list of "marked occurrences" in the text area.  If there are
+	 * no marked occurrences, this will be an empty list.
+	 *
+	 * @return The list of marked occurrences, or an empty list if none.  The
+	 *         contents of this list will be of type {@link DocumentRange}.
+	 */
+	public List getMarkedOccurrences() {
+		List list = new ArrayList(markedOccurrences.size());
+		for (Iterator i=markedOccurrences.iterator(); i.hasNext(); ) {
+			HighlightInfo info = (HighlightInfo)i.next();
+			int start = info.getStartOffset();
+			int end = info.getEndOffset() + 1; // HACK
+			DocumentRange range = new DocumentRange(start, end);
+			list.add(range);
+		}
+		return list;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void install(JTextComponent c) {
+		super.install(c);
+		this.textArea = (RTextArea)c;
+	}
+
+
+	/**
+	 * Renders the highlights.
+	 *
+	 * @param g the graphics context
+	 */
+	public void paint(Graphics g) {
+		paintList(g, markedOccurrences);
+		super.paint(g);
+		paintList(g, parserHighlights);
+	}
+
+
+	private void paintList(Graphics g, List highlights) {
+
+		int len = highlights.size();
+
+		for (int i = 0; i < len; i++) {
+			HighlightInfo info = (HighlightInfo)highlights.get(i);
+			if (!(info instanceof LayeredHighlightInfo)) {
+				// Avoid allocating unless we need it.
+				Rectangle a = textArea.getBounds();
+				Insets insets = textArea.getInsets();
+				a.x = insets.left;
+				a.y = insets.top;
+				a.width -= insets.left + insets.right;
+				a.height -= insets.top + insets.bottom;
+				for (; i < len; i++) {
+					info = (HighlightInfo)markedOccurrences.get(i);
+					if (!(info instanceof LayeredHighlightInfo)) {
+						Color c = info.getColor();
+						Highlighter.HighlightPainter p = info.getPainter();
+						if (c!=null && p instanceof ChangeableColorHighlightPainter) {
+							((ChangeableColorHighlightPainter)p).setColor(c);
+						}
+						p.paint(g, info.getStartOffset(), info.getEndOffset(),
+								a, textArea);
+					}
+				}
+		    }
+		}
+
+	}
+
+
+	/**
+	 * When leaf Views (such as LabelView) are rendering they should
+	 * call into this method. If a highlight is in the given region it will
+	 * be drawn immediately.
+	 *
+	 * @param g Graphics used to draw
+	 * @param p0 starting offset of view
+	 * @param p1 ending offset of view
+	 * @param viewBounds Bounds of View
+	 * @param editor JTextComponent
+	 * @param view View instance being rendered
+	 */
+	public void paintLayeredHighlights(Graphics g, int p0, int p1,
+						Shape viewBounds, JTextComponent editor, View view) {
+		paintListLayered(g, p0,p1, viewBounds, editor, view, markedOccurrences);
+		super.paintLayeredHighlights(g, p0, p1, viewBounds, editor, view);
+		paintListLayered(g, p0,p1, viewBounds, editor, view, parserHighlights);
+	}
+
+
+	private void paintListLayered(Graphics g, int p0, int p1, Shape viewBounds,
+						JTextComponent editor, View view, List highlights) {
+		for (int i=highlights.size()-1; i>=0; i--) {
+			Object tag = highlights.get(i);
+			if (tag instanceof LayeredHighlightInfo) {
+				LayeredHighlightInfo lhi = (LayeredHighlightInfo)tag;
+				int start = lhi.getStartOffset();
+				int end = lhi.getEndOffset();
+				if ((p0 < start && p1 > start) ||
+						(p0 >= start && p0 < end)) {
+					lhi.paintLayeredHighlights(g, p0, p1, viewBounds,
+									editor, view);
+				}
+			}
+		}
+	}
+
+
+	private void repaintListHighlight(Object tag) {
+		if (tag instanceof LayeredHighlightInfo) {
+			LayeredHighlightInfo lhi = (LayeredHighlightInfo)tag;
+		    if (lhi.width > 0 && lhi.height > 0) {
+		    	textArea.repaint(lhi.x, lhi.y, lhi.width, lhi.height);
+		    }
+		}
+		else {
+			HighlightInfo info = (HighlightInfo) tag;
+			TextUI ui = textArea.getUI();
+			ui.damageRange(textArea, info.getStartOffset(),info.getEndOffset());
+			//safeDamageRange(info.p0, info.p1);
+		}
+	}
+
+
+	/**
+	 * Removes a parser highlight from this view.
+	 *
+	 * @param tag The reference to the highlight.
+	 * @see #addParserHighlight(ParserNotice, javax.swing.text.Highlighter.HighlightPainter)
+	 */
+	void removeParserHighlight(Object tag) {
+		repaintListHighlight(tag);
+		parserHighlights.remove(tag);
+	}
+
+
+	private static class HighlightInfo implements Highlighter.Highlight {
+	
+		private Position p0;
+		private Position p1;
+		protected Highlighter.HighlightPainter painter;
+		private ParserNotice notice;//Color color; // Used only by Parser highlights.
+
+		public Color getColor() {
+			//return color;
+			Color color = null;
+			if (notice!=null) {
+				color = notice.getColor();
+				if (color==null) {
+					color = DEFAULT_PARSER_NOTICE_COLOR;
+				}
+			}
+			return color;
+		}
+
+		public int getStartOffset() {
+			return p0.getOffset();
+		}
+		
+		public int getEndOffset() {
+			return p1.getOffset();
+		}
+		
+		public Highlighter.HighlightPainter getPainter() {
+			return painter;
+		}
+		
+	}
+
+
+	private static class LayeredHighlightInfo extends HighlightInfo {
+	
+		private int x;
+		private int y;
+		private int width;
+		private int height;
+
+		void union(Shape bounds) {
+			if (bounds == null) {
+				return;
+			}
+			Rectangle alloc = (bounds instanceof Rectangle) ?
+					(Rectangle)bounds : bounds.getBounds();
+			if (width == 0 || height == 0) {
+				x = alloc.x;
+				y = alloc.y;
+				width = alloc.width;
+				height = alloc.height;
+			}
+			else {
+				width = Math.max(x + width, alloc.x + alloc.width);
+				height = Math.max(y + height, alloc.y + alloc.height);
+				x = Math.min(x, alloc.x);
+				width -= x;
+				y = Math.min(y, alloc.y);
+				height -= y;
+			}
+		}
+	
+		/**
+		 * Restricts the region based on the receivers offsets and messages
+		 * the painter to paint the region.
+		 */
+		void paintLayeredHighlights(Graphics g, int p0, int p1,
+									Shape viewBounds, JTextComponent editor,
+									View view) {
+			int start = getStartOffset();
+			int end = getEndOffset();
+			// Restrict the region to what we represent
+			p0 = Math.max(start, p0);
+			p1 = Math.min(end, p1);
+			if (getColor()!=null &&
+					(painter instanceof ChangeableColorHighlightPainter)) {
+				((ChangeableColorHighlightPainter)painter).setColor(getColor());
+			}
+			// Paint the appropriate region using the painter and union
+			// the effected region with our bounds.
+			union(((LayeredHighlighter.LayerPainter)painter).paintLayer
+								(g, p0, p1, viewBounds, editor, view));
+		}
+	
+	}
+	
+	
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaUI.java b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaUI.java
new file mode 100644
index 0000000..5e82cdd
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaUI.java
@@ -0,0 +1,256 @@
+/*
+ * 02/24/2004
+ *
+ * RSyntaxTextAreaUI.java - UI for an RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.beans.PropertyChangeEvent;
+import javax.swing.InputMap;
+import javax.swing.JComponent;
+import javax.swing.UIManager;
+import javax.swing.plaf.ComponentUI;
+import javax.swing.plaf.InputMapUIResource;
+import javax.swing.text.*;
+
+import org.fife.ui.rtextarea.RTextArea;
+import org.fife.ui.rtextarea.RTextAreaUI;
+
+
+/**
+ * UI used by <code>RSyntaxTextArea</code>.  This allows us to implement
+ * syntax highlighting.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class RSyntaxTextAreaUI extends RTextAreaUI {
+
+	private static final String SHARED_ACTION_MAP_NAME	= "RSyntaxTextAreaUI.actionMap";
+	private static final String SHARED_INPUT_MAP_NAME		= "RSyntaxTextAreaUI.inputMap";
+	private static final EditorKit defaultKit			= new RSyntaxTextAreaEditorKit();
+
+
+	public static ComponentUI createUI(JComponent ta) {
+		return new RSyntaxTextAreaUI(ta);
+	}
+
+
+	/**
+	 * Constructor.
+	 */
+	public RSyntaxTextAreaUI(JComponent rSyntaxTextArea) {
+		super(rSyntaxTextArea);
+	}
+
+
+    /**
+     * Creates the view for an element.
+     *
+     * @param elem The element.
+     * @return The view.
+     */
+	public View create(Element elem) {
+		RTextArea c = getRTextArea();
+		if (c instanceof RSyntaxTextArea) {
+			RSyntaxTextArea area = (RSyntaxTextArea) c;
+			View v;
+			if (area.getLineWrap())
+				v = new WrappedSyntaxView(elem);
+			else
+				v = new SyntaxView(elem);
+			return v;
+		}
+		return null;
+	}
+
+
+	/**
+	 * Creates the highlighter to use for syntax text areas.
+	 *
+	 * @return The highlighter.
+	 */
+	protected Highlighter createHighlighter() {
+		return new RSyntaxTextAreaHighlighter();
+	}
+
+
+	/**
+	 * Returns the name to use to cache/fetch the shared action map.  This
+	 * should be overridden by subclasses if the subclass has its own custom
+	 * editor kit to install, so its actions get picked up.
+	 *
+	 * @return The name of the cached action map.
+	 */
+	protected String getActionMapName() {
+		return SHARED_ACTION_MAP_NAME;
+	}
+
+
+	/**
+	 * Fetches the EditorKit for the UI.
+	 *
+	 * @param tc The text component for which this UI is installed.
+	 * @return The editor capabilities.
+	 * @see javax.swing.plaf.TextUI#getEditorKit
+	 */
+	public EditorKit getEditorKit(JTextComponent tc) {
+		return defaultKit;
+	}
+
+
+	/**
+	 * Get the InputMap to use for the UI.<p>  
+	 *
+	 * This method is not named <code>getInputMap()</code> because there is
+	 * a package-private method in <code>BasicTextAreaUI</code> with that name.
+	 * Thus, creating a new method with that name causes certain compilers to
+	 * issue warnings that you are not actually overriding the original method
+	 * (since it is package-private).
+	 */
+	protected InputMap getRTextAreaInputMap() {
+		InputMap map = new InputMapUIResource();
+		InputMap shared = (InputMap)UIManager.get(SHARED_INPUT_MAP_NAME);
+		if (shared==null) {
+			shared = new RSyntaxTextAreaDefaultInputMap();
+			UIManager.put(SHARED_INPUT_MAP_NAME, shared);
+		}
+		//KeyStroke[] keys = shared.allKeys();
+		//for (int i=0; i<keys.length; i++)
+		//	System.err.println(keys[i] + " -> " + shared.get(keys[i]));
+		map.setParent(shared);
+		return map;
+	}
+
+
+	/**
+	 * Paints the text area's background.
+	 *
+	 * @param g The graphics component on which to paint.
+	 */
+	protected void paintBackground(Graphics g) {
+		super.paintBackground(g);
+		paintMatchedBracket(g);
+	}
+
+
+	/**
+	 * Paints the "matched bracket", if any.
+	 *
+	 * @param g The graphics context.
+	 */
+	protected void paintMatchedBracket(Graphics g) {
+		RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+		if (rsta.isBracketMatchingEnabled()) {
+			Rectangle match = rsta.getMatchRectangle();
+			if (match!=null) {
+				paintMatchedBracketImpl(g, rsta, match);
+			}
+			if (rsta.getPaintMatchedBracketPair()) {
+				Rectangle dotRect = rsta.getDotRectangle();
+				if (dotRect!=null) { // should always be true
+					paintMatchedBracketImpl(g, rsta, dotRect);
+				}
+			}
+		}
+	}
+
+
+	private void paintMatchedBracketImpl(Graphics g, RSyntaxTextArea rsta,
+			Rectangle r) {
+		// We must add "-1" to the height because otherwise we'll paint below
+		// the region that gets invalidated.
+		if (rsta.getAnimateBracketMatching()) {
+			Color bg = rsta.getMatchedBracketBGColor();
+			if (bg!=null) {
+				g.setColor(bg);
+				g.fillRoundRect(r.x,r.y, r.width,r.height-1, 5,5);
+			}
+			g.setColor(rsta.getMatchedBracketBorderColor());
+			g.drawRoundRect(r.x,r.y, r.width,r.height-1, 5,5);
+		}
+		else {
+			Color bg = rsta.getMatchedBracketBGColor();
+			if (bg!=null) {
+				g.setColor(bg);
+				g.fillRect(r.x,r.y, r.width,r.height-1);
+			}
+			g.setColor(rsta.getMatchedBracketBorderColor());
+			g.drawRect(r.x,r.y, r.width,r.height-1);
+		}
+	}
+
+
+	/**
+	 * Gets called whenever a bound property is changed on this UI's
+	 * <code>RSyntaxTextArea</code>.
+	 *
+	 * @param e The property change event.
+	 */
+	protected void propertyChange(PropertyChangeEvent e) {
+
+		String name = e.getPropertyName();
+
+		// If they change the syntax scheme, we must do this so that
+		// WrappedSyntaxView(_TEST) updates its child views properly.
+		if (name.equals(RSyntaxTextArea.SYNTAX_SCHEME_PROPERTY)) {
+			modelChanged();
+		}
+
+		// Everything else is general to all RTextAreas.
+		else {
+			super.propertyChange(e);
+		}
+
+	}
+
+
+	/**
+	 * Updates the view.  This should be called when the underlying
+	 * <code>RSyntaxTextArea</code> changes its syntax editing style.
+	 */
+	public void refreshSyntaxHighlighting() {
+		modelChanged();
+	}
+
+
+	/**
+	 * Returns the y-coordinate of the specified line.<p>
+	 *
+	 * This method is quicker than using traditional
+	 * <code>modelToView(int)</code> calls, as the entire bounding box isn't
+	 * computed.
+	 */
+	public int yForLine(int line) throws BadLocationException {
+		Rectangle alloc = getVisibleEditorRect();
+		if (alloc!=null) {
+			RSTAView view = (RSTAView)getRootView(textArea).getView(0);
+			return view.yForLine(alloc, line);
+		}
+		return -1;
+	}
+
+
+	/**
+	 * Returns the y-coordinate of the line containing a specified offset.<p>
+	 *
+	 * This is faster than calling <code>modelToView(offs).y</code>, so it is
+	 * preferred if you do not need the actual bounding box.
+	 */
+	public int yForLineContaining(int offs) throws BadLocationException {
+		Rectangle alloc = getVisibleEditorRect();
+		if (alloc!=null) {
+			RSTAView view = (RSTAView)getRootView(textArea).getView(0);
+			return view.yForLineContaining(alloc, offs);
+		}
+		return -1;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSyntaxUtilities.java b/src/org/fife/ui/rsyntaxtextarea/RSyntaxUtilities.java
new file mode 100644
index 0000000..75d7ce5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSyntaxUtilities.java
@@ -0,0 +1,1332 @@
+/*
+ * 08/06/2004
+ *
+ * RSyntaxUtilities.java - Utility methods used by RSyntaxTextArea and its
+ * views.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Container;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.Toolkit;
+import java.util.Map;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+import javax.swing.*;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Position;
+import javax.swing.text.Segment;
+import javax.swing.text.TabExpander;
+import javax.swing.text.View;
+
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+import org.fife.ui.rtextarea.Gutter;
+import org.fife.ui.rtextarea.RTextArea;
+import org.fife.ui.rtextarea.RTextScrollPane;
+
+
+/**
+ * Utility methods used by <code>RSyntaxTextArea</code> and its associated
+ * classes.
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ */
+public class RSyntaxUtilities implements SwingConstants {
+
+	/**
+	 * Integer constant representing a Windows-variant OS.
+	 */
+	public static final int OS_WINDOWS			= 1;
+
+	/**
+	 * Integer constant representing Mac OS X.
+	 */
+	public static final int OS_MAC_OSX			= 2;
+
+	/**
+	 * Integer constant representing Linux.
+	 */
+	public static final int OS_LINUX			= 4;
+
+	/**
+	 * Integer constant representing an "unknown" OS.  99.99% of the
+	 * time, this means some UNIX variant (AIX, SunOS, etc.).
+	 */
+	public static final int OS_OTHER			= 8;
+
+	
+	private static final int OS = getOSImpl();
+
+	//private static final int DIGIT_MASK			= 1;
+	private static final int LETTER_MASK			= 2;
+	//private static final int WHITESPACE_MASK		= 4;
+	//private static final int UPPER_CASE_MASK		= 8;
+	private static final int HEX_CHARACTER_MASK		= 16;
+	private static final int LETTER_OR_DIGIT_MASK	= 32;
+	private static final int BRACKET_MASK			= 64;
+	private static final int JAVA_OPERATOR_MASK		= 128;
+
+	/**
+	 * A lookup table used to quickly decide if a 16-bit Java char is a
+	 * US-ASCII letter (A-Z or a-z), a digit, a whitespace char (either space
+	 * (0x0020) or tab (0x0009)), etc.  This method should be faster
+	 * than <code>Character.isLetter</code>, <code>Character.isDigit</code>,
+	 * and <code>Character.isWhitespace</code> because we know we are dealing
+	 * with ASCII chars and so don't have to worry about code planes, etc.
+	 */
+	private static final int[] dataTable = {
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0, // 0-15
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 16-31
+		 4, 128,   0,   0,   0, 128, 128,   0,  64,  64, 128, 128,   0, 128,   0, 128, // 32-47
+		49,  49,  49,  49,  49,  49,  49,  49,  49,  49, 128,   0, 128, 128, 128, 128, // 48-63
+		 0,  58,  58,  58,  58,  58,  58,  42,  42,  42,  42,  42,  42,  42,  42,  42, // 64-79
+		42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  64,   0,  64, 128,   0, // 80-95
+		 0,  50,  50,  50,  50,  50,  50,  34,  34,  34,  34,  34,  34,  34,  34,  34, // 96-111
+		34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  64, 128,  64, 128,   0, // 112-127
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 128-143
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 144-
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 160-
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 176-
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 192-
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 208-
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 224-
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0  // 240-255.
+	};
+
+	/**
+	 * Used in bracket matching methods.
+	 */
+	private static Segment charSegment = new Segment();
+
+	/**
+	 * Used internally.
+	 */
+	private static final char[] JS_KEYWORD_RETURN = { 'r', 'e', 't', 'u', 'r', 'n' };
+
+	/**
+	 * Used internally.
+	 */
+	private static final String BRACKETS = "{([})]";
+
+
+	/**
+	 * Returns a string with characters that are special to HTML (such as
+	 * <code><</code>, <code>></code> and <code>&</code>) replaced
+	 * by their HTML escape sequences.
+	 *
+	 * @param s The input string.
+	 * @param newlineReplacement What to replace newline characters with.
+	 *        If this is <code>null</code>, they are simply removed.
+	 * @param inPreBlock Whether this HTML will be in within <code>pre</code>
+	 *        tags.  If this is <code>true</code>, spaces will be kept as-is;
+	 *        otherwise, they will be converted to "<code> </code>".
+	 * @return The escaped version of <code>s</code>.
+	 */
+	public static final String escapeForHtml(String s,
+						String newlineReplacement, boolean inPreBlock) {
+
+		if (s==null) {
+			return null;
+		}
+		if (newlineReplacement==null) {
+			newlineReplacement = "";
+		}
+		final String tabString = "   ";
+		boolean lastWasSpace = false;
+
+		// TODO: When updating to 1.5, replace with StringBuilder, and change
+		// loop to use new append(str, offs,len) method.
+		StringBuffer sb = new StringBuffer();
+
+		for (int i=0; i<s.length(); i++) {
+			char ch = s.charAt(i);
+			switch (ch) {
+				case ' ':
+					if (inPreBlock || !lastWasSpace) {
+						sb.append(' ');
+					}
+					else {
+						sb.append(" ");
+					}
+					lastWasSpace = true;
+					break;
+				case '\n':
+					sb.append(newlineReplacement);
+					lastWasSpace = false;
+					break;
+				case '&':
+					sb.append("&");
+					lastWasSpace = false;
+					break;
+				case '\t':
+					sb.append(tabString);
+					lastWasSpace = false;
+					break;
+				case '<':
+					sb.append("<");
+					lastWasSpace = false;
+					break;
+				case '>':
+					sb.append(">");
+					lastWasSpace = false;
+					break;
+				default:
+					sb.append(ch);
+					lastWasSpace = false;
+					break;
+			}
+		}
+
+		return sb.toString();
+
+	}
+
+
+	/**
+	 * Returns the rendering hints for text that will most accurately reflect
+	 * those of the native windowing system.
+	 *
+	 * @return The rendering hints, or <code>null</code> if they cannot be
+	 *         determined.
+	 */
+	public static Map getDesktopAntiAliasHints() {
+		return (Map)Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints");
+	}
+
+
+	/**
+	 * Returns the color to use for the line underneath a folded region line.
+	 *
+	 * @param textArea The text area.
+	 * @return The color to use.
+	 */
+	public static Color getFoldedLineBottomColor(RSyntaxTextArea textArea) {
+		Color color = Color.gray;
+		Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+		if (gutter!=null) {
+			color = gutter.getFoldIndicatorForeground();
+		}
+		return color;
+	}
+
+
+	/**
+	 * Returns the gutter component of the scroll pane containing a text
+	 * area, if any.
+	 *
+	 * @param textArea The text area.
+	 * @return The gutter, or <code>null</code> if the text area is not in
+	 *         an {@link RTextScrollPane}.
+	 * @see RTextScrollPane#getGutter()
+	 */
+	public static Gutter getGutter(RTextArea textArea) {
+		Gutter gutter = null;
+		Container parent = textArea.getParent();
+		if (parent instanceof JViewport) {
+			parent = parent.getParent();
+			if (parent instanceof RTextScrollPane) {
+				RTextScrollPane sp = (RTextScrollPane)parent;
+				gutter = sp.getGutter(); // Should always be non-null
+			}
+		}
+		return gutter;
+	}
+
+
+	/**
+	 * Returns the leading whitespace of a string.
+	 *
+	 * @param text The String to check.
+	 * @return The leading whitespace.
+	 * @see #getLeadingWhitespace(Document, int)
+	 */
+	public static String getLeadingWhitespace(String text) {
+		int count = 0;
+		int len = text.length();
+		while (count<len && RSyntaxUtilities.isWhitespace(text.charAt(count))) {
+			count++;
+		}
+		return text.substring(0, count);
+	}
+
+
+	/**
+	 * Returns the leading whitespace of a specific line in a document.
+	 *
+	 * @param doc The document.
+	 * @param offs The offset whose line to get the leading whitespace for.
+	 * @return The leading whitespace.
+	 * @throws BadLocationException If <code>offs</code> is not a valid offset
+	 *         in the document.
+	 * @see #getLeadingWhitespace(String)
+	 */
+	public static String getLeadingWhitespace(Document doc, int offs)
+									throws BadLocationException {
+		Element root = doc.getDefaultRootElement();
+		int line = root.getElementIndex(offs);
+		Element elem = root.getElement(line);
+		int startOffs = elem.getStartOffset();
+		int endOffs = elem.getEndOffset() - 1;
+		String text = doc.getText(startOffs, endOffs-startOffs);
+		return getLeadingWhitespace(text);
+	}
+
+
+	private static final Element getLineElem(Document d, int offs) {
+		Element map = d.getDefaultRootElement();
+		int index = map.getElementIndex(offs);
+		Element elem = map.getElement(index);
+		if ((offs>=elem.getStartOffset()) && (offs<elem.getEndOffset())) {
+			return elem;
+		}
+		return null;
+	}
+
+
+	/**
+	 * Returns the bounding box (in the current view) of a specified position
+	 * in the model.  This method is designed for line-wrapped views to use,
+	 * as it allows you to specify a "starting position" in the line, from
+	 * which the x-value is assumed to be zero.  The idea is that you specify
+	 * the first character in a physical line as <code>p0</code>, as this is
+	 * the character where the x-pixel value is 0.
+	 *
+	 * @param textArea The text area containing the text.
+	 * @param s A segment in which to load the line.  This is passed in so we
+	 *        don't have to reallocate a new <code>Segment</code> for each
+	 *        call.
+	 * @param p0 The starting position in the physical line in the document.
+	 * @param p1 The position for which to get the bounding box in the view.
+	 * @param e How to expand tabs.
+	 * @param rect The rectangle whose x- and width-values are changed to
+	 *        represent the bounding box of <code>p1</code>.  This is reused
+	 *        to keep from needlessly reallocating Rectangles.
+	 * @param x0 The x-coordinate (pixel) marking the left-hand border of the
+	 *        text.  This is useful if the text area has a border, for example.
+	 * @return The bounding box in the view of the character <code>p1</code>.
+	 * @throws BadLocationException If <code>p0</code> or <code>p1</code> is
+	 *         not a valid location in the specified text area's document.
+	 * @throws IllegalArgumentException If <code>p0</code> and <code>p1</code>
+	 *         are not on the same line.
+	 */
+	public static Rectangle getLineWidthUpTo(RSyntaxTextArea textArea,
+								Segment s, int p0, int p1,
+								TabExpander e, Rectangle rect,
+								int x0)
+								throws BadLocationException {
+
+		RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+
+		// Ensure p0 and p1 are valid document positions.
+		if (p0<0)
+			throw new BadLocationException("Invalid document position", p0);
+		else if (p1>doc.getLength())
+			throw new BadLocationException("Invalid document position", p1);
+
+		// Ensure p0 and p1 are in the same line, and get the start/end
+		// offsets for that line.
+		Element map = doc.getDefaultRootElement();
+		int lineNum = map.getElementIndex(p0);
+		// We do ">1" because p1 might be the first position on the next line
+		// or the last position on the previous one.
+		// if (lineNum!=map.getElementIndex(p1))
+		if (Math.abs(lineNum-map.getElementIndex(p1))>1)
+			throw new IllegalArgumentException("p0 and p1 are not on the " +
+						"same line (" + p0 + ", " + p1 + ").");
+
+		// Get the token list.
+		Token t = doc.getTokenListForLine(lineNum);
+
+		// Modify the token list 't' to begin at p0 (but still have correct
+		// token types, etc.), and get the x-location (in pixels) of the
+		// beginning of this new token list.
+		makeTokenListStartAt(t, p0, e, textArea, 0);
+
+		rect = t.listOffsetToView(textArea, e, p1, x0, rect);
+		return rect;
+
+	}
+
+
+	/**
+	 * Returns the location of the bracket paired with the one at the current
+	 * caret position.
+	 *
+	 * @param textArea The text area.
+	 * @param input A point to use as the return value.  If this is
+	 *        <code>null</code>, a new object is created and returned.
+	 * @return A point representing the matched bracket info.  The "x" field
+	 *         is the offset of the bracket at the caret position (either just
+	 *         before or just after the caret), and the "y" field is the offset
+	 *         of the matched bracket.  Both "x" and "y" will be
+	 *         <code>-1</code> if there isn't a matching bracket (or the caret
+	 *         isn't on a bracket).
+	 */
+	public static Point getMatchingBracketPosition(RSyntaxTextArea textArea,
+										Point input) {
+
+		if (input==null) {
+			input = new Point();
+		}
+		input.setLocation(-1, -1);
+
+		try {
+
+			// Actually position just BEFORE caret.
+			int caretPosition = textArea.getCaretPosition() - 1;
+			RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+			char bracket = 0;
+
+			// If the caret was at offset 0, we can't check "to its left."
+			if (caretPosition>=0) {
+				bracket  = doc.charAt(caretPosition);
+			}
+
+			// Try to match a bracket "to the right" of the caret if one
+			// was not found on the left.
+			int index = BRACKETS.indexOf(bracket);
+			if (index==-1 && caretPosition<doc.getLength()-1) {
+				bracket = doc.charAt(++caretPosition);
+			}
+
+			// First, see if the char was a bracket (one of "{[()]}").
+			if (index==-1) {
+				index = BRACKETS.indexOf(bracket);
+				if (index==-1) {
+					return input;
+				}
+			}
+
+			// If it was, then make sure this bracket isn't sitting in
+			// the middle of a comment or string.  If it isn't, then
+			// initialize some stuff so we can continue on.
+			char bracketMatch;
+			boolean goForward;
+			Element map = doc.getDefaultRootElement();
+			int curLine = map.getElementIndex(caretPosition);
+			Element line = map.getElement(curLine);
+			int start = line.getStartOffset();
+			int end = line.getEndOffset();
+			Token token = doc.getTokenListForLine(curLine);
+			token = RSyntaxUtilities.getTokenAtOffset(token, caretPosition);
+			// All brackets are always returned as "separators."
+			if (token.type!=Token.SEPARATOR) {
+				return input;
+			}
+			if (index<3) { // One of "{[("
+				goForward = true;
+				bracketMatch = BRACKETS.charAt(index + 3);
+			}
+			else { // One of ")]}"
+				goForward = false;
+				bracketMatch = BRACKETS.charAt(index - 3);
+			}
+
+			if (goForward) {
+
+				int lastLine = map.getElementCount();
+
+				// Start just after the found bracket since we're sure
+				// we're not in a comment.
+				start = caretPosition + 1;
+				int numEmbedded = 0;
+				boolean haveTokenList = false;
+
+				while (true) {
+
+					doc.getText(start,end-start, charSegment);
+					int segOffset = charSegment.offset;
+
+					for (int i=segOffset; i<segOffset+charSegment.count; i++) {
+
+						char ch = charSegment.array[i];
+
+						if (ch==bracket) {
+							if (haveTokenList==false) {
+								token = doc.getTokenListForLine(curLine);
+								haveTokenList = true;
+							}
+							int offset = start + (i-segOffset);
+							token = RSyntaxUtilities.getTokenAtOffset(token, offset);
+							if (token.type==Token.SEPARATOR)
+								numEmbedded++;
+						}
+
+						else if (ch==bracketMatch) {
+							if (haveTokenList==false) {
+								token = doc.getTokenListForLine(curLine);
+								haveTokenList = true;
+							}
+							int offset = start + (i-segOffset);
+							token = RSyntaxUtilities.getTokenAtOffset(token, offset);
+							if (token.type==Token.SEPARATOR) {
+								if (numEmbedded==0) {
+									if (textArea.isCodeFoldingEnabled() &&
+											textArea.getFoldManager().isLineHidden(curLine)) {
+										return input; // Match hidden in a fold
+									}
+									input.setLocation(caretPosition, offset);
+									return input;
+								}
+								numEmbedded--;
+							}
+						}
+
+					} // End of for (int i=segOffset; i<segOffset+charSegment.count; i++).
+
+					// Bail out if we've gone through all lines and
+					// haven't found the match.
+					if (++curLine==lastLine)
+						return input;
+
+					// Otherwise, go through the next line.
+					haveTokenList = false;
+					line = map.getElement(curLine);
+					start = line.getStartOffset();
+					end = line.getEndOffset();
+
+				} // End of while (true).
+
+			} // End of if (goForward).
+
+
+			// Otherwise, we're going backward through the file
+			// (since we found '}', ')' or ']').
+			else {	// goForward==false
+
+				// End just before the found bracket since we're sure
+				// we're not in a comment.
+				end = caretPosition;// - 1;
+				int numEmbedded = 0;
+				boolean haveTokenList = false;
+				Token t2;
+
+				while (true) {
+
+					doc.getText(start,end-start, charSegment);
+					int segOffset = charSegment.offset;
+					int iStart = segOffset + charSegment.count - 1;
+
+					for (int i=iStart; i>=segOffset; i--) {
+
+						char ch = charSegment.array[i];
+
+						if (ch==bracket) {
+							if (haveTokenList==false) {
+								token = doc.getTokenListForLine(curLine);
+								haveTokenList = true;
+							}
+							int offset = start + (i-segOffset);
+							t2 = RSyntaxUtilities.getTokenAtOffset(token, offset);
+							if (t2.type==Token.SEPARATOR)
+								numEmbedded++;
+						}
+
+						else if (ch==bracketMatch) {
+							if (haveTokenList==false) {
+								token = doc.getTokenListForLine(curLine);
+								haveTokenList = true;
+							}
+							int offset = start + (i-segOffset);
+							t2 = RSyntaxUtilities.getTokenAtOffset(token, offset);
+							if (t2.type==Token.SEPARATOR) {
+								if (numEmbedded==0) {
+									input.setLocation(caretPosition, offset);
+									return input;
+								}
+								numEmbedded--;
+							}
+						}
+
+					}
+
+					// Bail out if we've gone through all lines and
+					// haven't found the match.
+					if (--curLine==-1) {
+						return input;
+					}
+
+					// Otherwise, get ready for going through the
+					// next line.
+					haveTokenList = false;
+					line = map.getElement(curLine);
+					start = line.getStartOffset();
+					end = line.getEndOffset();
+
+				} // End of while (true).
+
+			} // End of else.
+
+		} catch (BadLocationException ble) {
+			// Shouldn't ever happen.
+			ble.printStackTrace();
+		}
+
+		// Something went wrong...
+		return input;
+
+	}
+
+
+	/**
+	 * Returns the next non-whitespace, non-comment token in a text area.
+	 *
+	 * @param t The next token in this line's token list.
+	 * @param textArea The text area.
+	 * @param line The current line index (the line index of <code>t</code>).
+	 * @return The next non-whitespace, non-comment token, or <code>null</code>
+	 *         if there isn't one.
+	 * @see #getPreviousImportantToken(RSyntaxTextArea, int)
+	 */
+	public static final Token getNextImportantToken(Token t,
+			RSyntaxTextArea textArea, int line) {
+		while (t!=null && t.isPaintable() && t.isCommentOrWhitespace()) {
+			t = t.getNextToken();
+		}
+		if ((t==null || !t.isPaintable()) && line<textArea.getLineCount()-1) {
+			t = textArea.getTokenListForLine(++line);
+			return getNextImportantToken(t, textArea, line);
+		}
+		return t;
+	}
+
+
+	/**
+	 * Provides a way to determine the next visually represented model 
+	 * location at which one might place a caret.
+	 * Some views may not be visible,
+	 * they might not be in the same order found in the model, or they just
+	 * might not allow access to some of the locations in the model.<p>
+	 *
+	 * NOTE:  You should only call this method if the passed-in
+	 * <code>javax.swing.text.View</code> is an instance of
+	 * {@link TokenOrientedView} and <code>javax.swing.text.TabExpander</code>;
+	 * otherwise, a <code>ClassCastException</code> could be thrown.
+	 *
+	 * @param pos the position to convert >= 0
+	 * @param a the allocated region in which to render
+	 * @param direction the direction from the current position that can
+	 *  be thought of as the arrow keys typically found on a keyboard.
+	 *  This will be one of the following values:
+	 * <ul>
+	 * <li>SwingConstants.WEST
+	 * <li>SwingConstants.EAST
+	 * <li>SwingConstants.NORTH
+	 * <li>SwingConstants.SOUTH
+	 * </ul>
+	 * @return the location within the model that best represents the next
+	 *  location visual position
+	 * @exception BadLocationException
+	 * @exception IllegalArgumentException if <code>direction</code>
+	 *		doesn't have one of the legal values above
+	 */
+	public static int getNextVisualPositionFrom(int pos, Position.Bias b,
+									Shape a, int direction,
+									Position.Bias[] biasRet, View view) 
+									throws BadLocationException {
+
+		RSyntaxTextArea target = (RSyntaxTextArea)view.getContainer();
+		biasRet[0] = Position.Bias.Forward;
+
+		// Do we want the "next position" above, below, to the left or right?
+		switch (direction) {
+
+			case NORTH:
+			case SOUTH:
+				if (pos == -1) {
+					pos = (direction == NORTH) ?
+								Math.max(0, view.getEndOffset() - 1) :
+								view.getStartOffset();
+					break;
+				}
+				Caret c = (target != null) ? target.getCaret() : null;
+				// YECK! Ideally, the x location from the magic caret
+				// position would be passed in.
+				Point mcp;
+				if (c != null)
+					mcp = c.getMagicCaretPosition();
+				else
+					mcp = null;
+				int x;
+				if (mcp == null) {
+					Rectangle loc = target.modelToView(pos);
+					x = (loc == null) ? 0 : loc.x;
+				}
+				else {
+					x = mcp.x;
+				}
+				if (direction == NORTH)
+					pos = getPositionAbove(target,pos,x,(TabExpander)view);
+				else
+					pos = getPositionBelow(target,pos,x,(TabExpander)view);
+				break;
+
+			case WEST:
+				if(pos == -1) {
+					pos = Math.max(0, view.getEndOffset() - 1);
+				}
+				else {
+					pos = Math.max(0, pos - 1);
+					if (target.isCodeFoldingEnabled()) {
+						int last = target.getLineOfOffset(pos+1);
+						int current = target.getLineOfOffset(pos);
+						if (last!=current) { // If moving up a line...
+							FoldManager fm = target.getFoldManager();
+							if (fm.isLineHidden(current)) {
+								while (--current>0 && fm.isLineHidden(current));
+								pos = target.getLineEndOffset(current) - 1;
+							}
+						}
+					}
+				}
+				break;
+
+			case EAST:
+				if(pos == -1) {
+					pos = view.getStartOffset();
+				}
+				else {
+					pos = Math.min(pos + 1, view.getDocument().getLength());
+					if (target.isCodeFoldingEnabled()) {
+						int last = target.getLineOfOffset(pos-1);
+						int current = target.getLineOfOffset(pos);
+						if (last!=current) { // If moving down a line...
+							FoldManager fm = target.getFoldManager();
+							if (fm.isLineHidden(current)) {
+								int lineCount = target.getLineCount();
+								while (++current<lineCount && fm.isLineHidden(current));
+								pos = current==lineCount ?
+										target.getLineEndOffset(last)-1 : // Was the last visible line
+										target.getLineStartOffset(current);
+							}
+						}
+					}
+				}
+				break;
+
+			default:
+				throw new IllegalArgumentException(
+									"Bad direction: " + direction);
+		}
+
+		return pos;
+
+	}
+
+
+	/**
+	 * Determines the position in the model that is closest to the given 
+	 * view location in the row above.  The component given must have a
+	 * size to compute the result.  If the component doesn't have a size
+	 * a value of -1 will be returned.
+	 *
+	 * @param c the editor
+	 * @param offs the offset in the document >= 0
+	 * @param x the X coordinate >= 0
+	 * @return the position >= 0 if the request can be computed, otherwise
+	 *  a value of -1 will be returned.
+	 * @exception BadLocationException if the offset is out of range
+	 */
+	public static final int getPositionAbove(RSyntaxTextArea c, int offs,
+					float x, TabExpander e) throws BadLocationException {
+
+		TokenOrientedView tov = (TokenOrientedView)e;
+		Token token = tov.getTokenListForPhysicalLineAbove(offs);
+		if (token==null)
+			return -1;
+
+		// A line containing only Token.NULL is an empty line.
+		else if (token.type==Token.NULL) {
+			int line = c.getLineOfOffset(offs);	// Sure to be >0 ??
+			return c.getLineStartOffset(line-1);
+		}
+
+		else {
+			return token.getListOffset(c, e, 0, x);
+		}
+
+	}
+
+
+	/**
+	 * Determines the position in the model that is closest to the given 
+	 * view location in the row below.  The component given must have a
+	 * size to compute the result.  If the component doesn't have a size
+	 * a value of -1 will be returned.
+	 *
+	 * @param c the editor
+	 * @param offs the offset in the document >= 0
+	 * @param x the X coordinate >= 0
+	 * @return the position >= 0 if the request can be computed, otherwise
+	 *  a value of -1 will be returned.
+	 * @exception BadLocationException if the offset is out of range
+	 */
+	public static final int getPositionBelow(RSyntaxTextArea c, int offs,
+					float x, TabExpander e) throws BadLocationException {
+
+		TokenOrientedView tov = (TokenOrientedView)e;
+		Token token = tov.getTokenListForPhysicalLineBelow(offs);
+		if (token==null)
+			return -1;
+
+		// A line containing only Token.NULL is an empty line.
+		else if (token.type==Token.NULL) {
+			int line = c.getLineOfOffset(offs);	// Sure to be > c.getLineCount()-1 ??
+//			return c.getLineStartOffset(line+1);
+FoldManager fm = c.getFoldManager();
+line = fm.getVisibleLineBelow(line);
+return c.getLineStartOffset(line);
+		}
+
+		else {
+			return token.getListOffset(c, e, 0, x);
+		}
+
+	}
+
+
+	/**
+	 * Returns the last non-whitespace, non-comment token, starting with the
+	 * specified line.
+	 *
+	 * @param textArea The text area.
+	 * @param line The line at which to start looking.
+	 * @return The last non-whitespace, non-comment token, or <code>null</code>
+	 *         if there isn't one.
+	 * @see #getNextImportantToken(Token, RSyntaxTextArea, int)
+	 */
+	public static final Token getPreviousImportantToken(
+			RSyntaxTextArea textArea, int line){
+		if (line<0) {
+			return null;
+		}
+		Token t = textArea.getTokenListForLine(line);
+		if (t!=null) {
+			t = t.getLastNonCommentNonWhitespaceToken();
+			if (t!=null) {
+				return t;
+			}
+		}
+		return getPreviousImportantToken(textArea, line-1);
+	}
+
+
+	/**
+	 * Returns the token at the specified index, or <code>null</code> if
+	 * the given offset isn't in this token list's range.<br>
+	 * Note that this method does NOT check to see if <code>tokenList</code>
+	 * is null; callers should check for themselves.
+	 *
+	 * @param tokenList The list of tokens in which to search.
+	 * @param offset The offset at which to get the token.
+	 * @return The token at <code>offset</code>, or <code>null</code> if
+	 *         none of the tokens are at that offset.
+	 */
+	public static final Token getTokenAtOffset(Token tokenList, int offset) {
+		for (Token t=tokenList; t!=null && t.isPaintable(); t=t.getNextToken()){
+			if (t.containsPosition(offset))
+				return t;
+		}
+		return null;
+	}
+
+
+	/**
+	 * Returns the end of the word at the given offset.
+	 *
+	 * @param textArea The text area.
+	 * @param offs The offset into the text area's content.
+	 * @return The end offset of the word.
+	 * @throws BadLocationException If <code>offs</code> is invalid.
+	 * @see #getWordStart(RSyntaxTextArea, int)
+	 */
+	public static int getWordEnd(RSyntaxTextArea textArea, int offs)
+										throws BadLocationException {
+
+		Document doc = textArea.getDocument();
+		int endOffs = textArea.getLineEndOffsetOfCurrentLine();
+		int lineEnd = Math.min(endOffs, doc.getLength());
+		if (offs == lineEnd) { // End of the line.
+			return offs;
+		}
+
+		String s = doc.getText(offs, lineEnd-offs-1);
+		if (s!=null && s.length()>0) { // Should always be true
+			int i = 0;
+			int count = s.length();
+			char ch = s.charAt(i);
+			if (Character.isWhitespace(ch)) {
+				while (i<count && Character.isWhitespace(s.charAt(i++)));
+			}
+			else if (Character.isLetterOrDigit(ch)) {
+				while (i<count && Character.isLetterOrDigit(s.charAt(i++)));
+			}
+			else {
+				i = 2;
+			}
+			offs += i - 1;
+		}
+
+		return offs;
+
+	}
+
+	/**
+	 * Returns the start of the word at the given offset.
+	 *
+	 * @param textArea The text area.
+	 * @param offs The offset into the text area's content.
+	 * @return The start offset of the word.
+	 * @throws BadLocationException If <code>offs</code> is invalid.
+	 * @see #getWordEnd(RSyntaxTextArea, int)
+	 */
+	public static int getWordStart(RSyntaxTextArea textArea, int offs)
+											throws BadLocationException {
+
+		Document doc = textArea.getDocument();
+		Element line = getLineElem(doc, offs);
+		if (line == null) {
+			throw new BadLocationException("No word at " + offs, offs);
+		}
+
+		int lineStart = line.getStartOffset();
+		if (offs==lineStart) { // Start of the line.
+			return offs;
+		}
+
+		int endOffs = Math.min(offs+1, doc.getLength());
+		String s = doc.getText(lineStart, endOffs-lineStart);
+		if(s != null && s.length() > 0) {
+			int i = s.length() - 1;
+			char ch = s.charAt(i);
+			if (Character.isWhitespace(ch)) {
+				while (i>0 && Character.isWhitespace(s.charAt(i-1))) {
+					i--;
+				}
+				offs = lineStart + i;
+			}
+			else if (Character.isLetterOrDigit(ch)) {
+				while (i>0 && Character.isLetterOrDigit(s.charAt(i-1))) {
+					i--;
+				}
+				offs = lineStart + i;
+			}
+
+		}
+
+		return offs;
+
+	}
+
+
+	/**
+	 * Determines the width of the given token list taking tabs 
+	 * into consideration.  This is implemented in a 1.1 style coordinate 
+	 * system where ints are used and 72dpi is assumed.<p>
+	 *
+	 * This method also assumes that the passed-in token list begins at
+	 * x-pixel <code>0</code> in the view (for tab purposes).
+	 *
+	 * @param tokenList The tokenList list representing the text.
+	 * @param textArea The text area in which this token list resides.
+	 * @param e The tab expander.  This value cannot be <code>null</code>.
+	 * @return The width of the token list, in pixels.
+	 */
+	public static final float getTokenListWidth(Token tokenList,
+									RSyntaxTextArea textArea,
+									TabExpander e) {
+		return getTokenListWidth(tokenList, textArea, e, 0);
+	}
+
+
+	/**
+	 * Determines the width of the given token list taking tabs 
+	 * into consideration.  This is implemented in a 1.1 style coordinate 
+	 * system where ints are used and 72dpi is assumed.<p>
+	 *
+	 * @param tokenList The token list list representing the text.
+	 * @param textArea The text area in which this token list resides.
+	 * @param e The tab expander.  This value cannot be <code>null</code>.
+	 * @param x0 The x-pixel coordinate of the start of the token list.
+	 * @return The width of the token list, in pixels.
+	 * @see #getTokenListWidthUpTo
+	 */
+	public static final float getTokenListWidth(final Token tokenList,
+									RSyntaxTextArea textArea,
+									TabExpander e, float x0) {
+		float width = x0;
+		for (Token t=tokenList; t!=null&&t.isPaintable(); t=t.getNextToken()) {
+			width += t.getWidth(textArea, e, width);
+		}
+		return width - x0;
+	}
+
+
+	/**
+	 * Determines the width of the given token list taking tabs into
+	 * consideration and only up to the given index in the document
+	 * (exclusive).
+	 *
+	 * @param tokenList The token list representing the text.
+	 * @param textArea The text area in which this token list resides.
+	 * @param e The tab expander.  This value cannot be <code>null</code>.
+	 * @param x0 The x-pixel coordinate of the start of the token list.
+	 * @param upTo The document position at which you want to stop,
+	 *        exclusive.  If this position is before the starting position
+	 *        of the token list, a width of <code>0</code> will be
+	 *        returned; similarly, if this position comes after the entire
+	 *        token list, the width of the entire token list is returned.
+	 * @return The width of the token list, in pixels, up to, but not
+	 *         including, the character at position <code>upTo</code>.
+	 * @see #getTokenListWidth
+	 */
+	public static final float getTokenListWidthUpTo(final Token tokenList,
+								RSyntaxTextArea textArea, TabExpander e,
+								float x0, int upTo) {
+		float width = 0;
+		for (Token t=tokenList; t!=null&&t.isPaintable(); t=t.getNextToken()) {
+			if (t.containsPosition(upTo)) {
+				return width + t.getWidthUpTo(upTo-t.offset, textArea, e,
+													x0+width);
+			}
+			width += t.getWidth(textArea, e, x0+width);
+		}
+		return width;
+	}
+
+
+	/**
+	 * Returns whether or not this character is a "bracket" to be matched by
+	 * such programming languages as C, C++, and Java.
+	 *
+	 * @param ch The character to check.
+	 * @return Whether or not the character is a "bracket" - one of '(', ')',
+	 *         '[', ']', '{', and '}'.
+	 */
+	public static final boolean isBracket(char ch) {
+		// We need the first condition as it might be that ch>255, and thus
+		// not in our table.  '}' is the highest-valued char in the bracket
+		// set.
+		return ch<='}' && (dataTable[ch]&BRACKET_MASK)>0;
+	}
+
+
+	/**
+	 * Returns whether or not a character is a digit (0-9).
+	 *
+	 * @param ch The character to check.
+	 * @return Whether or not the character is a digit.
+	 */
+	public static final boolean isDigit(char ch) {
+		// We do it this way as we'd need to do two conditions anyway (first
+		// to check that ch<255 so it can index into our table, then whether
+		// that table position has the digit mask).
+		return ch>='0' && ch<='9';
+	}
+
+
+	/**
+	 * Returns whether or not this character is a hex character.  This method
+	 * accepts both upper- and lower-case letters a-f.
+	 *
+	 * @param ch The character to check.
+	 * @return Whether or not the character is a hex character 0-9, a-f, or
+	 *         A-F.
+	 */
+	public static final boolean isHexCharacter(char ch) {
+		// We need the first condition as it could be that ch>255 (and thus
+		// not a valid index into our table).  'f' is the highest-valued
+		// char that is a valid hex character.
+		return (ch<='f') && (dataTable[ch]&HEX_CHARACTER_MASK)>0;
+	}
+
+
+	/**
+	 * Returns whether a character is a Java operator.  Note that C and C++
+	 * operators are the same as Java operators.
+	 *
+	 * @param ch The character to check.
+	 * @return Whether or not the character is a Java operator.
+	 */
+	public static final boolean isJavaOperator(char ch) {
+		// We need the first condition as it could be that ch>255 (and thus
+		// not a valid index into our table).  '~' is the highest-valued
+		// char that is a valid Java operator.
+		return (ch<='~') && (dataTable[ch]&JAVA_OPERATOR_MASK)>0;
+	}
+
+
+	/**
+	 * Returns whether a character is a US-ASCII letter (A-Z or a-z).
+	 *
+	 * @param ch The character to check.
+	 * @return Whether or not the character is a US-ASCII letter.
+	 */
+	public static final boolean isLetter(char ch) {
+		// We need the first condition as it could be that ch>255 (and thus
+		// not a valid index into our table).
+		return (ch<='z') && (dataTable[ch]&LETTER_MASK)>0;
+	}
+
+
+	/**
+	 * Returns whether or not a character is a US-ASCII letter or a digit.
+	 *
+	 * @param ch The character to check.
+	 * @return Whether or not the character is a US-ASCII letter or a digit.
+	 */
+	public static final boolean isLetterOrDigit(char ch) {
+		// We need the first condition as it could be that ch>255 (and thus
+		// not a valid index into our table).
+		return (ch<='z') && (dataTable[ch]&LETTER_OR_DIGIT_MASK)>0;
+	}
+
+
+	/**
+	 * Returns whether or not a character is a whitespace character (either
+	 * a space ' ' or tab '\t').  This checks for the Unicode character values
+	 * 0x0020 and 0x0009.
+	 *
+	 * @param ch The character to check.
+	 * @return Whether or not the character is a whitespace character.
+	 */
+	public static final boolean isWhitespace(char ch) {
+		// We do it this way as we'd need to do two conditions anyway (first
+		// to check that ch<255 so it can index into our table, then whether
+		// that table position has the whitespace mask).
+		return ch==' ' || ch=='\t';
+	}
+
+
+	/**
+	 * Modifies the passed-in token list to start at the specified offset.
+	 * For example, if the token list covered positions 20-60 in the document
+	 * (inclusive) like so:
+	 * <pre>
+	 *   [token1] -> [token2] -> [token3] -> [token4]
+	 *   20     30   31     40   41     50   51     60
+	 * </pre>
+	 * and you used this method to make the token list start at position 44,
+	 * then the token list would be modified to be the following:
+	 * <pre>
+	 *   [part-of-old-token3] -> [token4]
+	 *   44                 50   51     60
+	 * </pre>
+	 * Tokens that come before the specified position are forever lost, and
+	 * the token containing that position is made to begin at that position if
+	 * necessary.  All token types remain the same as they were originally.<p>
+	 *
+	 * This method can be useful if you are only interested in part of a token
+	 * list (i.e., the line it represents), but you don't want to modify the
+	 * token list yourself.
+	 *
+	 * @param tokenList The list to make start at the specified position.
+	 *        This parameter is modified.
+	 * @param pos The position at which the new token list is to start.  If
+	 *        this position is not in the passed-in token list,
+	 *        returned token list will either be <code>null</code> or the
+	 *        unpaintable token(s) at the end of the passed-in token list.
+	 * @param e How to expand tabs.
+	 * @param textArea The text area from which the token list came.
+	 * @param x0 The initial x-pixel position of the old token list.
+	 * @return The width, in pixels, of the part of the token list "removed
+	 *         from the front."  This way, you know the x-offset of the "new"
+	 *         token list.
+	 */
+	public static float makeTokenListStartAt(Token tokenList, int pos,
+									TabExpander e,
+									final RSyntaxTextArea textArea,
+									float x0) {
+
+		Token t = tokenList;
+
+		// Loop through the token list until you find the one that contains
+		// pos.  Remember the cumulative width of all of these tokens.
+		while (t!=null && t.isPaintable() && !t.containsPosition(pos)) {
+			x0 += t.getWidth(textArea, e, x0);
+			t = t.getNextToken();
+		}
+
+		// Make the token that contains pos start at pos.
+		if (t!=null && t.isPaintable() && t.offset!=pos) {
+			// Number of chars between p0 and token start.
+			int difference = pos - t.offset;
+			x0 += t.getWidthUpTo(t.textCount-difference+1, textArea, e, x0);
+			t.makeStartAt(pos);
+		}
+
+		// Make the passed-in token list point to the proper place.
+		// t can be null, for example, if line ends with unended MLC.
+		if (t!=null && t.isPaintable())
+			tokenList.copyFrom(t);
+		else
+			tokenList = null;
+		t = null;
+
+		// Return the x-offset (in pixels) of the newly-modified t.
+		return x0;
+
+	}
+
+
+	/**
+	 * Returns whether a regular expression token can follow the specified
+	 * token in JavaScript.
+	 *
+	 * @param t The token to check, which may be <code>null</code>.
+	 * @return Whether a regular expression token may follow this one in
+	 *         JavaScript.
+	 */
+	public static boolean regexCanFollowInJavaScript(Token t) {
+		char ch;
+		// We basically try to mimic Eclipse's JS editor's behavior here.
+		return t==null ||
+				//t.isOperator() ||
+				(t.textCount==1 && (
+					(ch=t.text[t.textOffset])=='=' ||
+					ch=='(' ||
+					ch==',' ||
+					ch=='?' ||
+					ch==':' ||
+					ch=='[' ||
+					ch=='!' ||
+					ch=='&'
+				)) ||
+				/* Operators "==", "===", "!=", "!==" */
+				(t.type==Token.OPERATOR &&
+						t.text[t.textOffset+t.textCount-1]=='=') ||
+				t.is(Token.RESERVED_WORD, JS_KEYWORD_RETURN);
+	}
+
+
+	/**
+	 * If the character is an upper-case US-ASCII letter, it returns the
+	 * lower-case version of that letter; otherwise, it just returns the
+	 * character.
+	 *
+	 * @param ch The character to lower-case (if it is a US-ASCII upper-case
+	 *        character).
+	 * @return The lower-case version of the character.
+	 */
+	public static final char toLowerCase(char ch) {
+		// We can logical OR with 32 because A-Z are 65-90 in the ASCII table
+		// and none of them have the 6th bit (32) set, and a-z are 97-122 in
+		// the ASCII table, which is 32 over from A-Z.
+		// We do it this way as we'd need to do two conditions anyway (first
+		// to check that ch<255 so it can index into our table, then whether
+		// that table position has the upper-case mask).
+		if (ch>='A' && ch<='Z')
+			return (char)(ch | 0x20);
+		return ch;
+	}
+
+
+	/**
+	 * Returns an integer constant representing the OS.  This can be handy for
+	 * special case situations such as Mac OS-X (special application
+	 * registration) or Windows (allow mixed case, etc.).
+	 *
+	 * @return An integer constant representing the OS.
+	 */
+	public static final int getOS() {
+		return OS;
+	}
+
+
+	/**
+	 * Returns an integer constant representing the OS.  This can be handy for
+	 * special case situations such as Mac OS-X (special application
+	 * registration) or Windows (allow mixed case, etc.).
+	 *
+	 * @return An integer constant representing the OS.
+	 */
+	private static final int getOSImpl() {
+		int os = OS_OTHER;
+		String osName = System.getProperty("os.name");
+		if (osName!=null) { // Should always be true.
+			osName = osName.toLowerCase();
+			if (osName.indexOf("windows") > -1)
+				os = OS_WINDOWS;
+			else if (osName.indexOf("mac os x") > -1)
+				os = OS_MAC_OSX;
+			else if (osName.indexOf("linux") > -1)
+				os = OS_LINUX;
+			else
+				os = OS_OTHER;
+		}
+		return os;
+	}
+
+
+	/**
+	 * Creates a regular expression pattern that matches a "wildcard" pattern.
+	 * 
+	 * @param wildcard The wildcard pattern.
+	 * @param matchCase Whether the pattern should be case sensitive.
+	 * @param escapeStartChar Whether to escape a starting <code>'^'</code>
+	 *        character.
+	 * @return The pattern.
+	 */
+	public static Pattern wildcardToPattern(String wildcard, boolean matchCase,
+			boolean escapeStartChar) {
+
+		int flags = 0;
+		if (!matchCase) {
+			flags = Pattern.CASE_INSENSITIVE|Pattern.UNICODE_CASE;
+		}
+
+		StringBuffer sb = new StringBuffer();
+		for (int i=0; i<wildcard.length(); i++) {
+			char ch = wildcard.charAt(i);
+			switch (ch) {
+				case '*':
+					sb.append(".*");
+					break;
+				case '?':
+					sb.append('.');
+					break;
+				case '^':
+					if (i>0 || escapeStartChar) {
+						sb.append('\\');
+					}
+					sb.append('^');
+					break;
+				case '\\':
+				case '.': case '|':
+				case '+': case '-':
+				case '$':
+				case '[': case ']':
+				case '{': case '}':
+				case '(': case ')':
+					sb.append('\\').append(ch);
+					break;
+				default:
+					sb.append(ch);
+					break;
+			}
+		}
+
+		Pattern p = null;
+		try {
+			p = Pattern.compile(sb.toString(), flags);
+		} catch (PatternSyntaxException pse) {
+			pse.printStackTrace();
+			p = Pattern.compile(".+");
+		}
+
+		return p;
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RTfToText.java b/src/org/fife/ui/rsyntaxtextarea/RTfToText.java
new file mode 100644
index 0000000..7913656
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RTfToText.java
@@ -0,0 +1,227 @@
+/*
+ * 07/28/2008
+ *
+ * RtfToText.java - Returns the plain text version of RTF documents.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.io.*;
+
+
+/**
+ * Gets the plain text version of RTF documents.<p>
+ *
+ * This is used by <code>RtfTransferable</code> to return the plain text
+ * version of the transferable when the receiver does not support RTF.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class RtfToText {
+
+	private Reader r;
+	private StringBuffer sb;
+	private StringBuffer controlWord;
+	private int blockCount;
+	private boolean inControlWord;
+
+
+	/**
+	 * Private constructor.
+	 *
+	 * @param r The reader to read RTF text from.
+	 */
+	private RtfToText(Reader r) {
+		this.r = r;
+		sb = new StringBuffer();
+		controlWord = new StringBuffer();
+		blockCount = 0;
+		inControlWord = false;
+	}
+
+
+	/**
+	 * Converts the RTF text read from this converter's <code>Reader</code>
+	 * into plain text.  It is the caller's responsibility to close the
+	 * reader after this method is called.
+	 *
+	 * @return The plain text.
+	 * @throws IOException If an IO error occurs.
+	 */
+	private String convert() throws IOException {
+
+		// Skip over first curly brace as the whole file is in '{' and '}'
+		int i = r.read();
+		if (i!='{') {
+			throw new IOException("Invalid RTF file");
+		}
+
+		while ((i=r.read())!=-1) {
+
+			char ch = (char)i;
+			switch (ch) {
+				case '{':
+					if (inControlWord && controlWord.length()==0) { // "\{"
+						sb.append('{');
+						controlWord.setLength(0);
+						inControlWord = false;
+					}
+					else {
+						blockCount++;
+					}
+					break;
+				case '}':
+					if (inControlWord && controlWord.length()==0) { // "\}"
+						sb.append('}');
+						controlWord.setLength(0);
+						inControlWord = false;
+					}
+					else {
+						blockCount--;
+					}
+					break;
+				case '\\':
+					if (blockCount==0) {
+						if (inControlWord) {
+							if (controlWord.length()==0) { // "\\"
+								sb.append('\\');
+								controlWord.setLength(0);
+								inControlWord = false;
+							}
+							else {
+								endControlWord();
+								inControlWord = true;
+							}
+						}
+						else {
+							inControlWord = true;
+						}
+					}
+					break;
+				case ' ':
+					if (blockCount==0) {
+						if (inControlWord) {
+							endControlWord();
+						}
+						else {
+							sb.append(' ');
+						}
+					}
+					break;
+				case '\r':
+				case '\n':
+					if (blockCount==0) {
+						if (inControlWord) {
+							endControlWord();
+						}
+						// Otherwise, ignore
+					}
+					break;
+				default:
+					if (blockCount==0) {
+						if (inControlWord) {
+							controlWord.append(ch);
+						}
+						else {
+							sb.append(ch);
+						}
+					}
+					break;
+			}
+
+		}
+
+		return sb.toString();
+
+	}
+
+
+	/**
+	 * Ends a control word.  Checks whether it is a common one that affects
+	 * the plain text output (such as "<code>par</code>" or "<code>tab</code>")
+	 * and updates the text buffer accordingly.
+	 */
+	private void endControlWord() {
+		String word = controlWord.toString();
+		if ("par".equals(word)) {
+			sb.append('\n');
+		}
+		else if ("tab".equals(word)) {
+			sb.append('\t');
+		}
+		controlWord.setLength(0);
+		inControlWord = false;
+	}
+
+
+	/**
+	 * Converts the contents of the specified byte array representing
+	 * an RTF document into plain text.
+	 *
+	 * @param rtf The byte array representing an RTF document.
+	 * @return The contents of the RTF document, in plain text.
+	 * @throws IOException If an IO error occurs.
+	 */
+	public static String getPlainText(byte[] rtf) throws IOException {
+		return getPlainText(new ByteArrayInputStream(rtf));
+	}
+
+
+	/**
+	 * Converts the contents of the specified RTF file to plain text.
+	 *
+	 * @param file The RTF file to convert.
+	 * @return The contents of the file, in plain text.
+	 * @throws IOException If an IO error occurs.
+	 */
+	public static String getPlainText(File file) throws IOException {
+		return getPlainText(new BufferedReader(new FileReader(file)));
+	}
+
+
+	/**
+	 * Converts the contents of the specified input stream to plain text.
+	 * The input stream will be closed when this method returns.
+	 *
+	 * @param in The input stream to convert.
+	 * @return The contents of the stream, in plain text.
+	 * @throws IOException If an IO error occurs.
+	 */
+	public static String getPlainText(InputStream in) throws IOException {
+		return getPlainText(new InputStreamReader(in, "US-ASCII"));
+	}
+
+
+	/**
+	 * Converts the contents of the specified <code>Reader</code> to plain text.
+	 *
+	 * @param r The <code>Reader</code>.
+	 * @return The contents of the <code>Reader</code>, in plain text.
+	 * @throws IOException If an IO error occurs.
+	 */
+	private static String getPlainText(Reader r) throws IOException {
+		try {
+			RtfToText  converter = new RtfToText(r);
+			return converter.convert();
+		} finally {
+			r.close();
+		}
+	}
+
+
+	/**
+	 * Converts the contents of the specified String to plain text.
+	 *
+	 * @param rtf A string whose contents represent an RTF document.
+	 * @return The contents of the String, in plain text.
+	 * @throws IOException If an IO error occurs.
+	 */
+	public static String getPlainText(String rtf) throws IOException {
+		return getPlainText(new StringReader(rtf));
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RtfGenerator.java b/src/org/fife/ui/rsyntaxtextarea/RtfGenerator.java
new file mode 100644
index 0000000..1c70f38
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RtfGenerator.java
@@ -0,0 +1,484 @@
+/*
+ * 07/28/2008
+ *
+ * RtfGenerator.java - Generates RTF via a simple Java API.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Toolkit;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.fife.ui.rtextarea.RTextArea;
+
+
+/**
+ * Generates RTF text via a simple Java API.<p>
+ *
+ * The following RTF features are supported:
+ * <ul>
+ *    <li>Fonts
+ *    <li>Font sizes
+ *    <li>Foreground and background colors
+ *    <li>Bold, italic, and underline
+ * </ul>
+ *
+ * The RTF generated isn't really "optimized," but it will do, especially for
+ * small amounts of text, such as what's common when copy-and-pasting.  It
+ * tries to be sufficient for the use case of copying syntax highlighted
+ * code:
+ * <ul>
+ *    <li>It assumes that tokens changing foreground color often is fairly
+ *        common.
+ *    <li>It assumes that background highlighting is fairly uncommon.
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RtfGenerator {
+
+	private List fontList;
+	private List colorList;
+	private StringBuffer document;
+	private boolean lastWasControlWord;
+	private int lastFontIndex;
+	private int lastFGIndex;
+	private boolean lastBold;
+	private boolean lastItalic;
+	private int lastFontSize;
+
+	/**
+	 * Java2D assumes a 72 dpi screen resolution, but on Windows the screen
+	 * resolution is either 96 dpi or 120 dpi, depending on your font display
+	 * settings.  This is an attempt to make the RTF generated match the
+	 * size of what's displayed in the RSyntaxTextArea.
+	 */
+	private int screenRes;
+
+	/**
+	 * The default font size for RTF.  This is point size, in half
+	 * points.
+	 */
+	private static final int DEFAULT_FONT_SIZE = 12;//24;
+
+
+	/**
+	 * Constructor.
+	 */
+	public RtfGenerator() {
+		fontList = new ArrayList(1); // Usually only 1.
+		colorList = new ArrayList(1); // Usually only 1.
+		document = new StringBuffer();
+		reset();
+	}
+
+
+	/**
+	 * Adds a newline to the RTF document.
+	 *
+	 * @see #appendToDoc(String, Font, Color, Color)
+	 */
+	public void appendNewline() {
+		document.append("\\par");
+		document.append('\n'); // Just for ease of reading RTF.
+		lastWasControlWord = false;
+	}
+
+
+	/**
+	 * Appends styled text to the RTF document being generated.
+	 *
+	 * @param text The text to append.
+	 * @param f The font of the text.  If this is <code>null</code>, the
+	 *        default font is used.
+	 * @param fg The foreground of the text.  If this is <code>null</code>,
+	 *        the default foreground color is used.
+	 * @param bg The background color of the text.  If this is
+	 *        <code>null</code>, the default background color is used.
+	 * @see #appendNewline()
+	 */
+	public void appendToDoc(String text, Font f, Color fg, Color bg) {
+		appendToDoc(text, f, fg, bg, false);
+	}
+
+
+	/**
+	 * Appends styled text to the RTF document being generated.
+	 *
+	 * @param text The text to append.
+	 * @param f The font of the text.  If this is <code>null</code>, the
+	 *        default font is used.
+	 * @param bg The background color of the text.  If this is
+	 *        <code>null</code>, the default background color is used.
+	 * @param underline Whether the text should be underlined.
+	 * @see #appendNewline()
+	 */
+	public void appendToDocNoFG(String text, Font f, Color bg,
+							boolean underline) {
+		appendToDoc(text, f, null, bg, underline, false);
+	}
+
+
+	/**
+	 * Appends styled text to the RTF document being generated.
+	 *
+	 * @param text The text to append.
+	 * @param f The font of the text.  If this is <code>null</code>, the
+	 *        default font is used.
+	 * @param fg The foreground of the text.  If this is <code>null</code>,
+	 *        the default foreground color is used.
+	 * @param bg The background color of the text.  If this is
+	 *        <code>null</code>, the default background color is used.
+	 * @param underline Whether the text should be underlined.
+	 * @see #appendNewline()
+	 */
+	public void appendToDoc(String text, Font f, Color fg, Color bg,
+							boolean underline) {
+		appendToDoc(text, f, fg, bg, underline, true);
+	}
+
+
+	/**
+	 * Appends styled text to the RTF document being generated.
+	 *
+	 * @param text The text to append.
+	 * @param f The font of the text.  If this is <code>null</code>, the
+	 *        default font is used.
+	 * @param fg The foreground of the text.  If this is <code>null</code>,
+	 *        the default foreground color is used.
+	 * @param bg The background color of the text.  If this is
+	 *        <code>null</code>, the default background color is used.
+	 * @param underline Whether the text should be underlined.
+	 * @param setFG Whether the foreground specified by <code>fg</code> should
+	 *        be honored (if it is non-<code>null</code>).
+	 * @see #appendNewline()
+	 */
+	public void appendToDoc(String text, Font f, Color fg, Color bg,
+							boolean underline, boolean setFG) {
+
+		if (text!=null) {
+
+			// Set font to use, if different from last addition.
+			int fontIndex = f==null ? 0 : (getFontIndex(fontList, f)+1);
+			if (fontIndex!=lastFontIndex) {
+				document.append("\\f").append(fontIndex);
+				lastFontIndex = fontIndex;
+				lastWasControlWord = true;
+			}
+
+			// Set styles to use.
+			if (f!=null) {
+				int fontSize = fixFontSize(f.getSize2D()*2); // Half points!
+				if (fontSize!=lastFontSize) {
+					document.append("\\fs").append(fontSize);
+					lastFontSize = fontSize;
+					lastWasControlWord = true;
+				}
+				if (f.isBold()!=lastBold) {
+					document.append(lastBold ? "\\b0" : "\\b");
+					lastBold = !lastBold;
+					lastWasControlWord = true;
+				}
+				if (f.isItalic()!=lastItalic) {
+					document.append(lastItalic ? "\\i0" : "\\i");
+					lastItalic = !lastItalic;
+					lastWasControlWord = true;
+				}
+			}
+			else { // No font specified - assume neither bold nor italic.
+				if (lastFontSize!=DEFAULT_FONT_SIZE) {
+					document.append("\\fs").append(DEFAULT_FONT_SIZE);
+					lastFontSize = DEFAULT_FONT_SIZE;
+					lastWasControlWord = true;
+				}
+				if (lastBold) {
+					document.append("\\b0");
+					lastBold = false;
+					lastWasControlWord = true;
+				}
+				if (lastItalic) {
+					document.append("\\i0");
+					lastItalic = false;
+					lastWasControlWord = true;
+				}
+			}
+			if (underline) {
+				document.append("\\ul");
+				lastWasControlWord = true;
+			}
+
+			// Set the foreground color.
+			if (setFG) {
+				int fgIndex = 0;
+				if (fg!=null) { // null => fg color index 0
+					fgIndex = getIndex(colorList, fg)+1;
+				}
+				if (fgIndex!=lastFGIndex) {
+					document.append("\\cf").append(fgIndex);
+					lastFGIndex = fgIndex;
+					lastWasControlWord = true;
+				}
+			}
+
+			// Set the background color.
+			if (bg!=null) {
+				int pos = getIndex(colorList, bg);
+				document.append("\\highlight").append(pos+1);
+				lastWasControlWord = true;
+			}
+
+			if (lastWasControlWord) {
+				document.append(' '); // Delimiter
+				lastWasControlWord = false;
+			}
+			escapeAndAdd(document, text);
+
+			// Reset everything that was set for this text fragment.
+			if (bg!=null) {
+				document.append("\\highlight0");
+				lastWasControlWord = true;
+			}
+			if (underline) {
+				document.append("\\ul0");
+				lastWasControlWord = true;
+			}
+
+		}
+
+	}
+
+
+	/**
+	 * Appends some text to a buffer, with special care taken for special
+	 * characters as defined by the RTF spec:
+	 *
+	 * <ul>
+	 *   <li>All tab characters are replaced with the string
+	 *       "<code>\tab</code>"
+	 *   <li>'\', '{' and '}' are changed to "\\", "\{" and "\}"
+	 * </ul>
+	 *
+	 * @param text The text to append (with tab chars substituted).
+	 * @param sb The buffer to append to.
+	 */
+	private final void escapeAndAdd(StringBuffer sb, String text) {
+		// TODO: On the move to 1.5 use StringBuffer append() overloads that
+		// can take a CharSequence and a range of that CharSequence to speed
+		// things up.
+		//int last = 0;
+		int count = text.length();
+		for (int i=0; i<count; i++) {
+			char ch = text.charAt(i);
+			switch (ch) {
+				case '\t':
+					// Micro-optimization: for syntax highlighting with
+					// tab indentation, there are often multiple tabs
+					// back-to-back at the start of lines, so don't put
+					// spaces between each "\tab".
+					sb.append("\\tab");
+					while ((++i<count) && text.charAt(i)=='\t') {
+						sb.append("\\tab");
+					}
+					sb.append(' ');
+					i--; // We read one too far.
+					break;
+				case '\\':
+				case '{':
+				case '}':
+					sb.append('\\').append(ch);
+					break;
+				default:
+					sb.append(ch);
+					break;
+			}
+		}
+	}
+
+
+	/**
+	 * Returns a font point size, adjusted for the current screen resolution.<p>
+	 * 
+	 * Java2D assumes 72 dpi.  On systems with larger dpi (Windows, GTK, etc.),
+	 * font rendering will appear too small if we simply return a Java "Font"
+	 * object's getSize() value.  We need to adjust it for the screen
+	 * resolution.
+	 *
+	 * @param pointSize A Java Font's point size, as returned from
+	 *        <code>getSize2D()</code>.
+	 * @return The font point size, adjusted for the current screen resolution.
+	 *         This will allow other applications to render fonts the same
+	 *         size as they appear in the Java application.
+	 */
+	private int fixFontSize(float pointSize) {
+		if (screenRes!=72) { // Java2D assumes 72 dpi
+			pointSize = Math.round(pointSize*72f/screenRes);
+		}
+		return (int)pointSize;
+	}
+
+
+	private String getColorTableRtf() {
+
+		// Example:
+		// "{\\colortbl ;\\red255\\green0\\blue0;\\red0\\green0\\blue255; }"
+
+		StringBuffer sb = new StringBuffer();
+
+		sb.append("{\\colortbl ;");
+		for (int i=0; i<colorList.size(); i++) {
+			Color c = (Color)colorList.get(i);
+			sb.append("\\red").append(c.getRed());
+			sb.append("\\green").append(c.getGreen());
+			sb.append("\\blue").append(c.getBlue());
+			sb.append(';');
+		}
+		sb.append("}");
+
+		return sb.toString();
+
+	}
+
+
+	/**
+	 * Returns the index of the specified font in a list of fonts.  This
+	 * method only checks for a font by its family name; its attributes such
+	 * as bold and italic are ignored.<p>
+	 *
+	 * If the font is not in the list, it is added, and its new index is
+	 * returned.
+	 *
+	 * @param list The list (possibly) containing the font.
+	 * @param font The font to get the index of.
+	 * @return The index of the font.
+	 */
+	private static int getFontIndex(List list, Font font) {
+		String fontName = font.getFamily();
+		for (int i=0; i<list.size(); i++) {
+			Font font2 = (Font)list.get(i);
+			if (font2.getFamily().equals(fontName)) {
+				return i;
+			}
+		}
+		list.add(font);
+		return list.size()-1;
+	}
+
+
+	private String getFontTableRtf() {
+
+		// Example:
+		// "{\\fonttbl{\\f0\\fmodern\\fcharset0 Courier;}}"
+
+		StringBuffer sb = new StringBuffer();
+
+		// Workaround for text areas using the Java logical font "Monospaced"
+		// by default.  There's no way to know what it's mapped to, so we
+		// just search for a monospaced font on the system.
+		String monoFamilyName = getMonospacedFontFamily();
+
+		sb.append("{\\fonttbl{\\f0\\fnil\\fcharset0 " + monoFamilyName + ";}");
+		for (int i=0; i<fontList.size(); i++) {
+			Font f = (Font)fontList.get(i);
+			String familyName = f.getFamily();
+			if (familyName.equals("Monospaced")) {
+				familyName = monoFamilyName;
+			}
+			sb.append("{\\f").append(i+1).append("\\fnil\\fcharset0 ");
+			sb.append(familyName).append(";}");
+		}
+		sb.append('}');
+
+		return sb.toString();
+
+	}
+
+
+	/**
+	 * Returns the index of the specified item in a list.  If the item
+	 * is not in the list, it is added, and its new index is returned.
+	 *
+	 * @param list The list (possibly) containing the item.
+	 * @param item The item to get the index of.
+	 * @return The index of the item.
+	 */
+	private static int getIndex(List list, Object item) {
+		int pos = list.indexOf(item);
+		if (pos==-1) {
+			list.add(item);
+			pos = list.size()-1;
+		}
+		return pos;
+	}
+
+
+	/**
+	 * Returns a good "default" monospaced font to use when Java's logical
+	 * font "Monospaced" is found.
+	 *
+	 * @return The monospaced font family to use.
+	 */
+	private static final String getMonospacedFontFamily() {
+		String family = RTextArea.getDefaultFont().getFamily();
+		if ("Monospaced".equals(family)) {
+			family = "Courier";
+		}
+		return family;
+	}
+
+
+	/**
+	 * Returns the RTF document created by this generator.
+	 *
+	 * @return The RTF document, as a <code>String</code>.
+	 */
+	public String getRtf() {
+
+		StringBuffer sb = new StringBuffer();
+		sb.append("{");
+
+		// Header
+		sb.append("\\rtf1\\ansi\\ansicpg1252");
+		sb.append("\\deff0"); // First font in font table is the default
+		sb.append("\\deflang1033");
+		sb.append("\\viewkind4");		// "Normal" view
+		sb.append("\\uc\\pard\\f0");
+		sb.append("\\fs20");			// Font size in half-points (default 24)
+		sb.append(getFontTableRtf()).append('\n');
+		sb.append(getColorTableRtf()).append('\n');
+
+		// Content
+		sb.append(document);
+
+		sb.append("}");
+
+		//System.err.println("*** " + sb.length());
+		return sb.toString();
+
+	}
+
+
+	/**
+	 * Resets this generator.  All document information and content is
+	 * cleared.
+	 */
+	public void reset() {
+		fontList.clear();
+		colorList.clear();
+		document.setLength(0);
+		lastWasControlWord = false;
+		lastFontIndex = 0;
+		lastFGIndex = 0;
+		lastBold = false;
+		lastItalic = false;
+		lastFontSize = DEFAULT_FONT_SIZE;
+		screenRes = Toolkit.getDefaultToolkit().getScreenResolution();
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RtfTransferable.java b/src/org/fife/ui/rsyntaxtextarea/RtfTransferable.java
new file mode 100644
index 0000000..4d30bb5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RtfTransferable.java
@@ -0,0 +1,91 @@
+/*
+ * 07/28/2008
+ *
+ * RtfTransferable.java - Used during drag-and-drop to represent RTF text.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.datatransfer.*;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.StringReader;
+
+
+/**
+ * Object used during copy/paste and DnD operations to represent RTF text.
+ * It can return the text being moved as either RTF or plain text.  This
+ * class is basically the same as
+ * <code>java.awt.datatransfer.StringSelection</code>, except that it can also
+ * return the text as RTF.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class RtfTransferable implements Transferable {
+
+	/**
+	 * The RTF data, in bytes (the RTF is 7-bit ascii).
+	 */
+	private byte[] data;
+
+
+	/**
+	 * The "flavors" the text can be returned as.
+	 */
+	private final DataFlavor[] FLAVORS = {
+		new DataFlavor("text/rtf", "RTF"),
+		DataFlavor.stringFlavor,
+		DataFlavor.plainTextFlavor // deprecated
+	};
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param data The RTF data.
+	 */
+	public RtfTransferable(byte[] data) {
+		this.data = data;
+	}
+
+
+	public Object getTransferData(DataFlavor flavor)
+					throws UnsupportedFlavorException, IOException {
+		if (flavor.equals(FLAVORS[0])) { // RTF
+			return new ByteArrayInputStream(data==null ? new byte[0] : data);
+		}
+		else if (flavor.equals(FLAVORS[1])) { // stringFlavor
+			return data==null ? "" : RtfToText.getPlainText(data);
+		}
+		else if (flavor.equals(FLAVORS[2])) { // plainTextFlavor (deprecated)
+			String text = ""; // Valid if data==null
+			if (data!=null) {
+				text = RtfToText.getPlainText(data);
+			}
+			return new StringReader(text);
+		}
+		else {
+			throw new UnsupportedFlavorException(flavor);
+		}
+	}
+
+
+	public DataFlavor[] getTransferDataFlavors() {
+		return (DataFlavor[])FLAVORS.clone();
+	}
+
+
+	public boolean isDataFlavorSupported(DataFlavor flavor) {
+		for (int i=0; i<FLAVORS.length; i++) {
+			if (flavor.equals(FLAVORS[i])) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/SelectRegionLinkGeneratorResult.java b/src/org/fife/ui/rsyntaxtextarea/SelectRegionLinkGeneratorResult.java
new file mode 100644
index 0000000..f587d40
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/SelectRegionLinkGeneratorResult.java
@@ -0,0 +1,59 @@
+/*
+ * 02/16/2012
+ *
+ * Copyright (C) 2013 Robert Futrell
+ * robert_futrell at users.sourceforge.net
+ * http://fifesoft.com/rsyntaxtextarea
+ *
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.event.HyperlinkEvent;
+
+
+/**
+ * A link generator result that selects a region of text in the text area.
+ * This will typically be used by IDE-style applications, to provide support
+ * for "linking" the use of a variable in a document to its declaration.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see LinkGenerator
+ */
+public class SelectRegionLinkGeneratorResult implements LinkGeneratorResult {
+
+	private RSyntaxTextArea textArea;
+	private int sourceOffset;
+	private int selStart;
+	private int selEnd;
+
+
+	public SelectRegionLinkGeneratorResult(RSyntaxTextArea textArea,
+			int sourceOffset, int selStart, int selEnd) {
+		this.textArea = textArea;
+		this.sourceOffset = sourceOffset;
+		this.selStart = selStart;
+		this.selEnd = selEnd;
+	}
+
+
+	/**
+	 * Selects the text in the text area.
+	 */
+	public HyperlinkEvent execute() {
+		textArea.select(selStart, selEnd);
+		return null;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int getSourceOffset() {
+		return sourceOffset;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/SquiggleUnderlineHighlightPainter.java b/src/org/fife/ui/rsyntaxtextarea/SquiggleUnderlineHighlightPainter.java
new file mode 100644
index 0000000..0fb88a5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/SquiggleUnderlineHighlightPainter.java
@@ -0,0 +1,117 @@
+/*
+ * 09/13/2005
+ *
+ * SquiggleUnderlineHighlightPainter.java - Highlighter that draws a squiggle
+ * underline under "highlighted" text, similar to error markers in Microsoft
+ * Visual Studio or Eclipse.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+
+/**
+ * Highlight painter that paints a squiggly underline underneath text, similar
+ * to what popular IDE's such as Visual Studio and Eclipse do to indicate
+ * errors, warnings, etc.<p>
+ *
+ * This class must be used as a <code>LayerPainter</code>.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class SquiggleUnderlineHighlightPainter
+				extends ChangeableColorHighlightPainter {
+
+	private static final int AMT			= 2;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param color The color of the squiggle.  This cannot be
+	 *        <code>null</code>.
+	 */
+	public SquiggleUnderlineHighlightPainter(Color color) {
+		super(color);
+		setColor(color);
+	}
+
+
+	/**
+	 * Paints a portion of a highlight.
+	 *
+	 * @param g the graphics context
+	 * @param offs0 the starting model offset >= 0
+	 * @param offs1 the ending model offset >= offs1
+	 * @param bounds the bounding box of the view, which is not
+	 *        necessarily the region to paint.
+	 * @param c the editor
+	 * @param view View painting for
+	 * @return region drawing occurred in
+	 */
+	public Shape paintLayer(Graphics g, int offs0, int offs1,
+						Shape bounds, JTextComponent c, View view) {
+
+		g.setColor(getColor());
+
+		if (offs0 == view.getStartOffset() && offs1 == view.getEndOffset()) {
+			// Contained in view, can just use bounds.
+			Rectangle alloc;
+			if (bounds instanceof Rectangle)
+				alloc = (Rectangle)bounds;
+			else
+				alloc = bounds.getBounds();
+			paintSquiggle(g, alloc);
+			return alloc;
+		}
+
+		// Otherwise, should only render part of View.
+		try {
+			// --- determine locations ---
+			Shape shape = view.modelToView(offs0, Position.Bias.Forward,
+                                               offs1,Position.Bias.Backward,
+                                               bounds);
+			Rectangle r = (shape instanceof Rectangle) ?
+						(Rectangle)shape : shape.getBounds();
+			paintSquiggle(g, r);
+			return r;
+		} catch (BadLocationException e) {
+			e.printStackTrace(); // can't render
+		}
+
+		// Only if exception
+		return null;
+
+	}
+
+
+	/**
+	 * Paints a squiggle underneath text in the specified rectangle.
+	 *
+	 * @param g The graphics context with which to paint.
+	 * @param r The rectangle containing the text.
+	 */
+	protected void paintSquiggle(Graphics g, Rectangle r) {
+		int x = r.x;
+		int y = r.y + r.height - 1;
+		int delta = -AMT;
+		while (x<r.x+r.width) {
+			g.drawLine(x,y, x+AMT,y+delta);
+			y += delta;
+			delta = -delta;
+			x += AMT;
+		}
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/Style.java b/src/org/fife/ui/rsyntaxtextarea/Style.java
new file mode 100644
index 0000000..cf86c46
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/Style.java
@@ -0,0 +1,192 @@
+/*
+ * 08/06/2004
+ *
+ * Style.java - A set of traits for a particular token type to use while
+ * painting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import javax.swing.JPanel;
+
+
+/**
+ * The color and style information for a token type.  Each token type in an
+ * <code>RSyntaxTextArea</code> has a corresponding <code>Style</code>; this
+ * <code>Style</code> tells us the following things:
+ *
+ * <ul>
+ *   <li>What foreground color to use for tokens of this type.</li>
+ *   <li>What background color to use.</li>
+ *   <li>The font to use.</li>
+ *   <li>Whether the token should be underlined.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ */
+public class Style implements Cloneable {
+
+	public static final Color DEFAULT_FOREGROUND	= Color.BLACK;
+	public static final Color DEFAULT_BACKGROUND	= null;
+	public static final Font DEFAULT_FONT			= null;
+
+	public Color foreground;
+	public Color background;
+	public boolean underline;
+	public Font font;
+
+	FontMetrics fontMetrics;
+
+
+	/**
+	 * Creates a new style defaulting to black foreground, no
+	 * background, and no styling.
+	 */
+	public Style() {
+		this(DEFAULT_FOREGROUND);
+	}
+
+
+	/**
+	 * Creates a new style with the specified foreground and no styling.
+	 *
+	 * @param fg The foreground color to use.
+	 */
+	public Style(Color fg) {
+		this(fg, DEFAULT_BACKGROUND);
+	}
+
+
+	/**
+	 * Creates a new style with the specified colors and no styling.
+	 *
+	 * @param fg The foreground color to use.
+	 * @param bg The background color to use.
+	 */
+	public Style(Color fg, Color bg) {
+		this(fg, bg, DEFAULT_FONT);
+	}
+
+
+	/**
+	 * Creates a new style.
+	 *
+	 * @param fg The foreground color to use.
+	 * @param bg The background color to use.
+	 * @param font The font for this syntax scheme.
+	 */
+	public Style(Color fg, Color bg, Font font) {
+		this(fg, bg, font, false);
+	}
+
+
+	/**
+	 * Creates a new style.
+	 *
+	 * @param fg The foreground color to use.
+	 * @param bg The background color to use.
+	 * @param font The font for this syntax scheme.
+	 * @param underline Whether or not to underline tokens with this style.
+	 */
+	public Style(Color fg, Color bg, Font font, boolean underline) {
+		foreground = fg;
+		background = bg;
+		this.font = font;
+		this.underline = underline;
+		this.fontMetrics = font==null ? null :
+			new JPanel().getFontMetrics(font); // Default, no rendering hints!
+	}
+
+
+	/**
+	 * Returns whether or not two (possibly <code>null</code>) objects are
+	 * equal.
+	 */
+	private boolean areEqual(Object o1, Object o2) {
+		return (o1==null && o2==null) || (o1!=null && o1.equals(o2));
+	}
+
+
+	/**
+	 * Returns a deep copy of this object.
+	 *
+	 * @return The copy.
+	 */
+	public Object clone() {
+		Style clone = null;
+		try {
+			clone = (Style)super.clone();
+		} catch (CloneNotSupportedException cnse) { // Never happens
+			cnse.printStackTrace();
+			return null;
+		}
+		clone.foreground = foreground;
+		clone.background = background;
+		clone.font = font;
+		clone.underline = underline;
+		clone.fontMetrics = fontMetrics;
+		return clone;
+	}
+
+
+	/**
+	 * Returns whether or not two syntax schemes are equal.
+	 *
+	 * @param o2 The object with which to compare this syntax scheme.
+	 * @return Whether or not these two syntax schemes represent the same
+	 *         scheme.
+	 */
+	public boolean equals(Object o2) {
+		if (o2 instanceof Style) {
+			Style ss2 = (Style)o2;
+			if (this.underline==ss2.underline &&
+				areEqual(foreground, ss2.foreground) &&
+				areEqual(background, ss2.background) &&
+				areEqual(font, ss2.font) &&
+				areEqual(fontMetrics, ss2.fontMetrics))
+					return true;
+		}
+		return false;
+	}
+
+
+	/**
+	 * Computes the hash code to use when adding this syntax scheme to
+	 * hash tables.<p>
+	 *
+	 * This method is implemented, since {@link #equals(Object)} is implemented,
+	 * to keep FindBugs happy.
+	 *
+	 * @return The hash code.
+	 */
+	public int hashCode() {
+		int hashCode = underline ? 1 : 0;
+		if (foreground!=null) {
+			hashCode ^= foreground.hashCode();
+		}
+		if (background!=null) {
+			hashCode ^= background.hashCode();
+		} 
+		return hashCode;
+	}
+
+
+	/**
+	 * Returns a string representation of this style.
+	 *
+	 * @return A string representation of this style.
+	 */
+	public String toString() {
+		return "[Style: foreground: " + foreground +
+			  ", background: " + background + ", underline: " +
+			  underline + ", font: " + font + "]";
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/SyntaxConstants.java b/src/org/fife/ui/rsyntaxtextarea/SyntaxConstants.java
new file mode 100644
index 0000000..f04768d
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/SyntaxConstants.java
@@ -0,0 +1,253 @@
+/*
+ * 03/08/2004
+ *
+ * SyntaxConstants.java - Constants used by RSyntaxTextArea and friends.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * Constants that define the different programming languages understood by
+ * <code>RSyntaxTextArea</code>.  These constants are the values you can pass
+ * to {@link RSyntaxTextArea#setSyntaxEditingStyle(String)} to get syntax
+ * highlighting.<p>
+ *
+ * By default, all <code>RSyntaxTextArea</code>s can render all of these
+ * languages, but this can be changed (the list can be augmented or completely
+ * overwritten) on a per-text area basis.  What languages can be rendered is
+ * actually managed by the {@link TokenMakerFactory} installed on the text
+ * area's {@link RSyntaxDocument}.  By default, all
+ * <code>RSyntaxDocumenet</code>s have a factory installed capable of handling
+ * all of these languages.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface SyntaxConstants {
+
+	/**
+	 * Style meaning don't syntax highlight anything.
+	 */
+	public static final String SYNTAX_STYLE_NONE			= "text/plain";
+
+
+	/**
+	 * Style for highlighting ActionScript.
+	 */
+	public static final String SYNTAX_STYLE_ACTIONSCRIPT	= "text/actionscript";
+
+
+	/**
+	 * Style for highlighting x86 assembler.
+	 */
+	public static final String SYNTAX_STYLE_ASSEMBLER_X86	= "text/asm";
+
+
+	/**
+	 * Style for highlighting BBCode.
+	 */
+	public static final String SYNTAX_STYLE_BBCODE			= "text/bbcode";
+
+
+	/**
+	 * Style for highlighting C.
+	 */
+	public static final String SYNTAX_STYLE_C				= "text/c";
+
+
+	/**
+	 * Style for highlighting Clojure.
+	 */
+	public static final String SYNTAX_STYLE_CLOJURE			= "text/clojure";
+
+
+	/**
+	 * Style for highlighting C++.
+	 */
+	public static final String SYNTAX_STYLE_CPLUSPLUS		= "text/cpp";
+
+
+	/**
+	 * Style for highlighting C#.
+	 */
+	public static final String SYNTAX_STYLE_CSHARP			= "text/cs";
+
+
+	/**
+	 * Style for highlighting CSS.
+	 */
+	public static final String SYNTAX_STYLE_CSS			= "text/css";
+
+
+	/**
+	 * Style for highlighting Delphi/Pascal.
+	 */
+	public static final String SYNTAX_STYLE_DELPHI			= "text/delphi";
+
+
+	/**
+	 * Style for highlighting DTD files.
+	 */
+	public static final String SYNTAX_STYLE_DTD			= "text/dtd";
+
+
+	/**
+	 * Style for highlighting Fortran.
+	 */
+	public static final String SYNTAX_STYLE_FORTRAN			= "text/fortran";
+
+
+	/**
+	 * Style for highlighting Groovy.
+	 */
+	public static final String SYNTAX_STYLE_GROOVY			= "text/groovy";
+
+
+	/**
+	 * Style for highlighting HTML.
+	 */
+	public static final String SYNTAX_STYLE_HTML			= "text/html";
+
+
+	/**
+	 * Style for highlighting Java.
+	 */
+	public static final String SYNTAX_STYLE_JAVA			= "text/java";
+
+
+	/**
+	 * Style for highlighting JavaScript.
+	 */
+	public static final String SYNTAX_STYLE_JAVASCRIPT		= "text/javascript";
+
+
+	/**
+	 * Style for highlighting JSON.
+	 */
+	public static final String SYNTAX_STYLE_JSON		= "text/json";
+
+
+	/**
+	 * Style for highlighting JSP.
+	 */
+	public static final String SYNTAX_STYLE_JSP			= "text/jsp";
+
+
+	/**
+	 * Style for highlighting LaTeX.
+	 */
+	public static final String SYNTAX_STYLE_LATEX		= "text/latex";
+
+
+	/**
+	 * Style for highlighting Lisp.
+	 */
+	public static final String SYNTAX_STYLE_LISP		= "text/lisp";
+
+
+	/**
+	 * Style for highlighting Lua.
+	 */
+	public static final String SYNTAX_STYLE_LUA			= "text/lua";
+
+
+	/**
+	 * Style for highlighting makefiles.
+	 */
+	public static final String SYNTAX_STYLE_MAKEFILE		= "text/makefile";
+
+
+	/**
+	 * Style for highlighting MXML.
+	 */
+	public static final String SYNTAX_STYLE_MXML			= "text/mxml";
+
+
+	/**
+	 * Style for highlighting NSIS install scripts.
+	 */
+	public static final String SYNTAX_STYLE_NSIS			= "text/nsis";
+
+
+	/**
+	 * Style for highlighting Perl.
+	 */
+	public static final String SYNTAX_STYLE_PERL			= "text/perl";
+
+
+	/**
+	 * Style for highlighting PHP.
+	 */
+	public static final String SYNTAX_STYLE_PHP				= "text/php";
+
+
+	/**
+	 * Style for highlighting properties files.
+	 */
+	public static final String SYNTAX_STYLE_PROPERTIES_FILE	= "text/properties";
+
+
+	/**
+	 * Style for highlighting Python.
+	 */
+	public static final String SYNTAX_STYLE_PYTHON			= "text/python";
+
+
+	/**
+	 * Style for highlighting Ruby.
+	 */
+	public static final String SYNTAX_STYLE_RUBY			= "text/ruby";
+
+
+	/**
+	 * Style for highlighting SAS keywords.
+	 */
+	public static final String SYNTAX_STYLE_SAS			= "text/sas";
+
+
+	/**
+	 * Style for highlighting Scala.
+	 */
+	public static final String SYNTAX_STYLE_SCALA		= "text/scala";
+
+
+	/**
+	 * Style for highlighting SQL.
+	 */
+	public static final String SYNTAX_STYLE_SQL			= "text/sql";
+
+
+	/**
+	 * Style for highlighting Tcl.
+	 */
+	public static final String SYNTAX_STYLE_TCL			= "text/tcl";
+
+
+	/**
+	 * Style for highlighting UNIX shell keywords.
+	 */
+	public static final String SYNTAX_STYLE_UNIX_SHELL		= "text/unix";
+
+
+	/**
+	 * Style for highlighting Visual Basic.
+	 */
+	public static final String SYNTAX_STYLE_VISUAL_BASIC	= "text/vb";
+
+
+	/**
+	 * Style for highlighting Windows batch files.
+	 */
+	public static final String SYNTAX_STYLE_WINDOWS_BATCH	= "text/bat";
+
+
+	/**
+	 * Style for highlighting XML.
+	 */
+	public static final String SYNTAX_STYLE_XML			= "text/xml";
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/SyntaxScheme.java b/src/org/fife/ui/rsyntaxtextarea/SyntaxScheme.java
new file mode 100644
index 0000000..47d5cb9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/SyntaxScheme.java
@@ -0,0 +1,675 @@
+/*
+ * 02/26/2004
+ *
+ * SyntaxScheme.java - The set of colors and tokens used by an RSyntaxTextArea
+ * to color tokens.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import javax.swing.text.StyleContext;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+
+/**
+ * The set of colors and styles used by an <code>RSyntaxTextArea</code> to
+ * color tokens.  You can use this class to programmatically set the fonts
+ * and colors used in an RSyntaxTextArea, but for more powerful, externalized
+ * control, consider using {@link Theme}s instead.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see Theme
+ */
+public class SyntaxScheme implements Cloneable, TokenTypes {
+
+	private Style[] styles;
+
+	private static final String VERSION			= "*ver1";
+
+
+	/**
+	 * Creates a color scheme that either has all color values set to
+	 * a default value or set to <code>null</code>.
+	 *
+	 * @param useDefaults If <code>true</code>, all color values will
+	 *        be set to default colors; if <code>false</code>, all colors
+	 *        will be initially <code>null</code>.
+	 */
+	public SyntaxScheme(boolean useDefaults) {
+		styles = new Style[NUM_TOKEN_TYPES];
+		if (useDefaults) {
+			restoreDefaults(null);
+		}
+	}
+
+
+	/**
+	 * Creates a default color scheme.
+	 *
+	 * @param baseFont The base font to use.  Keywords will be a bold version
+	 *        of this font, and comments will be an italicized version of this
+	 *        font.
+	 */
+	public SyntaxScheme(Font baseFont) {
+		this(baseFont, true);
+	}
+
+
+	/**
+	 * Creates a default color scheme.
+	 *
+	 * @param baseFont The base font to use.  Keywords will be a bold version
+	 *        of this font, and comments will be an italicized version of this
+	 *        font.
+	 * @param fontStyles Whether bold and italic should be used in the scheme
+	 *        (vs. all tokens using a plain font).
+	 */
+	public SyntaxScheme(Font baseFont, boolean fontStyles) {
+		styles = new Style[NUM_TOKEN_TYPES];
+		restoreDefaults(baseFont, fontStyles);
+	}
+
+
+	/**
+	 * Changes the "base font" for this syntax scheme.  This is called by
+	 * <code>RSyntaxTextArea</code> when its font changes via
+	 * <code>setFont()</code>.  This looks for tokens that use a derivative of
+	 * the text area's old font (but bolded and/or italicized) and make them
+	 * use the new font with those stylings instead.  This is desirable because
+	 * most programmers prefer a single font to be used in their text editor,
+	 * but might want bold (say for keywords) or italics.
+	 *
+	 * @param old The old font of the text area.
+	 * @param font The new font of the text area.
+	 */
+	void changeBaseFont(Font old, Font font) {
+		for (int i=0; i<styles.length; i++) {
+			Style style = styles[i];
+			if (style!=null && style.font!=null) {
+				if (style.font.getFamily().equals(old.getFamily()) &&
+						style.font.getSize()==old.getSize()) {
+					int s = style.font.getStyle(); // Keep bold or italic
+					StyleContext sc = StyleContext.getDefaultStyleContext();
+					style.font= sc.getFont(font.getFamily(), s, font.getSize());
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * Returns a deep copy of this color scheme.
+	 *
+	 * @return The copy.
+	 */
+	public Object clone() {
+		SyntaxScheme shcs = null;
+		try {
+			shcs = (SyntaxScheme)super.clone();
+		} catch (CloneNotSupportedException cnse) { // Never happens
+			cnse.printStackTrace();
+			return null;
+		}
+		shcs.styles = new Style[NUM_TOKEN_TYPES];
+		for (int i=0; i<NUM_TOKEN_TYPES; i++) {
+			Style s = styles[i];
+			if (s!=null) {
+				shcs.styles[i] = (Style)s.clone();
+			}
+		}
+		return shcs;
+	}
+
+
+	/**
+	 * Tests whether this color scheme is the same as another color scheme.
+	 *
+	 * @param otherScheme The color scheme to compare to.
+	 * @return <code>true</code> if this color scheme and
+	 *         <code>otherScheme</code> are the same scheme;
+	 *         <code>false</code> otherwise.
+	 */
+	public boolean equals(Object otherScheme) {
+
+		// No need for null check; instanceof takes care of this for us,
+		// i.e. "if (!(null instanceof Foo))" evaluates to "true".
+		if (!(otherScheme instanceof SyntaxScheme)) {
+			return false;
+		}
+
+		Style[] otherSchemes = ((SyntaxScheme)otherScheme).styles;
+
+		int length = styles.length;
+		for (int i=0; i<length; i++) {
+			if (styles[i]==null) {
+				if (otherSchemes[i]!=null) {
+					return false;
+				}
+			}
+			else if (!styles[i].equals(otherSchemes[i])) {
+				return false;
+			}
+		}
+		return true;
+
+	}
+
+
+	/**
+	 * Returns a hex string representing an RGB color, of the form
+	 * <code>"$rrggbb"</code>.
+	 *
+	 * @param c The color.
+	 * @return The string representation of the color.
+	 */
+	private static final String getHexString(Color c) {
+		return "$" + Integer.toHexString((c.getRGB() & 0xffffff)+0x1000000).
+									substring(1);
+	}
+
+
+	/**
+	 * Returns the specified style.
+	 *
+	 * @param index The index of the style.
+	 * @return The style.
+	 * @see #setStyle(int, Style)
+	 * @see #getStyleCount()
+	 */
+	public Style getStyle(int index) {
+		return styles[index];
+	}
+
+
+	/**
+	 * Returns the number of styles.
+	 *
+	 * @return The number of styles.
+	 * @see #getStyle(int)
+	 */
+	public int getStyleCount() {
+		return styles.length;
+	}
+
+
+	/**
+	 * This is implemented to be consistent with {@link #equals(Object)}.
+	 * This is a requirement to keep FindBugs happy.
+	 *
+	 * @return The hash code for this object.
+	 */
+	public int hashCode() {
+		// Keep me fast.  Iterating over *all* syntax schemes contained is
+		// probably much slower than a "bad" hash code here.
+		int hashCode = 0;
+		int count = styles.length;
+		for (int i=0; i<count; i++) {
+			if (styles[i]!=null) {
+				hashCode ^= styles[i].hashCode();
+				break;
+			}
+		}
+		return hashCode;
+	}
+
+
+	/**
+	 * Loads a syntax scheme from an input stream.<p>
+	 * 
+	 * Consider using the {@link Theme} class for saving and loading RSTA
+	 * styles rather than using this API.
+	 *
+	 * @param baseFont The font to use as the "base" for the syntax scheme.
+	 *        If this is <code>null</code>, a default monospaced font is used.
+	 * @param in The stream to load from.  It is up to the caller to close this
+	 *        stream when they are done.
+	 * @return The syntax scheme.
+	 * @throws IOException If an IO error occurs.
+	 */
+	public static SyntaxScheme load(Font baseFont, InputStream in)
+									throws IOException {
+		if (baseFont==null) {
+			baseFont = RSyntaxTextArea.getDefaultFont();
+		}
+		return XmlParser.load(baseFont, in);
+	}
+
+
+	/**
+	 * Loads a syntax highlighting color scheme from a string created from
+	 * <code>toCommaSeparatedString</code>.  This method is useful for saving
+	 * and restoring color schemes.<p>
+	 * 
+	 * Consider using the {@link Theme} class for saving and loading RSTA
+	 * styles rather than using this API.
+	 *
+	 * @param string A string generated from {@link #toCommaSeparatedString()}.
+	 * @return A color scheme.
+	 */
+	public static SyntaxScheme loadFromString(String string) {
+
+		SyntaxScheme scheme = new SyntaxScheme(true);
+
+		try {
+
+			if (string!=null) {
+
+				String[] tokens = string.split(",", -1);
+
+				// Check the version string, use defaults if incompatible
+				if (tokens.length==0 || !VERSION.equals(tokens[0])) {
+					return scheme; // Still set to defaults
+				}
+
+				int tokenTypeCount = NUM_TOKEN_TYPES;
+				int tokenCount = tokenTypeCount*7 + 1; // Version string
+				if (tokens.length!=tokenCount) {
+					throw new Exception(
+						"Not enough tokens in packed color scheme: expected " +
+						tokenCount + ", found " + tokens.length);
+				}
+
+				// Use StyleContext to create fonts to get composite fonts for
+				// Asian glyphs.
+				StyleContext sc = StyleContext.getDefaultStyleContext();
+
+				// Loop through each token style.  Format:
+				// "index,(fg|-),(bg|-),(t|f),((font,style,size)|(-,,))"
+				for (int i=0; i<tokenTypeCount; i++) {
+
+					int pos = i*7 + 1;
+					int integer = Integer.parseInt(tokens[pos]); // == i
+					if (integer!=i)
+						throw new Exception("Expected " + i + ", found " +
+											integer);
+
+					Color fg = null; String temp = tokens[pos+1];
+					if (!"-".equals(temp)) { // "-" => keep fg as null
+						fg = stringToColor(temp);
+					}
+					Color bg = null; temp = tokens[pos+2];
+					if (!"-".equals(temp)) { // "-" => keep bg as null
+						bg = stringToColor(temp);
+					}
+
+					// Check for "true" or "false" since we don't want to
+					// accidentally suck in an int representing the next
+					// packed color, and any string != "true" means false.
+					temp = tokens[pos+3];
+					if (!"t".equals(temp) && !"f".equals(temp))
+						throw new Exception("Expected 't' or 'f', found " + temp);
+					boolean underline = "t".equals(temp);
+
+					Font font = null;
+					String family = tokens[pos+4];
+					if (!"-".equals(family)) {
+						font = sc.getFont(family,
+							Integer.parseInt(tokens[pos+5]),	// style
+							Integer.parseInt(tokens[pos+6]));	// size
+					}
+					scheme.styles[i] = new Style(fg, bg, font, underline);
+
+				}
+
+			}
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return scheme;
+
+	}
+
+
+	void refreshFontMetrics(Graphics2D g2d) {
+		// It is assumed that any rendering hints are already applied to g2d.
+		for (int i=0; i<styles.length; i++) {
+			Style s = styles[i];
+			if (s!=null) {
+				s.fontMetrics = s.font==null ? null :
+								g2d.getFontMetrics(s.font);
+			}
+		}
+	}
+
+
+	/**
+	 * Restores all colors and fonts to their default values.
+	 *
+	 * @param baseFont The base font to use when creating this scheme.  If
+	 *        this is <code>null</code>, then a default monospaced font is
+	 *        used.
+	 */
+	public void restoreDefaults(Font baseFont) {
+		restoreDefaults(baseFont, true);
+	}
+
+
+	/**
+	 * Restores all colors and fonts to their default values.
+	 *
+	 * @param baseFont The base font to use when creating this scheme.  If
+	 *        this is <code>null</code>, then a default monospaced font is
+	 *        used.
+	 * @param fontStyles Whether bold and italic should be used in the scheme
+	 *        (vs. all tokens using a plain font).
+	 */
+	public void restoreDefaults(Font baseFont, boolean fontStyles) {
+
+		// Colors used by tokens.
+		Color comment			= new Color(0,128,0);
+		Color docComment		= new Color(164,0,0);
+		Color markupComment		= new Color(0, 96, 0);
+		Color keyword			= Color.BLUE;
+		Color dataType			= new Color(0,128,128);
+		Color function			= new Color(173,128,0);
+		Color preprocessor		= new Color(128,128,128);
+		Color operator			= new Color(128, 64, 64);
+		Color regex				= new Color(0,128,164);
+		Color variable			= new Color(255,153,0);
+		Color literalNumber		= new Color(100,0,200);
+		Color literalString		= new Color(220,0,156);
+		Color error			= new Color(148,148,0);
+
+		// (Possible) special font styles for keywords and comments.
+		if (baseFont==null) {
+			baseFont = RSyntaxTextArea.getDefaultFont();
+		}
+		Font commentFont = baseFont;
+		Font keywordFont = baseFont;
+		if (fontStyles) {
+			// WORKAROUND for Sun JRE bug 6282887 (Asian font bug in 1.4/1.5)
+			// That bug seems to be hidden now, see 6289072 instead.
+			StyleContext sc = StyleContext.getDefaultStyleContext();
+			Font boldFont = sc.getFont(baseFont.getFamily(), Font.BOLD,
+					baseFont.getSize());
+			Font italicFont = sc.getFont(baseFont.getFamily(), Font.ITALIC,
+					baseFont.getSize());
+			commentFont = italicFont;//baseFont.deriveFont(Font.ITALIC);
+			keywordFont = boldFont;//baseFont.deriveFont(Font.BOLD);
+		}
+
+		styles[COMMENT_EOL]				= new Style(comment, null, commentFont);
+		styles[COMMENT_MULTILINE]			= new Style(comment, null, commentFont);
+		styles[COMMENT_DOCUMENTATION]		= new Style(docComment, null, commentFont);
+		styles[COMMENT_KEYWORD]			= new Style(new Color(255,152,0), null, commentFont);
+		styles[COMMENT_MARKUP]			= new Style(Color.gray, null, commentFont);
+		styles[RESERVED_WORD]				= new Style(keyword, null, keywordFont);
+		styles[RESERVED_WORD_2]			= new Style(keyword, null, keywordFont);
+		styles[FUNCTION]					= new Style(function);
+		styles[LITERAL_BOOLEAN]			= new Style(literalNumber);
+		styles[LITERAL_NUMBER_DECIMAL_INT]	= new Style(literalNumber);
+		styles[LITERAL_NUMBER_FLOAT]		= new Style(literalNumber);
+		styles[LITERAL_NUMBER_HEXADECIMAL]	= new Style(literalNumber);
+		styles[LITERAL_STRING_DOUBLE_QUOTE]	= new Style(literalString);
+		styles[LITERAL_CHAR]				= new Style(literalString);
+		styles[LITERAL_BACKQUOTE]			= new Style(literalString);
+		styles[DATA_TYPE]				= new Style(dataType, null, keywordFont);
+		styles[VARIABLE]					= new Style(variable);
+		styles[REGEX]						= new Style(regex);
+		styles[ANNOTATION]				= new Style(Color.gray);
+		styles[IDENTIFIER]				= new Style(null);
+		styles[WHITESPACE]				= new Style(Color.gray);
+		styles[SEPARATOR]				= new Style(Color.RED);
+		styles[OPERATOR]					= new Style(operator);
+		styles[PREPROCESSOR]				= new Style(preprocessor);
+		styles[MARKUP_TAG_DELIMITER]		= new Style(Color.RED);
+		styles[MARKUP_TAG_NAME]			= new Style(Color.BLUE);
+		styles[MARKUP_TAG_ATTRIBUTE]		= new Style(new Color(63,127,127));
+		styles[MARKUP_TAG_ATTRIBUTE_VALUE]= new Style(literalString);
+		styles[MARKUP_COMMENT]              = new Style(markupComment, null, commentFont);
+		styles[MARKUP_DTD]              = new Style(function);
+		styles[MARKUP_PROCESSING_INSTRUCTION] = new Style(preprocessor);
+		styles[MARKUP_CDATA]				= new Style(new Color(0xcc6600));
+		styles[MARKUP_CDATA_DELIMITER]		= new Style(new Color(0x008080));
+		styles[MARKUP_ENTITY_REFERENCE]		= new Style(dataType);
+		styles[ERROR_IDENTIFIER]			= new Style(error);
+		styles[ERROR_NUMBER_FORMAT]		= new Style(error);
+		styles[ERROR_STRING_DOUBLE]		= new Style(error);
+		styles[ERROR_CHAR]				= new Style(error);
+
+	}
+
+
+	/**
+	 * Sets a style to use when rendering a token type.
+	 *
+	 * @param type The token type.
+	 * @param style The style for the token type.
+	 * @see #getStyle(int)
+	 */
+	public void setStyle(int type, Style style) {
+		styles[type] = style;
+	}
+
+
+	/**
+	 * Returns the color represented by a string.  If the first char in the
+	 * string is '<code>$</code>', it is assumed to be in hex, otherwise it is
+	 * assumed to be decimal.  So, for example, both of these:
+	 * <pre>
+	 * "$00ff00"
+	 * "65280"
+	 * </pre>
+	 * will return <code>new Color(0, 255, 0)</code>.
+	 *
+	 * @param s The string to evaluate.
+	 * @return The color.
+	 */
+	private static final Color stringToColor(String s) {
+		// Check for decimal as well as hex, for backward
+		// compatibility (fix from GwynEvans on forums)
+		char ch = s.charAt(0);
+		return new Color((ch=='$' || ch=='#') ?
+				Integer.parseInt(s.substring(1),16) :
+				Integer.parseInt(s));
+	}
+
+
+	/**
+	 * Returns this syntax highlighting scheme as a comma-separated list of
+	 * values as follows:
+	 * <ul>
+	 *   <li>If a color is non-null, it is added as a 24-bit integer
+	 *      of the form <code>((r<<16) | (g<<8) | (b))</code>; if it is
+	 *       <code>null</code>, it is added as "<i>-,</i>".
+	 *   <li>The font and style (bold/italic) is added as an integer like so:
+	 *       "<i>family,</i> <i>style,</i> <i>size</i>".
+	 *   <li>The entire syntax highlighting scheme is thus one long string of
+	 *       color schemes of the format "<i>i,[fg],[bg],uline,[style]</i>,
+	 *       where:
+	 *       <ul>
+	 *          <li><code>i</code> is the index of the syntax scheme.
+	 *          <li><i>fg</i> and <i>bg</i> are the foreground and background
+	 *              colors for the scheme, and may be null (represented by 
+	 *              <code>-</code>).
+	 *          <li><code>uline</code> is whether or not the font should be
+	 *              underlined, and is either <code>t</code> or <code>f</code>.
+	 *          <li><code>style</code> is the <code>family,style,size</code>
+	 *              triplet described above.
+	 *       </ul>
+	 * </ul>
+	 *
+	 * @return A string representing the rgb values of the colors.
+	 */
+	public String toCommaSeparatedString() {
+
+		StringBuffer sb = new StringBuffer(VERSION);
+		sb.append(',');
+
+		for (int i=0; i<NUM_TOKEN_TYPES; i++) {
+
+			sb.append(i).append(',');
+
+			Style ss = styles[i];
+			if (ss==null) { // Only true for i==0 (NULL token)
+				sb.append("-,-,f,-,,,");
+				continue;
+			}
+
+			Color c = ss.foreground;
+			sb.append(c!=null ? (getHexString(c) + ",") : "-,");
+			c = ss.background;
+			sb.append(c!=null ? (getHexString(c) + ",") : "-,");
+
+			sb.append(ss.underline ? "t," : "f,");
+
+			Font font = ss.font;
+			if (font!=null) {
+				sb.append(font.getFamily()).append(',').
+					append(font.getStyle()).append(',').
+						append(font.getSize()).append(',');
+			}
+			else {
+				sb.append("-,,,");
+			}
+
+		}
+
+		return sb.substring(0,sb.length()-1); // Take off final ','.
+
+	}
+
+
+	/**
+	 * Loads a <code>SyntaxScheme</code> from an XML file.
+	 */
+	private static class XmlParser extends DefaultHandler {
+
+		private Font baseFont;
+		private SyntaxScheme scheme;
+
+		public XmlParser(Font baseFont) {
+			scheme = new SyntaxScheme(baseFont);
+		}
+
+		/**
+		 * Creates the XML reader to use.  Note that in 1.4 JRE's, the reader
+		 * class wasn't defined by default, but in 1.5+ it is.
+		 *
+		 * @return The XML reader to use.
+		 */
+		private static XMLReader createReader() throws IOException {
+			XMLReader reader = null;
+			try {
+				reader = XMLReaderFactory.createXMLReader();
+			} catch (SAXException e) {
+				// Happens in JRE 1.4.x; 1.5+ define the reader class properly
+				try {
+					reader = XMLReaderFactory.createXMLReader(
+							"org.apache.crimson.parser.XMLReaderImpl");
+				} catch (SAXException se) {
+					throw new IOException(se.toString());
+				}
+			}
+			return reader;
+		}
+
+		public static SyntaxScheme load(Font baseFont,
+										InputStream in) throws IOException {
+			XMLReader reader = createReader();
+			XmlParser parser = new XmlParser(baseFont);
+			parser.baseFont = baseFont;
+			reader.setContentHandler(parser);
+			InputSource is = new InputSource(in);
+			is.setEncoding("UTF-8");
+			try {
+				reader.parse(is);
+			} catch (SAXException se) {
+				throw new IOException(se.toString());
+			}
+			return parser.scheme;
+		}
+
+		public void startElement(String uri, String localName, String qName,
+								Attributes attrs) {
+
+			if ("style".equals(qName)) {
+
+				String type = attrs.getValue("token");
+				Field field = null;
+				try {
+					field = Token.class.getField(type);
+				} catch (RuntimeException re) {
+					throw re; // FindBugs
+				} catch (Exception e) {
+					System.err.println("Invalid token type: " + type);
+					return;
+				}
+
+				if (field.getType()==int.class) {
+
+					int index = 0;
+					try {
+						index = field.getInt(scheme);
+					} catch (IllegalArgumentException e) {
+						e.printStackTrace();
+						return;
+					} catch (IllegalAccessException e) {
+						e.printStackTrace();
+						return;
+					}
+
+					String fgStr = attrs.getValue("fg");
+					if (fgStr!=null) {
+						Color fg = stringToColor(fgStr);
+						scheme.styles[index].foreground = fg;
+					}
+
+					String bgStr = attrs.getValue("bg");
+					if (bgStr!=null) {
+						Color bg = stringToColor(bgStr);
+						scheme.styles[index].background = bg;
+					}
+
+					boolean styleSpecified = false;
+					boolean bold = false;
+					boolean italic = false;
+					String boldStr = attrs.getValue("bold");
+					if (boldStr!=null) {
+						bold = Boolean.valueOf(boldStr).booleanValue();
+						styleSpecified = true;
+					}
+					String italicStr = attrs.getValue("italic");
+					if (italicStr!=null) {
+						italic = Boolean.valueOf(italicStr).booleanValue();
+						styleSpecified = true;
+					}
+					if (styleSpecified) {
+						int style = 0;
+						if (bold) { style |= Font.BOLD; }
+						if (italic) { style |= Font.ITALIC; }
+						scheme.styles[index].font = baseFont.deriveFont(style);
+					}
+
+					String ulineStr = attrs.getValue("underline");
+					if (ulineStr!=null) {
+						boolean uline= Boolean.valueOf(ulineStr).booleanValue();
+						scheme.styles[index].underline = uline;
+					}
+
+				}
+
+			}
+
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/SyntaxView.java b/src/org/fife/ui/rsyntaxtextarea/SyntaxView.java
new file mode 100644
index 0000000..3f7c695
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/SyntaxView.java
@@ -0,0 +1,974 @@
+/*
+ * 02/24/2004
+ *
+ * SyntaxView.java - The View object used by RSyntaxTextArea when word wrap is
+ * disabled.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * The <code>javax.swing.text.View</code> object used by {@link RSyntaxTextArea}
+ * when word wrap is disabled.  It implements syntax highlighting for
+ * programming languages using the colors and font styles specified by the
+ * <code>RSyntaxTextArea</code>.<p>
+ *
+ * You don't really have to do anything to use this class, as
+ * {@link RSyntaxTextAreaUI} automatically sets the text area's view to be
+ * an instance of this class if word wrap is disabled.<p>
+ *
+ * The tokens that specify how to paint the syntax-highlighted text are gleaned
+ * from the text area's {@link RSyntaxDocument}.
+ *
+ * @author Robert Futrell
+ * @version 0.3
+ */
+public class SyntaxView extends View implements TabExpander,
+											TokenOrientedView, RSTAView {
+
+	/**
+	 * The default font used by the text area.  If this changes we need to
+	 * recalculate the longest line.
+	 */
+	Font font;
+
+	/**
+	 * Font metrics for the current font.
+	 */
+	protected FontMetrics metrics;
+
+	/**
+	 * The current longest line.  This is used to calculate the preferred width
+	 * of the view.  Since the calculation is potentially expensive, we try to
+	 * avoid it by stashing which line is currently the longest.
+	 */
+	Element longLine;
+	float longLineWidth;
+
+	private int tabSize;
+	protected int tabBase;
+    
+
+	/**
+	 * Cached for each paint() call so each drawLine() call has access to it.
+	 */
+	private RSyntaxTextArea host;
+
+	/**
+	 * Cached values to speed up the painting a tad.
+	 */
+	private int lineHeight = 0;
+	private int ascent;
+	private int clipStart;
+	private int clipEnd;
+	private Token tempToken;
+
+//	/**
+//	 * The end-of-line marker.
+//	 */
+//	private static final char[] eolMarker = { '.' };
+
+
+	/**
+	 * Constructs a new <code>SyntaxView</code> wrapped around an element.
+	 *
+	 * @param elem The element representing the text to display.
+	 */
+	public SyntaxView(Element elem) {
+		super(elem);
+		tempToken = new Token();
+	}
+
+
+	/**
+	 * Iterate over the lines represented by the child elements
+	 * of the element this view represents, looking for the line
+	 * that is the longest.  The <em>longLine</em> variable is updated to
+	 * represent the longest line contained.  The <em>font</em> variable
+	 * is updated to indicate the font used to calculate the 
+	 * longest line.
+	 */
+	void calculateLongestLine() {
+		Component c = getContainer();
+		font = c.getFont();
+		metrics = c.getFontMetrics(font);
+		tabSize = getTabSize() * metrics.charWidth(' ');
+		Element lines = getElement();
+		int n = lines.getElementCount();
+		for (int i=0; i<n; i++) {
+			Element line = lines.getElement(i);
+			float w = getLineWidth(i);
+			if (w > longLineWidth) {
+				longLineWidth = w;
+				longLine = line;
+			}
+		}
+	}
+
+
+	/**
+	 * Gives notification from the document that attributes were changed
+	 * in a location that this view is responsible for.
+	 *
+	 * @param changes the change information from the associated document
+	 * @param a the current allocation of the view
+	 * @param f the factory to use to rebuild if the view has children
+	 * @see View#changedUpdate
+	 */
+	public void changedUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
+		updateDamage(changes, a, f);
+	}
+
+
+	/**
+	 * Repaint the given line range.
+	 *
+	 * @param line0 The starting line number to repaint.  This must
+	 *   be a valid line number in the model.
+	 * @param line1 The ending line number to repaint.  This must
+	 *   be a valid line number in the model.
+	 * @param a  The region allocated for the view to render into.
+	 * @param host The component hosting the view (used to call repaint).
+	 */
+	protected void damageLineRange(int line0, int line1, Shape a,
+												Component host) {
+		if (a != null) {
+			Rectangle area0 = lineToRect(a, line0);
+			Rectangle area1 = lineToRect(a, line1);
+			if ((area0 != null) && (area1 != null)) {
+				Rectangle dmg = area0.union(area1); // damage.
+				host.repaint(dmg.x, dmg.y, dmg.width, dmg.height);
+			}
+			else
+				host.repaint();
+		}
+	}
+
+
+	/**
+	 * Draws the passed-in text using syntax highlighting for the current
+	 * language.  It is assumed that the entire line is either not in a
+	 * selected region, or painting with a selection-foreground color is turned
+	 * off.
+	 *
+	 * @param painter The painter to render the tokens.
+	 * @param token The list of tokens to draw.
+	 * @param g The graphics context in which to draw.
+	 * @param x The x-coordinate at which to draw.
+	 * @param y The y-coordinate at which to draw.
+	 * @return The x-coordinate representing the end of the painted text.
+	 */
+	private float drawLine(TokenPainter painter, Token token, Graphics2D g,
+			float x, float y) {
+
+		float nextX = x;	// The x-value at the end of our text.
+
+		while (token!=null && token.isPaintable() && nextX<clipEnd) {
+			nextX = painter.paint(token, g, nextX,y, host, this, clipStart);
+			token = token.getNextToken();
+		}
+
+		// NOTE: We should re-use code from Token (paintBackground()) here,
+		// but don't because I'm just too lazy.
+		if (host.getEOLMarkersVisible()) {
+			g.setColor(host.getForegroundForTokenType(Token.WHITESPACE));
+			g.setFont(host.getFontForTokenType(Token.WHITESPACE));
+			g.drawString("\u00B6", nextX, y);
+		}
+
+		// Return the x-coordinate at the end of the painted text.
+		return nextX;
+
+	}
+
+
+	/**
+	 * Draws the passed-in text using syntax highlighting for the current
+	 * language.  Tokens are checked for being in a selected region, and are
+	 * rendered appropriately if they are.
+	 *
+	 * @param painter The painter to render the tokens.
+	 * @param token The list of tokens to draw.
+	 * @param g The graphics context in which to draw.
+	 * @param x The x-coordinate at which to draw.
+	 * @param y The y-coordinate at which to draw.
+	 * @param selStart The start of the selection.
+	 * @param selEnd The end of the selection.
+	 * @return The x-coordinate representing the end of the painted text.
+	 */
+	private float drawLineWithSelection(TokenPainter painter, Token token,
+			Graphics2D g, float x, float y, int selStart, int selEnd) {
+
+		float nextX = x;	// The x-value at the end of our text.
+
+		while (token!=null && token.isPaintable() && nextX<clipEnd) {
+
+			// Selection starts in this token
+			if (token.containsPosition(selStart)) {
+
+				if (selStart>token.offset) {
+					tempToken.copyFrom(token);
+					tempToken.textCount = selStart - tempToken.offset;
+					nextX = painter.paint(tempToken,g,nextX,y,host, this, clipStart);
+					token.makeStartAt(selStart);
+				}
+
+				int selCount = Math.min(token.textCount, selEnd-token.offset);
+				if (selCount==token.textCount) {
+					nextX = painter.paintSelected(token, g, nextX,y, host,
+												this, clipStart);
+				}
+				else {
+					tempToken.copyFrom(token);
+					tempToken.textCount = selCount;
+					nextX = painter.paintSelected(tempToken, g, nextX,y, host,
+							this, clipStart);
+					token.makeStartAt(token.offset + selCount);
+					nextX = painter.paint(token, g, nextX,y, host, this,
+											clipStart);
+				}
+
+			}
+
+			// Selection ends in this token
+			else if (token.containsPosition(selEnd)) {
+				tempToken.copyFrom(token);
+				tempToken.textCount = selEnd - tempToken.offset;
+				nextX = painter.paintSelected(tempToken, g, nextX,y, host, this,
+						clipStart);
+				token.makeStartAt(selEnd);
+				nextX = painter.paint(token, g, nextX,y, host, this, clipStart);
+			}
+
+			// This token is entirely selected
+			else if (token.offset>=selStart &&
+					(token.offset+token.textCount)<=selEnd) {
+				nextX = painter.paintSelected(token, g, nextX,y, host, this,
+						clipStart);
+			}
+
+			// This token is entirely unselected
+			else {
+				nextX = painter.paint(token, g, nextX,y, host, this, clipStart);
+			}
+
+			token = token.getNextToken();
+
+		}
+
+		// NOTE: We should re-use code from Token (paintBackground()) here,
+		// but don't because I'm just too lazy.
+		if (host.getEOLMarkersVisible()) {
+			g.setColor(host.getForegroundForTokenType(Token.WHITESPACE));
+			g.setFont(host.getFontForTokenType(Token.WHITESPACE));
+			g.drawString("\u00B6", nextX, y);
+		}
+
+		// Return the x-coordinate at the end of the painted text.
+		return nextX;
+
+	}
+
+
+	/**
+	 * Calculates the width of the line represented by the given element.
+	 *
+	 * @param line The line for which to get the length.
+	 * @param lineNumber The line number of the specified line in the document.
+	 * @return The width of the line.
+	 */
+	private float getLineWidth(int lineNumber) {
+		Token tokenList = ((RSyntaxDocument)getDocument()).
+									getTokenListForLine(lineNumber);
+		return RSyntaxUtilities.getTokenListWidth(tokenList,
+								(RSyntaxTextArea)getContainer(),
+								this);
+	}
+
+
+	/**
+	 * Provides a way to determine the next visually represented model 
+	 * location that one might place a caret.  Some views may not be visible,
+	 * they might not be in the same order found in the model, or they just
+	 * might not allow access to some of the locations in the model.
+	 *
+	 * @param pos the position to convert >= 0
+	 * @param a the allocated region to render into
+	 * @param direction the direction from the current position that can
+	 *  be thought of as the arrow keys typically found on a keyboard.
+	 *  This may be SwingConstants.WEST, SwingConstants.EAST, 
+	 *  SwingConstants.NORTH, or SwingConstants.SOUTH.  
+	 * @return the location within the model that best represents the next
+	 *  location visual position.
+	 * @exception BadLocationException
+	 * @exception IllegalArgumentException for an invalid direction
+	 */
+	public int getNextVisualPositionFrom(int pos, Position.Bias b, Shape a, 
+							int direction, Position.Bias[] biasRet)
+							throws BadLocationException {
+		return RSyntaxUtilities.getNextVisualPositionFrom(pos, b, a,
+										direction, biasRet, this);
+	}
+
+
+	/**
+	 * Determines the preferred span for this view along an
+	 * axis.
+	 *
+	 * @param axis may be either View.X_AXIS or View.Y_AXIS
+	 * @return   the span the view would like to be rendered into >= 0.
+	 *           Typically the view is told to render into the span
+	 *           that is returned, although there is no guarantee.  
+	 *           The parent may choose to resize or break the view.
+	 * @exception IllegalArgumentException for an invalid axis
+	 */
+	public float getPreferredSpan(int axis) {
+		updateMetrics();
+		switch (axis) {
+			case View.X_AXIS:
+				float span = longLineWidth + 10; // "fudge factor."
+				if (host.getEOLMarkersVisible()) {
+					span += metrics.charWidth('\u00B6');
+				}
+				return span;
+			case View.Y_AXIS:
+				// We update lineHeight here as when this method is first
+				// called, lineHeight isn't initialized.  If we don't do it
+				// here, we get no vertical scrollbar (as lineHeight==0).
+				lineHeight = host!=null ? host.getLineHeight() : lineHeight;
+//				return getElement().getElementCount() * lineHeight;
+int visibleLineCount = getElement().getElementCount();
+if (host.isCodeFoldingEnabled()) {
+	visibleLineCount -= host.getFoldManager().getHiddenLineCount();
+}
+return visibleLineCount * lineHeight;
+			default:
+				throw new IllegalArgumentException("Invalid axis: " + axis);
+		}
+	}
+
+
+	/**
+	 * Returns the tab size set for the document, defaulting to 5.
+	 *
+	 * @return The tab size.
+	 */
+	protected int getTabSize() {
+		Integer i = (Integer)getDocument().getProperty(
+									PlainDocument.tabSizeAttribute);
+		int size = (i != null) ? i.intValue() : 5;
+		return size;
+	}
+
+
+	/**
+	 * Returns a token list for the <i>physical</i> line above the physical
+	 * line containing the specified offset into the document.  Note that for
+	 * this plain (non-wrapped) view, this is simply the token list for the
+	 * logical line above the line containing <code>offset</code>, since lines
+	 * are not wrapped.
+	 *
+	 * @param offset The offset in question.
+	 * @return A token list for the physical (and in this view, logical) line
+	 *         before this one.  If <code>offset</code> is in the first line in
+	 *         the document, <code>null</code> is returned.
+	 */
+	public Token getTokenListForPhysicalLineAbove(int offset) {
+		RSyntaxDocument document = (RSyntaxDocument)getDocument();
+		Element map = document.getDefaultRootElement();
+int line = map.getElementIndex(offset);
+FoldManager fm = host.getFoldManager();
+if (fm==null) {
+	line--;
+	if (line>=0) {
+		return document.getTokenListForLine(line);
+	}
+}
+else {
+	line = fm.getVisibleLineAbove(line);
+	if (line>=0) {
+		return document.getTokenListForLine(line);
+	}
+}
+//		int line = map.getElementIndex(offset) - 1;
+//		if (line>=0)
+//			return document.getTokenListForLine(line);
+		return null;
+	}
+
+
+	/**
+	 * Returns a token list for the <i>physical</i> line below the physical
+	 * line containing the specified offset into the document.  Note that for
+	 * this plain (non-wrapped) view, this is simply the token list for the
+	 * logical line below the line containing <code>offset</code>, since lines
+	 * are not wrapped.
+	 *
+	 * @param offset The offset in question.
+	 * @return A token list for the physical (and in this view, logical) line
+	 *         after this one.  If <code>offset</code> is in the last physical
+	 *         line in the document, <code>null</code> is returned.
+	 */
+	public Token getTokenListForPhysicalLineBelow(int offset) {
+		RSyntaxDocument document = (RSyntaxDocument)getDocument();
+		Element map = document.getDefaultRootElement();
+		int lineCount = map.getElementCount();
+int line = map.getElementIndex(offset);
+if (!host.isCodeFoldingEnabled()) {
+	if (line<lineCount-1) {
+		return document.getTokenListForLine(line+1);
+	}
+}
+else {
+	FoldManager fm = host.getFoldManager();
+	line = fm.getVisibleLineBelow(line);
+	if (line>=0 && line<lineCount) {
+		return document.getTokenListForLine(line);
+	}
+}
+//		int line = map.getElementIndex(offset);
+//		int lineCount = map.getElementCount();
+//		if (line<lineCount-1)
+//			return document.getTokenListForLine(line+1);
+		return null;
+	}
+
+
+	/**
+	 * Gives notification that something was inserted into the document
+	 * in a location that this view is responsible for.
+	 *
+	 * @param changes The change information from the associated document.
+	 * @param a The current allocation of the view.
+	 * @param f The factory to use to rebuild if the view has children.
+	 */
+	public void insertUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
+		updateDamage(changes, a, f);
+	}
+
+
+	/**
+	 * Determine the rectangle that represents the given line.
+	 *
+	 * @param a The region allocated for the view to render into
+	 * @param line The line number to find the region of.  This must
+	 *        be a valid line number in the model.
+	 */
+	protected Rectangle lineToRect(Shape a, int line) {
+		Rectangle r = null;
+		updateMetrics();
+		if (metrics != null) {
+			Rectangle alloc = a.getBounds();
+			// NOTE:  lineHeight is not initially set here, leading to the
+			// current line not being highlighted when a document is first
+			// opened.  So, we set it here just in case.
+			lineHeight = host!=null ? host.getLineHeight() : lineHeight;
+if (host.isCodeFoldingEnabled()) {
+	FoldManager fm = host.getFoldManager();
+	int hiddenCount = fm.getHiddenLineCountAbove(line);
+	line -= hiddenCount;
+}
+			r = new Rectangle(alloc.x, alloc.y + line*lineHeight,
+									alloc.width, lineHeight);
+		}
+		return r;
+	}
+
+
+	/**
+	 * Provides a mapping from the document model coordinate space
+	 * to the coordinate space of the view mapped to it.
+	 *
+	 * @param pos the position to convert >= 0
+	 * @param a the allocated region to render into
+	 * @return the bounding box of the given position
+	 * @exception BadLocationException  if the given position does not
+	 *   represent a valid location in the associated document
+	 * @see View#modelToView
+	 */
+	public Shape modelToView(int pos, Shape a, Position.Bias b)
+										throws BadLocationException {
+
+		// line coordinates
+		Element map = getElement();
+		RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+		int lineIndex = map.getElementIndex(pos);
+		Token tokenList = doc.getTokenListForLine(lineIndex);
+		Rectangle lineArea = lineToRect(a, lineIndex);
+		tabBase = lineArea.x; // Used by listOffsetToView().
+
+		//int x = (int)RSyntaxUtilities.getTokenListWidthUpTo(tokenList,
+		//							(RSyntaxTextArea)getContainer(),
+		//							this, 0, pos);
+		// We use this method instead as it returns the actual bounding box,
+		// not just the x-coordinate.
+		lineArea = tokenList.listOffsetToView(
+						(RSyntaxTextArea)getContainer(), this, pos,
+						tabBase, lineArea);
+
+		return lineArea;
+
+	}
+
+
+	/**
+	 * Provides a mapping, for a given region, from the document model
+	 * coordinate space to the view coordinate space. The specified region is
+	 * created as a union of the first and last character positions.<p>
+	 *
+	 * This is implemented to subtract the width of the second character, as
+	 * this view's <code>modelToView</code> actually returns the width of the
+	 * character instead of "1" or "0" like the View implementations in
+	 * <code>javax.swing.text</code>.  Thus, if we don't override this method,
+	 * the <code>View</code> implementation will return one character's width
+	 * too much for its consumers (implementations of
+	 * <code>javax.swing.text.Highlighter</code>).
+	 *
+	 * @param p0 the position of the first character (>=0)
+	 * @param b0 The bias of the first character position, toward the previous
+	 *        character or the next character represented by the offset, in
+	 *        case the position is a boundary of two views; <code>b0</code>
+	 *        will have one of these values:
+	 * <ul>
+	 *    <li> <code>Position.Bias.Forward</code>
+	 *    <li> <code>Position.Bias.Backward</code>
+	 * </ul>
+	 * @param p1 the position of the last character (>=0)
+	 * @param b1 the bias for the second character position, defined
+	 *		one of the legal values shown above
+	 * @param a the area of the view, which encompasses the requested region
+	 * @return the bounding box which is a union of the region specified
+	 *		by the first and last character positions
+	 * @exception BadLocationException  if the given position does
+	 *   not represent a valid location in the associated document
+	 * @exception IllegalArgumentException if <code>b0</code> or
+	 *		<code>b1</code> are not one of the
+	 *		legal <code>Position.Bias</code> values listed above
+	 * @see View#viewToModel
+	 */
+	public Shape modelToView(int p0, Position.Bias b0,
+							int p1, Position.Bias b1,
+							Shape a) throws BadLocationException {
+
+		Shape s0 = modelToView(p0, a, b0);
+		Shape s1;
+		if (p1 ==getEndOffset()) {
+			try {
+				s1 = modelToView(p1, a, b1);
+			} catch (BadLocationException ble) {
+				s1 = null;
+			}
+			if (s1 == null) {
+				// Assume extends left to right.
+				Rectangle alloc = (a instanceof Rectangle) ? (Rectangle)a :
+								a.getBounds();
+				s1 = new Rectangle(alloc.x + alloc.width - 1, alloc.y,
+								1, alloc.height);
+			}
+		}
+		else {
+			s1 = modelToView(p1, a, b1);
+		}
+		Rectangle r0 = s0 instanceof Rectangle ? (Rectangle)s0 : s0.getBounds();
+		Rectangle r1 = s1 instanceof Rectangle ? (Rectangle)s1 : s1.getBounds();
+		if (r0.y != r1.y) {
+			// If it spans lines, force it to be the width of the view.
+			Rectangle alloc = (a instanceof Rectangle) ? (Rectangle)a :
+								a.getBounds();
+			r0.x = alloc.x;
+			r0.width = alloc.width;
+		}
+
+		r0.add(r1);
+		// The next line is the only difference between this method and
+		// View's implementation.  We're subtracting the width of the second
+		// character.  This is because this method is used by Highlighter
+		// implementations to get the area to "highlight", and if we don't do
+		// this, one character too many is highlighted thanks to our
+		// modelToView() implementation returning the actual width of the
+		// character requested!
+		if (p1>p0) r0.width -= r1.width;
+
+		return r0;
+
+	}
+
+
+	/**
+	 * Returns the next tab stop position after a given reference position.
+	 * This implementation does not support things like centering so it
+	 * ignores the tabOffset argument.
+	 *
+	 * @param x the current position >= 0
+	 * @param tabOffset the position within the text stream
+	 *   that the tab occurred at >= 0.
+	 * @return the tab stop, measured in points >= 0
+	 */
+	public float nextTabStop(float x, int tabOffset) {
+		if (tabSize == 0)
+			return x;
+		int ntabs = (((int)x) - tabBase) / tabSize;
+		return tabBase + ((ntabs + 1) * tabSize);
+	}
+
+
+	/**
+	 * Actually paints the text area.  Only lines that have been damaged are
+	 * repainted.
+	 *
+	 * @param g The graphics context with which to paint.
+	 * @param a The allocated region in which to render.
+	 */
+	public void paint(Graphics g, Shape a) {
+
+		RSyntaxDocument document = (RSyntaxDocument)getDocument();
+
+		Rectangle alloc = a.getBounds();
+
+		tabBase = alloc.x;
+		host = (RSyntaxTextArea)getContainer();
+
+		Rectangle clip = g.getClipBounds();
+		// An attempt to speed things up for files with long lines.  Note that
+		// this will actually slow things down a bit for the common case of
+		// regular-length lines, but it doesn't make a perceivable difference.
+		clipStart = clip.x;
+		clipEnd = clipStart + clip.width;
+
+		lineHeight = host.getLineHeight();
+		ascent = host.getMaxAscent();//metrics.getAscent();
+		int heightAbove = clip.y - alloc.y;
+		int linesAbove = Math.max(0, heightAbove / lineHeight);
+
+		FoldManager fm = host.getFoldManager();
+		linesAbove += fm.getHiddenLineCountAbove(linesAbove, true);
+		Rectangle lineArea = lineToRect(a, linesAbove);
+		int y = lineArea.y + ascent;
+		int x = lineArea.x;
+		Element map = getElement();
+		int lineCount = map.getElementCount();
+
+		// Whether token styles should always be painted, even in selections
+		int selStart = host.getSelectionStart();
+		int selEnd = host.getSelectionEnd();
+		boolean useSelectedTextColor = host.getUseSelectedTextColor();
+
+		RSyntaxTextAreaHighlighter h =
+					(RSyntaxTextAreaHighlighter)host.getHighlighter();
+
+		Graphics2D g2d = (Graphics2D)g;
+		Token token;
+		//System.err.println("Painting lines: " + linesAbove + " to " + (endLine-1));
+
+		TokenPainter painter = host.getTokenPainter();
+		int line = linesAbove;
+		//int count = 0;
+		while (y<clip.y+clip.height+lineHeight && line<lineCount) {
+
+			Fold fold = fm.getFoldForLine(line);
+			Element lineElement = map.getElement(line);
+			int startOffset = lineElement.getStartOffset();
+			//int endOffset = (line==lineCount ? lineElement.getEndOffset()-1 :
+			//							lineElement.getEndOffset()-1);
+			int endOffset = lineElement.getEndOffset()-1; // Why always "-1"?
+			h.paintLayeredHighlights(g2d, startOffset, endOffset,
+								a, host, this);
+	
+			// Paint a line of text.
+			token = document.getTokenListForLine(line);
+			if (!useSelectedTextColor || selStart==selEnd ||
+					(startOffset>=selEnd || endOffset<selStart)) {
+				drawLine(painter, token, g2d, x,y);
+			}
+			else {
+				//System.out.println("Drawing line with selection: " + line);
+				drawLineWithSelection(painter,token,g2d, x,y, selStart, selEnd);
+			}
+
+			if (fold!=null && fold.isCollapsed()) {
+
+				// Visible indicator of collapsed lines
+				Color c = RSyntaxUtilities.getFoldedLineBottomColor(host);
+				if (c!=null) {
+					g.setColor(c);
+					g.drawLine(x,y+lineHeight-ascent-1,
+							alloc.width,y+lineHeight-ascent-1);
+				}
+
+				// Skip to next line to paint, taking extra care for lines with
+				// block ends and begins together, e.g. "} else {"
+				do {
+					int hiddenLineCount = fold.getLineCount();
+					if (hiddenLineCount==0) {
+						// Fold parser identified a zero-line fold region.
+						// This is really a bug, but we'll be graceful here
+						// and avoid an infinite loop.
+						break;
+					}
+					line += hiddenLineCount;
+					fold = fm.getFoldForLine(line);
+				} while (fold!=null && fold.isCollapsed());
+
+			}
+
+			y += lineHeight;
+			line++;
+			//count++;
+
+		}
+
+		//System.out.println("SyntaxView: lines painted=" + count);
+
+	}
+
+
+	/**
+	 * If the passed-in line is longer than the current longest line, then
+	 * the longest line is updated.
+	 *
+	 * @param line The line to test against the current longest.
+	 * @param lineNumber The line number of the passed-in line.
+	 * @return <code>true</code> iff the current longest line was updated.
+	 */
+	protected boolean possiblyUpdateLongLine(Element line, int lineNumber) {
+		float w = getLineWidth(lineNumber);
+		if (w > longLineWidth) {
+			longLineWidth = w;
+			longLine = line;
+			return true;
+		}
+		return false;
+	}
+
+
+	/**
+	 * Gives notification that something was removed from the document
+	 * in a location that this view is responsible for.
+	 *
+	 * @param changes the change information from the associated document
+	 * @param a the current allocation of the view
+	 * @param f the factory to use to rebuild if the view has children
+	 */
+	public void removeUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
+		updateDamage(changes, a, f);
+	}
+
+
+	public void setSize(float width, float height) {
+		super.setSize(width, height);
+		updateMetrics();
+	}
+
+
+	/**
+	 * Repaint the region of change covered by the given document
+	 * event.  Damages the line that begins the range to cover
+	 * the case when the insert/remove is only on one line.  
+	 * If lines are added or removed, damages the whole 
+	 * view.  The longest line is checked to see if it has 
+	 * changed.
+	 */
+	protected void updateDamage(DocumentEvent changes, Shape a, ViewFactory f) {
+		Component host = getContainer();
+		updateMetrics();
+		Element elem = getElement();
+		DocumentEvent.ElementChange ec = changes.getChange(elem);
+		Element[] added = (ec != null) ? ec.getChildrenAdded() : null;
+		Element[] removed = (ec != null) ? ec.getChildrenRemoved() : null;
+		if (((added != null) && (added.length > 0)) || 
+			((removed != null) && (removed.length > 0))) {
+			// lines were added or removed...
+			if (added != null) {
+				int addedAt = ec.getIndex(); // FIXME: Is this correct?????
+				for (int i = 0; i < added.length; i++)
+					possiblyUpdateLongLine(added[i], addedAt+i);
+			}
+			if (removed != null) {
+				for (int i = 0; i < removed.length; i++) {
+					if (removed[i] == longLine) {
+						longLineWidth = -1; // Must do this!!
+						calculateLongestLine();
+						break;
+					}
+				}
+			}
+			preferenceChanged(null, true, true);
+			host.repaint();
+		}
+
+		// This occurs when syntax highlighting only changes on lines
+		// (i.e. beginning a multiline comment).
+		else if (changes.getType()==DocumentEvent.EventType.CHANGE) {
+			//System.err.println("Updating the damage due to a CHANGE event...");
+			int startLine = changes.getOffset();
+			int endLine = changes.getLength();
+			damageLineRange(startLine,endLine, a, host);
+		}
+
+		else {
+			Element map = getElement();
+			int line = map.getElementIndex(changes.getOffset());
+			damageLineRange(line, line, a, host);
+			if (changes.getType() == DocumentEvent.EventType.INSERT) {
+				// check to see if the line is longer than current
+				// longest line.
+				Element e = map.getElement(line);
+				if (e == longLine) {
+					// We must recalculate longest line's width here
+					// because it has gotten longer.
+					longLineWidth = getLineWidth(line);
+					preferenceChanged(null, true, false);
+				}
+				else {
+					// If long line gets updated, update the status bars too.
+					if (possiblyUpdateLongLine(e, line))
+						preferenceChanged(null, true, false);
+				}
+			}
+			else if (changes.getType() == DocumentEvent.EventType.REMOVE) {
+				if (map.getElement(line) == longLine) {
+					// removed from longest line... recalc
+					longLineWidth = -1; // Must do this!
+					calculateLongestLine();
+					preferenceChanged(null, true, false);
+				}			
+			}
+		}
+	}
+
+
+	/**
+	 * Checks to see if the font metrics and longest line are up-to-date.
+	 */
+	protected void updateMetrics() {
+		host = (RSyntaxTextArea)getContainer();
+		Font f = host.getFont();
+		if (font != f) {
+			// The font changed, we need to recalculate the longest line!
+			// This also updates cached font and tab size.
+			calculateLongestLine();
+		}
+	}
+
+
+	/**
+	 * Provides a mapping from the view coordinate space to the logical
+	 * coordinate space of the model.
+	 *
+	 * @param fx the X coordinate >= 0
+	 * @param fy the Y coordinate >= 0
+	 * @param a the allocated region to render into
+	 * @return the location within the model that best represents the
+	 *  given point in the view >= 0
+	 */
+	public int viewToModel(float fx, float fy, Shape a, Position.Bias[] bias) {
+
+		bias[0] = Position.Bias.Forward;
+
+		Rectangle alloc = a.getBounds();
+		RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+		int x = (int) fx;
+		int y = (int) fy;
+
+		// If they're asking about a view position above the area covered by
+		// this view, then the position is assumed to be the starting position
+		// of this view.
+		if (y < alloc.y) {
+			return getStartOffset();
+		}
+
+		// If they're asking about a position below this view, the position
+		// is assumed to be the ending position of this view.
+		else if (y > alloc.y + alloc.height) {
+			return host.getLastVisibleOffset();
+		}
+
+		// They're asking about a position within the coverage of this view
+		// vertically.  So, we figure out which line the point corresponds to.
+		// If the line is greater than the number of lines contained, then
+		// simply use the last line as it represents the last possible place
+		// we can position to.
+		else {
+
+			Element map = doc.getDefaultRootElement();
+			int lineIndex = Math.abs((y - alloc.y) / lineHeight);//metrics.getHeight() );
+FoldManager fm = host.getFoldManager();
+//System.out.print("--- " + lineIndex);
+lineIndex += fm.getHiddenLineCountAbove(lineIndex, true);
+//System.out.println(" => " + lineIndex);
+			if (lineIndex >= map.getElementCount()) {
+				return host.getLastVisibleOffset();
+			}
+
+			Element line = map.getElement(lineIndex);
+
+			// If the point is to the left of the line...
+			if (x < alloc.x)
+				return line.getStartOffset();
+
+			// If the point is to the right of the line...
+			else if (x > alloc.x + alloc.width)
+				return line.getEndOffset() - 1;
+
+			else {
+				// Determine the offset into the text
+				int p0 = line.getStartOffset();
+				Token tokenList = doc.getTokenListForLine(lineIndex);
+				tabBase = alloc.x;
+				int offs = tokenList.getListOffset(
+									(RSyntaxTextArea)getContainer(),
+									this, tabBase, x);
+				return offs!=-1 ? offs : p0;
+			}
+
+		} // End of else.
+
+	} 
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int yForLine(Rectangle alloc, int line) throws BadLocationException {
+
+		//Rectangle lineArea = lineToRect(alloc, lineIndex);
+		updateMetrics();
+		if (metrics != null) {
+			// NOTE:  lineHeight is not initially set here, leading to the
+			// current line not being highlighted when a document is first
+			// opened.  So, we set it here just in case.
+			lineHeight = host!=null ? host.getLineHeight() : lineHeight;
+			FoldManager fm = host.getFoldManager();
+			if (!fm.isLineHidden(line)) {
+				line -= fm.getHiddenLineCountAbove(line);
+				return alloc.y + line*lineHeight;
+			}
+		}
+
+		return -1;
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int yForLineContaining(Rectangle alloc, int offs)
+							throws BadLocationException {
+		Element map = getElement();
+		int line = map.getElementIndex(offs);
+		return yForLine(alloc, line);
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TextEditorPane.java b/src/org/fife/ui/rsyntaxtextarea/TextEditorPane.java
new file mode 100644
index 0000000..fc5eac2
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TextEditorPane.java
@@ -0,0 +1,712 @@
+/*
+ * 11/25/2008
+ *
+ * TextEditorPane.java - A syntax highlighting text area that has knowledge of
+ * the file it is editing on disk.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.charset.Charset;
+import java.nio.charset.UnsupportedCharsetException;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.Document;
+
+import org.fife.io.UnicodeReader;
+import org.fife.io.UnicodeWriter;
+import org.fife.ui.rtextarea.RTextAreaEditorKit;
+
+
+/**
+ * An extension of {@link org.fife.ui.rsyntaxtextarea.RSyntaxTextArea}
+ * that adds information about the file being edited, such as:
+ *
+ * <ul>
+ *   <li>Its name and location.
+ *   <li>Is it dirty?
+ *   <li>Is it read-only?
+ *   <li>The last time it was loaded or saved to disk (local files only).
+ *   <li>The file's encoding on disk.
+ *   <li>Easy access to the line separator.
+ * </ul>
+ *
+ * Loading and saving is also built into the editor.<p>
+ * Both local and remote files (e.g. ftp) are supported.  See the
+ * {@link FileLocation} class for more information.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see FileLocation
+ */
+public class TextEditorPane extends RSyntaxTextArea implements
+									DocumentListener {
+
+	private static final long serialVersionUID = 1L;
+
+	public static final String FULL_PATH_PROPERTY	= "TextEditorPane.fileFullPath";
+	public static final String DIRTY_PROPERTY	= "TextEditorPane.dirty";
+	public static final String READ_ONLY_PROPERTY	= "TextEditorPane.readOnly";
+
+	/**
+	 * The location of the file being edited.
+	 */
+	private FileLocation loc;
+
+	/**
+	 * The charset to use when reading or writing this file.
+	 */
+	private String charSet;
+
+	/**
+	 * Whether the file should be treated as read-only.
+	 */
+	private boolean readOnly;
+
+	/**
+	 * Whether the file is dirty.
+	 */
+	private boolean dirty;
+
+	/**
+	 * The last time this file was modified on disk, for local files.
+	 * For remote files, this value should always be
+	 * {@link #LAST_MODIFIED_UNKNOWN}.
+	 */
+	private long lastSaveOrLoadTime;
+
+	/**
+	 * The value returned by {@link #getLastSaveOrLoadTime()} for remote files.
+	 */
+	public static final long LAST_MODIFIED_UNKNOWN		= 0;
+
+	/**
+	 * The default name given to files if none is specified in a constructor.
+	 */
+	private static final String DEFAULT_FILE_NAME = "Untitled.txt";
+
+
+	/**
+	 * Constructor.  The file will be given a default name.
+	 */
+	public TextEditorPane() {
+		this(INSERT_MODE);
+	}
+
+
+	/**
+	 * Constructor.  The file will be given a default name.
+	 *
+	 * @param textMode Either <code>INSERT_MODE</code> or
+	 *        <code>OVERWRITE_MODE</code>.
+	 */
+	public TextEditorPane(int textMode) {
+		this(textMode, false);
+	}
+
+
+	/**
+	 * Creates a new <code>TextEditorPane</code>.  The file will be given
+	 * a default name.
+	 *
+	 * @param textMode Either <code>INSERT_MODE</code> or
+	 *        <code>OVERWRITE_MODE</code>.
+	 * @param wordWrapEnabled Whether or not to use word wrap in this pane.
+	 */
+	public TextEditorPane(int textMode, boolean wordWrapEnabled) {
+		super(textMode);
+		setLineWrap(wordWrapEnabled);
+		try {
+			init(null, null);
+		} catch (IOException ioe) { // Never happens
+			ioe.printStackTrace();
+		}
+	}
+
+
+	/**
+	 * Creates a new <code>TextEditorPane</code>.
+	 *
+	 * @param textMode Either <code>INSERT_MODE</code> or
+	 *        <code>OVERWRITE_MODE</code>.
+	 * @param wordWrapEnabled Whether or not to use word wrap in this pane.
+	 * @param loc The location of the text file being edited.  If this value
+	 *        is <code>null</code>, a file named "Untitled.txt" in the current
+	 *        directory is used.
+	 * @throws IOException If an IO error occurs reading the file at
+	 *         <code>loc</code>.  This of course won't happen if
+	 *         <code>loc</code> is <code>null</code>.
+	 */
+	public TextEditorPane(int textMode, boolean wordWrapEnabled,
+							FileLocation loc) throws IOException {
+		this(textMode, wordWrapEnabled, loc, null);
+	}
+
+
+	/**
+	 * Creates a new <code>TextEditorPane</code>.
+	 *
+	 * @param textMode Either <code>INSERT_MODE</code> or
+	 *        <code>OVERWRITE_MODE</code>.
+	 * @param wordWrapEnabled Whether or not to use word wrap in this pane.
+	 * @param loc The location of the text file being edited.  If this value
+	 *        is <code>null</code>, a file named "Untitled.txt" in the current
+	 *        directory is used.  This file is displayed as empty even if it
+	 *        actually exists.
+	 * @param defaultEnc The default encoding to use when opening the file,
+	 *        if the file is not Unicode.  If this value is <code>null</code>,
+	 *        a system default value is used.
+	 * @throws IOException If an IO error occurs reading the file at
+	 *         <code>loc</code>.  This of course won't happen if
+	 *         <code>loc</code> is <code>null</code>.
+	 */
+	public TextEditorPane(int textMode, boolean wordWrapEnabled,
+				FileLocation loc, String defaultEnc) throws IOException {
+		super(textMode);
+		setLineWrap(wordWrapEnabled);
+		init(loc, defaultEnc);
+	}
+
+
+	/**
+	 * Callback for when styles in the current document change.
+	 * This method is never called.
+	 *
+	 * @param e The document event.
+	 */
+	public void changedUpdate(DocumentEvent e) {
+	}
+
+
+
+	/**
+	 * Returns the default encoding for this operating system.
+	 *
+	 * @return The default encoding.
+	 */
+	private static final String getDefaultEncoding() {
+		// TODO: Change to "Charset.defaultCharset().name()" when 1.4 support
+		// is no longer needed.
+		// NOTE:  The "file.encoding" property is not guaranteed to be set by
+		// the spec, so we cannot rely on it.
+		String encoding = System.getProperty("file.encoding");
+		if (encoding==null) {
+			try {
+				File f = File.createTempFile("rsta", null);
+				FileWriter w = new FileWriter(f);
+				encoding = w.getEncoding();
+				w.close();
+				f.deleteOnExit();//delete();  Keep FindBugs happy
+			} catch (IOException ioe) {
+				encoding = "US-ASCII";
+			}
+		}
+		return encoding;
+	}
+
+
+	/**
+	 * Returns the encoding to use when reading or writing this file.
+	 *
+	 * @return The encoding.
+	 * @see #setEncoding(String)
+	 */
+	public String getEncoding() {
+		return charSet;
+	}
+
+
+	/**
+	 * Returns the full path to this document.
+	 *
+	 * @return The full path to the document.
+	 */
+	public String getFileFullPath() {
+		return loc==null ? null : loc.getFileFullPath();
+	}
+
+
+	/**
+	 * Returns the file name of this document.
+	 *
+	 * @return The file name.
+	 */
+	public String getFileName() {
+		return loc.getFileName();
+	}
+
+
+	/**
+	 * Returns the timestamp for when this file was last loaded or saved
+	 * <em>by this editor pane</em>.  If the file has been modified on disk by
+	 * another process after it was loaded into this editor pane, this method
+	 * will not return the actual file's last modified time.<p>
+	 *
+	 * For remote files, this method will always return
+	 * {@link #LAST_MODIFIED_UNKNOWN}.
+	 *
+	 * @return The timestamp when this file was last loaded or saved by this
+	 *         editor pane, if it is a local file, or
+	 *         {@link #LAST_MODIFIED_UNKNOWN} if it is a remote file.
+	 * @see #isModifiedOutsideEditor()
+	 */
+	public long getLastSaveOrLoadTime() {
+		return lastSaveOrLoadTime;
+	}
+
+
+	/**
+	 * Returns the line separator used when writing this file (e.g.
+	 * "<code>\n</code>", "<code>\r\n</code>", or "<code>\r</code>").<p>
+	 * 
+	 * Note that this value is an <code>Object</code> and not a
+	 * <code>String</code> as that is the way the {@link Document} interface
+	 * defines its property values.  If you always use
+	 * {@link #setLineSeparator(String)} to modify this value, then the value
+	 * returned from this method will always be a <code>String</code>.
+	 *
+	 * @return The line separator.  If this value is <code>null</code>, then
+	 *         the system default line separator is used (usually the value
+	 *         of <code>System.getProperty("line.separator")</code>).
+	 * @see #setLineSeparator(String)
+	 * @see #setLineSeparator(String, boolean)
+	 */
+	public Object getLineSeparator() {
+		return getDocument().getProperty(
+							RTextAreaEditorKit.EndOfLineStringProperty);
+	}
+
+
+	/**
+	 * Initializes this editor with the specified file location.
+	 *
+	 * @param loc The file location.  If this is <code>null</code>, a default
+	 *        location is used and an empty file is displayed.
+	 * @param defaultEnc The default encoding to use when opening the file,
+	 *        if the file is not Unicode.  If this value is <code>null</code>,
+	 *        a system default value is used.
+	 * @throws IOException If an IO error occurs reading from <code>loc</code>.
+	 *         If <code>loc</code> is <code>null</code>, this cannot happen.
+	 */
+	private void init(FileLocation loc, String defaultEnc) throws IOException {
+
+		if (loc==null) {
+			// Don't call load() just in case Untitled.txt actually exists,
+			// just to ensure there is no chance of an IOException being thrown
+			// in the default case.
+			this.loc = FileLocation.create(DEFAULT_FILE_NAME);
+			charSet = defaultEnc==null ? getDefaultEncoding() : defaultEnc;
+			// Ensure that line separator always has a value, even if the file
+			// does not exist (or is the "default" file).  This makes life
+			// easier for host applications that want to display this value.
+			setLineSeparator(System.getProperty("line.separator"));
+		}
+		else {
+			load(loc, defaultEnc); // Sets this.loc
+		}
+
+		if (this.loc.isLocalAndExists()) {
+			File file = new File(this.loc.getFileFullPath());
+			lastSaveOrLoadTime = file.lastModified();
+			setReadOnly(!file.canWrite());
+		}
+		else {
+			lastSaveOrLoadTime = LAST_MODIFIED_UNKNOWN;
+			setReadOnly(false);
+		}
+
+		setDirty(false);
+
+	}
+
+
+	/**
+	 * Callback for when text is inserted into the document.
+	 *
+	 * @param e Information on the insertion.
+	 */
+	public void insertUpdate(DocumentEvent e) {
+		if (!dirty) {
+			setDirty(true);
+		}
+	}
+
+
+	/**
+	 * Returns whether or not the text in this editor has unsaved changes.
+	 *
+	 * @return Whether or not the text has unsaved changes.
+	 * @see #setDirty(boolean)
+	 */
+	public boolean isDirty() {
+		return dirty;
+	}
+
+
+	/**
+	 * Returns whether this file is a local file.
+	 *
+	 * @return Whether this is a local file.
+	 */
+	public boolean isLocal() {
+		return loc.isLocal();
+	}
+
+
+	/**
+	 * Returns whether this is a local file that already exists.
+	 *
+	 * @return Whether this is a local file that already exists.
+	 */
+	public boolean isLocalAndExists() {
+		return loc.isLocalAndExists();
+	}
+
+
+	/**
+	 * Returns whether the text file has been modified outside of this editor
+	 * since the last load or save operation.  Note that if this is a remote
+	 * file, this method will always return <code>false</code>.<p>
+	 *
+	 * This method may be used by applications to implement a reloading
+	 * feature, where the user is prompted to reload a file if it has been
+	 * modified since their last open or save.
+	 *
+	 * @return Whether the text file has been modified outside of this
+	 *         editor.
+	 * @see #getLastSaveOrLoadTime()
+	 */
+	public boolean isModifiedOutsideEditor() {
+		return loc.getActualLastModified()>getLastSaveOrLoadTime();
+	}
+
+
+	/**
+	 * Returns whether or not the text area should be treated as read-only.
+	 *
+	 * @return Whether or not the text area should be treated as read-only.
+	 * @see #setReadOnly(boolean)
+	 */
+	public boolean isReadOnly() {
+		return readOnly;
+	}
+
+
+	/**
+	 * Loads the specified file in this editor.  This method fires a property
+	 * change event of type {@link #FULL_PATH_PROPERTY}.
+	 *
+	 * @param loc The location of the file to load.  This cannot be
+	 *        <code>null</code>.
+	 * @param defaultEnc The encoding to use when loading/saving the file.
+	 *        This encoding will only be used if the file is not Unicode.
+	 *        If this value is <code>null</code>, the system default encoding
+	 *        is used.
+	 * @throws IOException If an IO error occurs.
+	 * @see #save()
+	 * @see #saveAs(FileLocation)
+	 */
+	public void load(FileLocation loc, String defaultEnc) throws IOException {
+
+		// For new local files, just go with it.
+		if (loc.isLocal() && !loc.isLocalAndExists()) {
+			this.charSet = defaultEnc!=null ? defaultEnc : getDefaultEncoding();
+			this.loc = loc;
+			setText(null);
+			discardAllEdits();
+			setDirty(false);
+			return;
+		}
+
+		// Old local files and remote files, load 'em up.  UnicodeReader will
+		// check for BOMs and handle them correctly in all cases, then pass
+		// rest of stream down to InputStreamReader.
+		UnicodeReader ur = new UnicodeReader(loc.getInputStream(), defaultEnc);
+
+		// Remove listener so dirty flag doesn't get set when loading a file.
+		Document doc = getDocument();
+		doc.removeDocumentListener(this);
+		BufferedReader r = new BufferedReader(ur);
+		try {
+			read(r, null);
+		} finally {
+			doc.addDocumentListener(this);
+			r.close();
+		}
+
+		// No IOException thrown, so we can finally change the location.
+		charSet = ur.getEncoding();
+		String old = getFileFullPath();
+		this.loc = loc;
+		setDirty(false);
+		setCaretPosition(0);
+		firePropertyChange(FULL_PATH_PROPERTY, old, getFileFullPath());
+
+	}
+
+
+	/**
+	 * Reloads this file from disk.  The file must exist for this operation
+	 * to not throw an exception.<p>
+	 * 
+	 * The file's "dirty" state will be set to <code>false</code> after this
+	 * operation.  If this is a local file, its "last modified" time is
+	 * updated to reflect that of the actual file.<p>
+	 *
+	 * Note that if the file has been modified on disk, and is now a Unicode
+	 * encoding when before it wasn't (or if it is a different Unicode now),
+	 * this will cause this {@link TextEditorPane}'s encoding to change.
+	 * Otherwise, the file's encoding will stay the same.
+	 *
+	 * @throws IOException If the file does not exist, or if an IO error
+	 *         occurs reading the file.
+	 * @see #isLocalAndExists()
+	 */
+	public void reload() throws IOException {
+		String oldEncoding = getEncoding();
+		UnicodeReader ur = new UnicodeReader(loc.getInputStream(), oldEncoding);
+		String encoding = ur.getEncoding();
+		BufferedReader r = new BufferedReader(ur);
+		try {
+			read(r, null); // Dumps old contents.
+		} finally {
+			r.close();
+		}
+		setEncoding(encoding);
+		setDirty(false);
+		syncLastSaveOrLoadTimeToActualFile();
+		discardAllEdits(); // Prevent user from being able to undo the reload
+	}
+
+
+	/**
+	 * Called whenever text is removed from this editor.
+	 *
+	 * @param e The document event.
+	 */
+	public void removeUpdate(DocumentEvent e) {
+		if (!dirty) {
+			setDirty(true);
+		}
+	}
+
+
+	/**
+	 * Saves the file in its current encoding.<p>
+	 *
+	 * The text area's "dirty" state is set to <code>false</code>, and if
+	 * this is a local file, its "last modified" time is updated.
+	 *
+	 * @throws IOException If an IO error occurs.
+	 * @see #saveAs(FileLocation)
+	 * @see #load(FileLocation, String)
+	 */
+	public void save() throws IOException {
+		saveImpl(loc);
+		setDirty(false);
+		syncLastSaveOrLoadTimeToActualFile();
+	}
+
+
+	/**
+	 * Saves this file in a new local location.  This method fires a property
+	 * change event of type {@link #FULL_PATH_PROPERTY}.
+	 *
+	 * @param loc The location to save to.
+	 * @throws IOException If an IO error occurs.
+	 * @see #save()
+	 * @see #load(FileLocation, String)
+	 */
+	public void saveAs(FileLocation loc) throws IOException {
+		saveImpl(loc);
+		// No exception thrown - we can "rename" the file.
+		String old = getFileFullPath();
+		this.loc = loc;
+		setDirty(false);
+		lastSaveOrLoadTime = loc.getActualLastModified();
+		firePropertyChange(FULL_PATH_PROPERTY, old, getFileFullPath());
+	}
+
+
+	/**
+	 * Saves the text in this editor to the specified location.
+	 *
+	 * @param loc The location to save to.
+	 * @throws IOException If an IO error occurs.
+	 */
+	private void saveImpl(FileLocation loc) throws IOException {
+		OutputStream out = loc.getOutputStream();
+		BufferedWriter w = new BufferedWriter(
+				new UnicodeWriter(out, getEncoding()));
+		try {
+			write(w);
+		} finally {
+			w.close();
+		}
+	}
+
+
+	/**
+	 * Sets whether or not this text in this editor has unsaved changes.
+	 * This fires a property change event of type {@link #DIRTY_PROPERTY}.<p>
+	 *
+	 * Applications will usually have no need to call this method directly; the
+	 * only time you might have a need to call this method directly is if you
+	 * have to initialize an instance of TextEditorPane with content that does
+	 * not come from a file. <code>TextEditorPane</code> automatically sets its
+	 * own dirty flag when its content is edited, when its encoding is changed,
+	 * or when its line ending property is changed.  It is cleared whenever
+	 * <code>load()</code>, <code>reload()</code>, <code>save()</code>, or
+	 * <code>saveAs()</code> are called.
+	 *
+	 * @param dirty Whether or not the text has been modified.
+	 * @see #isDirty()
+	 */
+	public void setDirty(boolean dirty) {
+		if (this.dirty!=dirty) {
+			this.dirty = dirty;
+			firePropertyChange(DIRTY_PROPERTY, !dirty, dirty);
+		}
+	}
+
+
+	/**
+	 * Sets the document for this editor.
+	 *
+	 * @param doc The new document.
+	 */
+	public void setDocument(Document doc) {
+		Document old = getDocument();
+		if (old!=null) {
+			old.removeDocumentListener(this);
+		}
+		super.setDocument(doc);
+		doc.addDocumentListener(this);
+	}
+
+
+	/**
+	 * Sets the encoding to use when reading or writing this file.  This
+	 * method sets the editor's dirty flag when the encoding is changed.
+	 *
+	 * @param encoding The new encoding.
+	 * @throws UnsupportedCharsetException If the encoding is not supported.
+	 * @throws NullPointerException If <code>encoding</code> is
+	 *         <code>null</code>.
+	 * @see #getEncoding()
+	 */
+	public void setEncoding(String encoding) {
+		if (encoding==null) {
+			throw new NullPointerException("encoding cannot be null");
+		}
+		else if (!Charset.isSupported(encoding)) {
+			throw new UnsupportedCharsetException(encoding);
+		}
+		if (charSet==null || !charSet.equals(encoding)) {
+			charSet = encoding;
+			setDirty(true);
+		}
+	}
+
+
+	/**
+	 * Sets the line separator sequence to use when this file is saved (e.g.
+	 * "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>").
+	 *
+	 * Besides parameter checking, this method is preferred over
+	 * <code>getDocument().putProperty()</code> because it sets the editor's
+	 * dirty flag when the line separator is changed.
+	 *
+	 * @param separator The new line separator.
+	 * @throws NullPointerException If <code>separator</code> is
+	 *         <code>null</code>.
+	 * @throws IllegalArgumentException If <code>separator</code> is not one
+	 *         of "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>".
+	 * @see #getLineSeparator()
+	 */
+	public void setLineSeparator(String separator) {
+		setLineSeparator(separator, true);
+	}
+
+
+	/**
+	 * Sets the line separator sequence to use when this file is saved (e.g.
+	 * "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>").
+	 *
+	 * Besides parameter checking, this method is preferred over
+	 * <code>getDocument().putProperty()</code> because can set the editor's
+	 * dirty flag when the line separator is changed.
+	 *
+	 * @param separator The new line separator.
+	 * @param setDirty Whether the dirty flag should be set if the line
+	 *        separator is changed.
+	 * @throws NullPointerException If <code>separator</code> is
+	 *         <code>null</code>.
+	 * @throws IllegalArgumentException If <code>separator</code> is not one
+	 *         of "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>".
+	 * @see #getLineSeparator()
+	 */
+	public void setLineSeparator(String separator, boolean setDirty) {
+		if (separator==null) {
+			throw new NullPointerException("terminator cannot be null");
+		}
+		if (!"\r\n".equals(separator) && !"\n".equals(separator) &&
+				!"\r".equals(separator)) {
+			throw new IllegalArgumentException("Invalid line terminator");
+		}
+		Document doc = getDocument();
+		Object old = doc.getProperty(
+						RTextAreaEditorKit.EndOfLineStringProperty);
+		if (!separator.equals(old)) {
+			doc.putProperty(RTextAreaEditorKit.EndOfLineStringProperty,
+							separator);
+			if (setDirty) {
+				setDirty(true);
+			}
+		}
+	}
+
+
+	/**
+	 * Sets whether or not this text area should be treated as read-only.
+	 * This fires a property change event of type {@link #READ_ONLY_PROPERTY}.
+	 *
+	 * @param readOnly Whether or not the document is read-only.
+	 * @see #isReadOnly()
+	 */
+	public void setReadOnly(boolean readOnly) {
+		if (this.readOnly!=readOnly) {
+			this.readOnly = readOnly;
+			firePropertyChange(READ_ONLY_PROPERTY, !readOnly, readOnly);
+		}
+	}
+
+
+	/**
+	 * Syncs this text area's "last saved or loaded" time to that of the file
+	 * being edited, if that file is local and exists.  If the file is
+	 * remote or is local but does not yet exist, nothing happens.<p>
+	 *
+	 * You normally do not have to call this method, as the "last saved or
+	 * loaded" time for {@link TextEditorPane}s is kept up-to-date internally
+	 * during such operations as {@link #save()}, {@link #reload()}, etc.
+	 *
+	 * @see #getLastSaveOrLoadTime()
+	 * @see #isModifiedOutsideEditor()
+	 */
+	public void syncLastSaveOrLoadTimeToActualFile() {
+		if (loc.isLocalAndExists()) {
+			lastSaveOrLoadTime = loc.getActualLastModified();
+		}
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/Theme.java b/src/org/fife/ui/rsyntaxtextarea/Theme.java
new file mode 100644
index 0000000..f3e14b2
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/Theme.java
@@ -0,0 +1,842 @@
+/*
+ * 10/30/2011
+ *
+ * Theme.java - A color theme for RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.SystemColor;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.lang.reflect.Field;
+
+import javax.swing.UIManager;
+import javax.swing.plaf.ColorUIResource;
+import javax.swing.text.StyleContext;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+
+import org.fife.io.UnicodeWriter;
+import org.fife.ui.rtextarea.Gutter;
+import org.fife.ui.rtextarea.RTextArea;
+
+
+/**
+ * A theme is a set of fonts and colors to use to style RSyntaxTextArea.
+ * Themes are defined in XML files that are validated against
+ * <code>themes.dtd</code>.  This provides applications and other consumers
+ * with an easy way to style RSyntaxTextArea without having to use the API.<p>
+ * 
+ * Sample themes are included in the source tree under the <code>/themes</code>
+ * folder, but are not a part of the built RSyntaxTextArea jar.  Hosting
+ * applications are free to ship and use these themes as-is, modify them, or
+ * create their own.<p>
+ *
+ * Note that to save a <code>Theme</code> via {@link #save(OutputStream)},
+ * you must currently create a <code>Theme</code> from a text area wrapped in
+ * an <code>RTextScrollPane</code>, so that the color information for the
+ * gutter can be retrieved.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class Theme {
+
+	private Font baseFont;
+	private Color bgColor;
+	private Color caretColor;
+	private boolean useSelctionFG;
+	private Color selectionFG;
+	private Color selectionBG;
+	private boolean selectionRoundedEdges;
+	private Color currentLineHighlight;
+	private boolean fadeCurrentLineHighlight;
+	private Color marginLineColor;
+	private Color markAllHighlightColor;
+	private Color markOccurrencesColor;
+	private boolean markOccurrencesBorder;
+	private Color matchedBracketFG;
+	private Color matchedBracketBG;
+	private boolean matchedBracketHighlightBoth;
+	private boolean matchedBracketAnimate;
+	private Color hyperlinkFG;
+	private Color[] secondaryLanguages;
+
+	private SyntaxScheme scheme;
+
+	private Color gutterBorderColor;
+	private Color lineNumberColor;
+	private String lineNumberFont;
+	private int lineNumberFontSize;
+	private Color foldIndicatorFG;
+	private Color foldBG;
+
+
+	/**
+	 * Private constructor, used when loading from a stream.
+	 *
+	 * @param baseFont The default font to use for any "base font" properties
+	 *        not specified in the theme XML.  If this is <code>null</code>,
+	 *        a default monospaced font will be used.
+	 */
+	private Theme(Font baseFont) {
+		this.baseFont = baseFont!=null ? baseFont : RTextArea.getDefaultFont();
+		secondaryLanguages = new Color[3];
+	}
+
+
+	/**
+	 * Creates a theme from an RSyntaxTextArea.  It should be contained in
+	 * an <code>RTextScrollPane</code> to get all gutter color information.
+	 *
+	 * @param textArea The text area.
+	 */
+	public Theme(RSyntaxTextArea textArea) {
+
+		baseFont = textArea.getFont();
+		bgColor = textArea.getBackground();
+		caretColor = textArea.getCaretColor();
+		useSelctionFG = textArea.getUseSelectedTextColor();
+		selectionFG = textArea.getSelectedTextColor();
+		selectionBG = textArea.getSelectionColor();
+		selectionRoundedEdges = textArea.getRoundedSelectionEdges();
+		currentLineHighlight = textArea.getCurrentLineHighlightColor();
+		fadeCurrentLineHighlight = textArea.getFadeCurrentLineHighlight();
+		marginLineColor = textArea.getMarginLineColor();
+		markAllHighlightColor = textArea.getMarkAllHighlightColor();
+		markOccurrencesColor = textArea.getMarkOccurrencesColor();
+		markOccurrencesBorder = textArea.getPaintMarkOccurrencesBorder();
+		matchedBracketBG = textArea.getMatchedBracketBGColor();
+		matchedBracketFG = textArea.getMatchedBracketBorderColor();
+		matchedBracketHighlightBoth = textArea.getPaintMatchedBracketPair();
+		matchedBracketAnimate = textArea.getAnimateBracketMatching();
+		hyperlinkFG = textArea.getHyperlinkForeground();
+
+		int count = textArea.getSecondaryLanguageCount();
+		secondaryLanguages = new Color[count];
+		for (int i=0; i<count; i++) {
+			secondaryLanguages[i]= textArea.getSecondaryLanguageBackground(i+1);
+		}
+
+		scheme = textArea.getSyntaxScheme();
+
+		Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+		if (gutter!=null) {
+			bgColor = gutter.getBackground();
+			gutterBorderColor = gutter.getBorderColor();
+			lineNumberColor = gutter.getLineNumberColor();
+			lineNumberFont = gutter.getLineNumberFont().getFamily();
+			lineNumberFontSize = gutter.getLineNumberFont().getSize();
+			foldIndicatorFG = gutter.getFoldIndicatorForeground();
+			foldBG = gutter.getFoldBackground();
+		}
+
+	}
+
+
+	/**
+	 * Applies this theme to a text area.
+	 *
+	 * @param textArea The text area to apply this theme to.
+	 */
+	public void apply(RSyntaxTextArea textArea) {
+
+		textArea.setFont(baseFont);
+		textArea.setBackground(bgColor);
+		textArea.setCaretColor(caretColor);
+		textArea.setUseSelectedTextColor(useSelctionFG);
+		textArea.setSelectedTextColor(selectionFG);
+		textArea.setSelectionColor(selectionBG);
+		textArea.setRoundedSelectionEdges(selectionRoundedEdges);
+		textArea.setCurrentLineHighlightColor(currentLineHighlight);
+		textArea.setFadeCurrentLineHighlight(fadeCurrentLineHighlight);
+		textArea.setMarginLineColor(marginLineColor);
+		textArea.setMarkAllHighlightColor(markAllHighlightColor);
+		textArea.setMarkOccurrencesColor(markOccurrencesColor);
+		textArea.setPaintMarkOccurrencesBorder(markOccurrencesBorder);
+		textArea.setMatchedBracketBGColor(matchedBracketBG);
+		textArea.setMatchedBracketBorderColor(matchedBracketFG);
+		textArea.setPaintMatchedBracketPair(matchedBracketHighlightBoth);
+		textArea.setAnimateBracketMatching(matchedBracketAnimate);
+		textArea.setHyperlinkForeground(hyperlinkFG);
+
+		int count = secondaryLanguages.length;
+		for (int i=0; i<count; i++) {
+			textArea.setSecondaryLanguageBackground(i+1, secondaryLanguages[i]);
+		}
+
+		textArea.setSyntaxScheme(scheme);
+
+		Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+		if (gutter!=null) {
+			gutter.setBackground(bgColor);
+			gutter.setBorderColor(gutterBorderColor);
+			gutter.setLineNumberColor(lineNumberColor);
+			String fontName = lineNumberFont!=null ? lineNumberFont :
+				baseFont.getFamily();
+			int fontSize = lineNumberFontSize>0 ? lineNumberFontSize :
+				baseFont.getSize();
+			Font font = getFont(fontName, Font.PLAIN, fontSize);
+			gutter.setLineNumberFont(font);
+			gutter.setFoldIndicatorForeground(foldIndicatorFG);
+			gutter.setFoldBackground(foldBG);
+		}
+
+	}
+
+
+	private static final String colorToString(Color c) {
+		int color = c.getRGB() & 0xffffff;
+		String str = Integer.toHexString(color);
+		while (str.length()<6) {
+			str = "0" + str;
+		}
+		return str;
+	}
+
+
+	/**
+	 * Returns the default selection background color to use if "default" is
+	 * specified in a theme.
+	 *
+	 * @return The default selection background to use.
+	 * @see #getDefaultSelectionFG()
+	 */
+	private static final Color getDefaultBG() {
+		Color c = UIManager.getColor("nimbusLightBackground");
+		if (c==null) {
+			// Don't search for "text", as Nimbus defines that as the text
+			// component "text" color, but Basic LAFs use it for text
+			// component backgrounds!  Nimbus also defines TextArea.background
+			// as too dark, not what it actually uses for text area backgrounds
+			c = UIManager.getColor("TextArea.background");
+			if (c==null) {
+				c = new ColorUIResource(SystemColor.text);
+			}
+		}
+		return c;
+	}
+
+
+	/**
+	 * Returns the default selection background color to use if "default" is
+	 * specified in a theme.
+	 *
+	 * @return The default selection background to use.
+	 * @see #getDefaultSelectionFG()
+	 */
+	private static final Color getDefaultSelectionBG() {
+		Color c = UIManager.getColor("TextArea.selectionBackground");
+		if (c==null) {
+			c = UIManager.getColor("textHighlight");
+			if (c==null) {
+				c = UIManager.getColor("nimbusSelectionBackground");
+				if (c==null) {
+					c = new ColorUIResource(SystemColor.textHighlight);
+				}
+			}
+		}
+		return c;
+	}
+
+
+	/**
+	 * Returns the default "selected text" color to use if "default" is
+	 * specified in a theme.
+	 *
+	 * @return The default selection foreground color to use.
+	 * @see #getDefaultSelectionBG()
+	 */
+	private static Color getDefaultSelectionFG() {
+		Color c = UIManager.getColor("TextArea.selectionForeground");
+		if (c==null) {
+			c = UIManager.getColor("textHighlightText");
+			if (c==null) {
+				c = UIManager.getColor("nimbusSelectedText");
+				if (c==null) {
+					c = new ColorUIResource(SystemColor.textHighlightText);
+				}
+			}
+		}
+		return c;
+	}
+
+
+	/**
+	 * Returns the specified font.
+	 *
+	 * @param family The font family.
+	 * @param style The style of font.
+	 * @param size The size of the font.
+	 * @return The font.
+	 */
+	private static Font getFont(String family, int style, int size) {
+		// Use StyleContext to get a composite font for Asian glyphs.
+		StyleContext sc = StyleContext.getDefaultStyleContext();
+		return sc.getFont(family, style, size);
+	}
+
+
+	/**
+	 * Loads a theme.
+	 *
+	 * @param in The input stream to read from.  This will be closed when this
+	 *        method returns.
+	 * @return The theme.
+	 * @throws IOException If an IO error occurs.
+	 * @see #save(OutputStream)
+	 */
+	public static Theme load(InputStream in) throws IOException {
+		return load(in, null);
+	}
+
+
+	/**
+	 * Loads a theme.
+	 *
+	 * @param in The input stream to read from.  This will be closed when this
+	 *        method returns.
+	 * @param baseFont The default font to use for any "base font" properties
+	 *        not specified in the theme XML.  If this is <code>null</code>,
+	 *        a default monospaced font will be used.
+	 * @return The theme.
+	 * @throws IOException If an IO error occurs.
+	 * @see #save(OutputStream)
+	 */
+	public static Theme load(InputStream in, Font baseFont) throws IOException {
+
+		Theme theme = new Theme(baseFont);
+
+		BufferedInputStream bin = new BufferedInputStream(in);
+		try {
+			XmlHandler.load(theme, bin);
+		} finally {
+			bin.close();
+		}
+
+		return theme;
+
+	}
+
+
+	/**
+	 * Saves this theme to an output stream.
+	 *
+	 * @param out The output stream to write to.
+	 * @throws IOException If an IO error occurs.
+	 * @see #load(InputStream)
+	 */
+	public void save(OutputStream out) throws IOException {
+
+		BufferedOutputStream bout = new BufferedOutputStream(out);
+		try {
+
+			DocumentBuilder db = DocumentBuilderFactory.newInstance().
+					newDocumentBuilder();
+			DOMImplementation impl = db.getDOMImplementation();
+
+			Document doc = impl.createDocument(null, "RSyntaxTheme", null);
+			Element root = doc.getDocumentElement();
+			root.setAttribute("version", "1.0");
+
+			Element elem = doc.createElement("baseFont");
+			if (!baseFont.getFamily().equals(
+					RSyntaxTextArea.getDefaultFont().getFamily())) {
+				elem.setAttribute("family", baseFont.getFamily());
+			}
+			elem.setAttribute("size", Integer.toString(baseFont.getSize()));
+			root.appendChild(elem);
+
+			elem = doc.createElement("background");
+			elem.setAttribute("color", colorToString(bgColor));
+			root.appendChild(elem);
+
+			elem = doc.createElement("caret");
+			elem.setAttribute("color", colorToString(caretColor));
+			root.appendChild(elem);
+
+			elem = doc.createElement("selection");
+			elem.setAttribute("useFG", Boolean.toString(useSelctionFG));
+			elem.setAttribute("fg", colorToString(selectionFG));
+			elem.setAttribute("bg", colorToString(selectionBG));
+			elem.setAttribute("roundedEdges", Boolean.toString(selectionRoundedEdges));
+			root.appendChild(elem);
+
+			elem = doc.createElement("currentLineHighlight");
+			elem.setAttribute("color", colorToString(currentLineHighlight));
+			elem.setAttribute("fade", Boolean.toString(fadeCurrentLineHighlight));
+			root.appendChild(elem);
+
+			elem = doc.createElement("marginLine");
+			elem.setAttribute("fg", colorToString(marginLineColor));
+			root.appendChild(elem);
+
+			elem = doc.createElement("markAllHighlight");
+			elem.setAttribute("color", colorToString(markAllHighlightColor));
+			root.appendChild(elem);
+
+			elem = doc.createElement("markOccurrencesHighlight");
+			elem.setAttribute("color", colorToString(markOccurrencesColor));
+			elem.setAttribute("border", Boolean.toString(markOccurrencesBorder));
+			root.appendChild(elem);
+
+			elem = doc.createElement("matchedBracket");
+			elem.setAttribute("fg", colorToString(matchedBracketFG));
+			elem.setAttribute("bg", colorToString(matchedBracketBG));
+			elem.setAttribute("highlightBoth", Boolean.toString(matchedBracketHighlightBoth));
+			elem.setAttribute("animate", Boolean.toString(matchedBracketAnimate));
+			root.appendChild(elem);
+
+			elem = doc.createElement("hyperlinks");
+			elem.setAttribute("fg", colorToString(hyperlinkFG));
+			root.appendChild(elem);
+
+			elem = doc.createElement("secondaryLanguages");
+			for (int i=0; i<secondaryLanguages.length; i++) {
+				Color color = secondaryLanguages[i];
+				Element elem2 = doc.createElement("language");
+				elem2.setAttribute("index", Integer.toString(i+1));
+				elem2.setAttribute("bg", color==null ? "":colorToString(color));
+			}
+
+			elem = doc.createElement("gutterBorder");
+			elem.setAttribute("color", colorToString(gutterBorderColor));
+			root.appendChild(elem);
+
+			elem = doc.createElement("lineNumbers");
+			elem.setAttribute("fg", colorToString(lineNumberColor));
+			if (lineNumberFont!=null) {
+				elem.setAttribute("lineNumberFont", lineNumberFont);
+			}
+			if (lineNumberFontSize>0) {
+				elem.setAttribute("lineNumberFontSize",
+						Integer.toString(lineNumberFontSize));
+			}
+			root.appendChild(elem);
+
+			elem = doc.createElement("foldIndicator");
+			elem.setAttribute("fg", colorToString(foldIndicatorFG));
+			elem.setAttribute("iconBg", colorToString(foldBG));
+			root.appendChild(elem);
+
+			elem = doc.createElement("tokenStyles");
+			Field[] fields = TokenTypes.class.getFields();
+			for (int i=0; i<fields.length; i++) {
+				Field field = fields[i];
+				int value = field.getInt(null);
+				if (value!=TokenTypes.NUM_TOKEN_TYPES) {
+					Style style = scheme.getStyle(value);
+					if (style!=null) {
+						Element elem2 = doc.createElement("style");
+						elem2.setAttribute("token", field.getName());
+						Color fg = style.foreground;
+						if (fg!=null) {
+							elem2.setAttribute("fg", colorToString(fg));
+						}
+						Color bg = style.background;
+						if (bg!=null) {
+							elem2.setAttribute("bg", colorToString(bg));
+						}
+						Font font = style.font;
+						if (font!=null) {
+							if (!font.getFamily().equals(
+									baseFont.getFamily())) {
+								elem2.setAttribute("fontFamily", font.getFamily());
+							}
+							if (font.getSize()!=baseFont.getSize()) {
+								elem2.setAttribute("fontSize", Integer.toString(font.getSize()));
+							}
+							if (font.isBold()) {
+								elem2.setAttribute("bold", "true");
+							}
+							if (font.isItalic()) {
+								elem2.setAttribute("italic", "true");
+							}
+						}
+						if (style.underline) {
+							elem2.setAttribute("underline", "true");
+						}
+						elem.appendChild(elem2);
+					}
+				}
+			}
+			root.appendChild(elem);
+
+			DOMSource source = new DOMSource(doc);
+			// Use a writer instead of OutputStream to allow pretty printing.
+			// See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6337981
+			StreamResult result = new StreamResult(new PrintWriter(
+					new UnicodeWriter(bout, "UTF-8")));
+			TransformerFactory transFac = TransformerFactory.newInstance();
+			Transformer transformer = transFac.newTransformer();
+			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+			transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
+			transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+			transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "theme.dtd");
+			transformer.transform(source, result);
+
+		} catch (RuntimeException re) {
+			throw re; // FindBugs
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new IOException("Error generating XML: " + e.getMessage());
+			// When Java 6 is minimum required version
+			//throw new IOException("Error generating XML: " + e.getMessage(), e);
+		} finally {
+			bout.close();
+		}
+
+	}
+
+
+	/**
+	 * Returns the color represented by a string.  The input is expected to
+	 * be a 6-digit hex string, optionally prefixed by a '$'.  For example,
+	 * either of the following:
+	 * <pre>
+	 * "$00ff00"
+	 * "00ff00"
+	 * </pre>
+	 * will return <code>new Color(0, 255, 0)</code>.
+	 *
+	 * @param s The string to evaluate.
+	 * @return The color.
+	 */
+	private static final Color stringToColor(String s) {
+		return stringToColor(s, null);
+	}
+
+
+	/**
+	 * Returns the color represented by a string.  The input is expected to
+	 * be a 6-digit hex string, optionally prefixed by a '$'.  For example,
+	 * either of the following:
+	 * <pre>
+	 * "$00ff00"
+	 * "00ff00"
+	 * </pre>
+	 * will return <code>new Color(0, 255, 0)</code>.
+	 *
+	 * @param s The string to evaluate.
+	 * @param defaultVal The color to use if <code>s</code> is
+	 *        "<code>default</code>".
+	 * @return The color.
+	 */
+	private static final Color stringToColor(String s, Color defaultVal) {
+		if (s==null || "default".equalsIgnoreCase(s)) {
+			return defaultVal;
+		}
+		if (s.length()==6 || s.length()==7) {
+			if (s.charAt(0)=='$') {
+				s = s.substring(1);
+			}
+			return new Color(Integer.parseInt(s, 16));
+		}
+		return null;
+	}
+
+
+	/**
+	 * Loads a <code>SyntaxScheme</code> from an XML file.
+	 */
+	private static class XmlHandler extends DefaultHandler {
+
+		private Theme theme;
+
+		public void error(SAXParseException e) throws SAXException {
+			throw e;
+		}
+
+		public void fatalError(SAXParseException e) throws SAXException {
+			throw e;
+		}
+
+	    public static void load(Theme theme, InputStream in) throws IOException {
+			SAXParserFactory spf = SAXParserFactory.newInstance();
+			spf.setValidating(true);
+			try {
+				SAXParser parser = spf.newSAXParser();
+				XMLReader reader = parser.getXMLReader();
+				XmlHandler handler = new XmlHandler();
+				handler.theme = theme;
+				reader.setEntityResolver(handler);
+				reader.setContentHandler(handler);
+				reader.setDTDHandler(handler);
+				reader.setErrorHandler(handler);
+				InputSource is = new InputSource(in);
+				is.setEncoding("UTF-8");
+				reader.parse(is);
+			} catch (/*SAX|ParserConfiguration*/Exception se) {
+				se.printStackTrace();
+				throw new IOException(se.toString());
+			}
+		}
+
+		private static final int parseInt(Attributes attrs, String attr,
+				int def) {
+			int value = def;
+			String temp = attrs.getValue(attr);
+			if (temp != null) {
+				try {
+					value = Integer.parseInt(temp);
+				} catch (NumberFormatException nfe) {
+					nfe.printStackTrace();
+				}
+			}
+			return value;
+		}
+
+	    public InputSource resolveEntity(String publicID, 
+				String systemID) throws SAXException {
+			return new InputSource(getClass().
+					getResourceAsStream("/theme.dtd"));
+		}
+
+		public void startElement(String uri, String localName, String qName,
+								Attributes attrs) {
+
+			if ("background".equals(qName)) {
+
+				String color = attrs.getValue("color");
+				if (color!=null) {
+					theme.bgColor = stringToColor(color, getDefaultBG());
+				}
+				else {
+					String img = attrs.getValue("image");
+					if (img!=null) {
+						throw new IllegalArgumentException("Not yet implemented");
+					}
+				}
+			}
+
+			// The base font to use in the editor.
+			else if ("baseFont".equals(qName)) {
+				int size = theme.baseFont.getSize();
+				String sizeStr = attrs.getValue("size");
+				if (sizeStr!=null) {
+					size = Integer.parseInt(sizeStr);
+				}
+				String family = attrs.getValue("family");
+				if (family!=null) {
+					theme.baseFont = getFont(family, Font.PLAIN, size);
+				}
+				else if (sizeStr!=null) {
+					// No family specified, keep original family
+					theme.baseFont = theme.baseFont.deriveFont(size*1f);
+				}
+			}
+
+			else if ("caret".equals(qName)) {
+				String color = attrs.getValue("color");
+				theme.caretColor = stringToColor(color);
+			}
+
+			else if ("currentLineHighlight".equals(qName)) {
+				String color = attrs.getValue("color");
+				theme.currentLineHighlight = stringToColor(color);
+				String fadeStr = attrs.getValue("fade");
+				boolean fade = Boolean.valueOf(fadeStr).booleanValue();
+				theme.fadeCurrentLineHighlight = fade;
+			}
+
+			else if ("foldIndicator".equals(qName)) {
+				String color = attrs.getValue("fg");
+				theme.foldIndicatorFG = stringToColor(color);
+				color = attrs.getValue("iconBg");
+				theme.foldBG = stringToColor(color);
+			}
+
+			else if ("gutterBorder".equals(qName)) {
+				String color = attrs.getValue("color");
+				theme.gutterBorderColor = stringToColor(color);
+			}
+
+			else if ("lineNumbers".equals(qName)) {
+				String color = attrs.getValue("fg");
+				theme.lineNumberColor = stringToColor(color);
+				theme.lineNumberFont = attrs.getValue("fontFamily");
+				theme.lineNumberFontSize = parseInt(attrs, "fontSize", -1);
+			}
+
+			else if ("marginLine".equals(qName)) {
+				String color = attrs.getValue("fg");
+				theme.marginLineColor = stringToColor(color);
+			}
+
+			else if ("markAllHighlight".equals(qName)) {
+				String color = attrs.getValue("color");
+				theme.markAllHighlightColor = stringToColor(color);
+			}
+
+			else if ("markOccurrencesHighlight".equals(qName)) {
+				String color = attrs.getValue("color");
+				theme.markOccurrencesColor = stringToColor(color);
+				String border = attrs.getValue("border");
+				theme.markOccurrencesBorder = Boolean.valueOf(border).booleanValue();
+			}
+
+			else if ("matchedBracket".equals(qName)) {
+				String fg = attrs.getValue("fg");
+				theme.matchedBracketFG = stringToColor(fg);
+				String bg = attrs.getValue("bg");
+				theme.matchedBracketBG = stringToColor(bg);
+				String highlightBoth = attrs.getValue("highlightBoth");
+				theme.matchedBracketHighlightBoth = Boolean.valueOf(highlightBoth).booleanValue();
+				String animate = attrs.getValue("animate");
+				theme.matchedBracketAnimate = Boolean.valueOf(animate).booleanValue();
+			}
+
+			else if ("hyperlinks".equals(qName)) {
+				String fg = attrs.getValue("fg");
+				theme.hyperlinkFG = stringToColor(fg);
+			}
+
+			else if ("language".equals(qName)) {
+				String indexStr = attrs.getValue("index");
+				int index = Integer.parseInt(indexStr) - 1;
+				if (theme.secondaryLanguages.length>index) { // Sanity
+					Color bg = stringToColor(attrs.getValue("bg"));
+					theme.secondaryLanguages[index] = bg;
+				}
+			}
+
+			else if ("selection".equals(qName)) {
+				String useStr = attrs.getValue("useFG");
+				theme.useSelctionFG = Boolean.valueOf(useStr).booleanValue();
+				String color = attrs.getValue("fg");
+				theme.selectionFG = stringToColor(color,
+											getDefaultSelectionFG());
+				//System.out.println(theme.selectionFG);
+				color = attrs.getValue("bg");
+				theme.selectionBG = stringToColor(color,
+											getDefaultSelectionBG());
+				String roundedStr = attrs.getValue("roundedEdges");
+				theme.selectionRoundedEdges = Boolean.valueOf(roundedStr).
+											booleanValue();
+			}
+
+			// Start of the syntax scheme definition
+			else if ("tokenStyles".equals(qName)) {
+				theme.scheme = new SyntaxScheme(theme.baseFont, false);
+			}
+
+			// A style in the syntax scheme
+			else if ("style".equals(qName)) {
+
+				String type = attrs.getValue("token");
+				Field field = null;
+				try {
+					field = Token.class.getField(type);
+				} catch (RuntimeException re) {
+					throw re; // FindBugs
+				} catch (Exception e) {
+					System.err.println("Invalid token type: " + type);
+					return;
+				}
+
+				if (field.getType()==int.class) {
+
+					int index = 0;
+					try {
+						index = field.getInt(theme.scheme);
+					} catch (IllegalArgumentException e) {
+						e.printStackTrace();
+						return;
+					} catch (IllegalAccessException e) {
+						e.printStackTrace();
+						return;
+					}
+
+					String fgStr = attrs.getValue("fg");
+					Color fg = stringToColor(fgStr);
+					theme.scheme.getStyle(index).foreground = fg;
+
+					String bgStr = attrs.getValue("bg");
+					Color bg = stringToColor(bgStr);
+					theme.scheme.getStyle(index).background = bg;
+
+					Font font = theme.baseFont;
+					String familyName = attrs.getValue("fontFamily");
+					if (familyName!=null) {
+						font = getFont(familyName, font.getStyle(),
+								font.getSize());
+					}
+					String sizeStr = attrs.getValue("fontSize");
+					if (sizeStr!=null) {
+						try {
+							float size = Float.parseFloat(sizeStr);
+							size = Math.max(size, 1f);
+							font = font.deriveFont(size);
+						} catch (NumberFormatException nfe) {
+							nfe.printStackTrace();
+						}
+					}
+					theme.scheme.getStyle(index).font = font;
+
+					boolean styleSpecified = false;
+					boolean bold = false;
+					boolean italic = false;
+					String boldStr = attrs.getValue("bold");
+					if (boldStr!=null) {
+						bold = Boolean.valueOf(boldStr).booleanValue();
+						styleSpecified = true;
+					}
+					String italicStr = attrs.getValue("italic");
+					if (italicStr!=null) {
+						italic = Boolean.valueOf(italicStr).booleanValue();
+						styleSpecified = true;
+					}
+					if (styleSpecified) {
+						int style = 0;
+						if (bold) { style |= Font.BOLD; }
+						if (italic) { style |= Font.ITALIC; }
+						Font orig = theme.scheme.getStyle(index).font;
+						theme.scheme.getStyle(index).font =
+							orig.deriveFont(style);
+					}
+
+					String ulineStr = attrs.getValue("underline");
+					if (ulineStr!=null) {
+						boolean uline= Boolean.valueOf(ulineStr).booleanValue();
+						theme.scheme.getStyle(index).underline = uline;
+					}
+
+				}
+
+			}
+
+		}
+
+		public void warning(SAXParseException e) throws SAXException {
+			throw e;
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/Token.java b/src/org/fife/ui/rsyntaxtextarea/Token.java
new file mode 100644
index 0000000..9f026a5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/Token.java
@@ -0,0 +1,1090 @@
+/*
+ * 02/21/2004
+ *
+ * Token.java - A token used in syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Rectangle;
+import javax.swing.text.Segment;
+import javax.swing.text.TabExpander;
+import javax.swing.text.Utilities;
+
+
+/**
+ * A generic token that functions as a node in a linked list of syntax
+ * highlighted tokens for some language.<p>
+ *
+ * A <code>Token</code> is a piece of text representing some logical token in
+ * source code for a programming language.  For example, the line of C code:<p>
+ * <pre>
+ * int i = 0;
+ * </pre>
+ * would be broken into 8 <code>Token</code>s: the first representing
+ * <code>int</code>, the second whitespace, the third <code>i</code>, the fourth
+ * whitespace, the fifth <code>=</code>, etc.<p>
+ *
+ * @author Robert Futrell
+ * @version 0.3
+ */
+public class Token implements TokenTypes {
+
+	/**
+	 * The text this token represents.  This is implemented as a segment so we
+	 * can point directly to the text in the document without having to make a
+	 * copy of it.
+	 */
+	public char[] text;
+	public int textOffset;
+	public int textCount;
+	
+	/**
+	 * The offset into the document at which this token resides.
+	 */
+	public int offset;
+
+	/**
+	 * The type of token this is; for example, {@link #FUNCTION}.
+	 */
+	public int type;
+
+	/**
+	 * Whether this token is a hyperlink.
+	 */
+	private boolean hyperlink;
+
+	/**
+	 * The next token in this linked list.
+	 */
+	private Token nextToken;
+
+	/**
+	 * The language this token is in, <code>>= 0</code>.
+	 */
+	private int languageIndex;
+
+
+	/**
+	 * Creates a "null token."  The token itself is not null; rather, it
+	 * signifies that it is the last token in a linked list of tokens and
+	 * that it is not part of a "multi-line token."
+	 */
+	public Token() {
+		this.text = null;
+		this.textOffset = -1;
+		this.textCount = -1;
+		this.type = NULL;
+		offset = -1;
+		hyperlink = false;
+		nextToken = null;
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param line The segment from which to get the token.
+	 * @param beg The first character's position in <code>line</code>.
+	 * @param end The last character's position in <code>line</code>.
+	 * @param startOffset The offset into the document at which this
+	 *        token begins.
+	 * @param type A token type listed as "generic" above.
+	 */
+	public Token(Segment line, int beg, int end, int startOffset, int type) {
+		this(line.array, beg,end, startOffset, type);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param line The segment from which to get the token.
+	 * @param beg The first character's position in <code>line</code>.
+	 * @param end The last character's position in <code>line</code>.
+	 * @param startOffset The offset into the document at which this
+	 *        token begins.
+	 * @param type A token type listed as "generic" above.
+	 */
+	public Token(char[] line, int beg, int end, int startOffset, int type) {
+		this();
+		set(line, beg,end, startOffset, type);
+	}
+
+
+	/**
+	 * Creates this token as a copy of the passed-in token.
+	 *
+	 * @param t2 The token from which to make a copy.
+	 */
+	public Token(Token t2) {
+		this();
+		copyFrom(t2);
+	}
+
+
+	/**
+	 * Appends HTML code for painting this token, using the given text area's
+	 * color scheme.
+	 *
+	 * @param sb The buffer to append to.
+	 * @param textArea The text area whose color scheme to use.
+	 * @param fontFamily Whether to include the font family in the HTML for
+	 *        this token.  You can pass <code>false</code> for this parameter
+	 *        if, for example, you are making all your HTML be monospaced,
+	 *        and don't want any crazy fonts being used in the editor to be
+	 *        reflected in your HTML.
+	 * @return The buffer appended to.
+	 * @see #getHTMLRepresentation(RSyntaxTextArea)
+	 */
+	public StringBuffer appendHTMLRepresentation(StringBuffer sb,
+											RSyntaxTextArea textArea,
+											boolean fontFamily) {
+		return appendHTMLRepresentation(sb, textArea, fontFamily, false);
+	}
+
+
+	/**
+	 * Appends HTML code for painting this token, using the given text area's
+	 * color scheme.
+	 *
+	 * @param sb The buffer to append to.
+	 * @param textArea The text area whose color scheme to use.
+	 * @param fontFamily Whether to include the font family in the HTML for
+	 *        this token.  You can pass <code>false</code> for this parameter
+	 *        if, for example, you are making all your HTML be monospaced,
+	 *        and don't want any crazy fonts being used in the editor to be
+	 *        reflected in your HTML.
+	 * @param tabsToSpaces Whether to convert tabs into spaces.
+	 * @return The buffer appended to.
+	 * @see #getHTMLRepresentation(RSyntaxTextArea)
+	 */
+	public StringBuffer appendHTMLRepresentation(StringBuffer sb,
+								RSyntaxTextArea textArea, boolean fontFamily,
+								boolean tabsToSpaces) {
+
+		SyntaxScheme colorScheme = textArea.getSyntaxScheme();
+		Style scheme = colorScheme.getStyle(type);
+		Font font = textArea.getFontForTokenType(type);//scheme.font;
+
+		if (font.isBold()) sb.append("<b>");
+		if (font.isItalic()) sb.append("<em>");
+		if (scheme.underline || isHyperlink()) sb.append("<u>");
+
+		sb.append("<font");
+		if (fontFamily) {
+			sb.append(" face=\"").append(font.getFamily()).append("\"");
+		}
+		sb.append(" color=\"").
+			append(getHTMLFormatForColor(scheme.foreground)).
+			append("\">");
+
+		// NOTE: Don't use getLexeme().trim() because whitespace tokens will
+		// be turned into NOTHING.
+		appendHtmlLexeme(textArea, sb, tabsToSpaces);
+
+		sb.append("</font>");
+		if (scheme.underline || isHyperlink()) sb.append("</u>");
+		if (font.isItalic()) sb.append("</em>");
+		if (font.isBold()) sb.append("</b>");
+
+		return sb;
+
+	}
+
+
+	/**
+	 * Appends an HTML version of the lexeme of this token (i.e. no style
+	 * HTML, but replacing chars such as <code>\t</code>, <code><</code>
+	 * and <code>></code> with their escapes).
+	 *
+	 * @param textArea The text area.
+	 * @param sb The buffer to append to.
+	 * @param tabsToSpaces Whether to convert tabs into spaces.
+	 * @return The same buffer.
+	 */
+	private final StringBuffer appendHtmlLexeme(RSyntaxTextArea textArea,
+								StringBuffer sb, boolean tabsToSpaces) {
+
+		boolean lastWasSpace = false;
+		int i = textOffset;
+		int lastI = i;
+		String tabStr = null;
+
+		while (i<textOffset+textCount) {
+			char ch = text[i];
+			switch (ch) {
+				case ' ':
+					sb.append(text, lastI, i-lastI);
+					lastI = i+1;
+					sb.append(lastWasSpace ? " " : " ");
+					lastWasSpace = true;
+					break;
+				case '\t':
+					sb.append(text, lastI, i-lastI);
+					lastI = i+1;
+					if (tabsToSpaces && tabStr==null) {
+						tabStr = "";
+						for (int j=0; j<textArea.getTabSize(); j++) {
+							tabStr += " ";
+						}
+					}
+					sb.append(tabsToSpaces ? tabStr : "	");
+					lastWasSpace = false;
+					break;
+				case '<':
+					sb.append(text, lastI, i-lastI);
+					lastI = i+1;
+					sb.append("<");
+					lastWasSpace = false;
+					break;
+				case '>':
+					sb.append(text, lastI, i-lastI);
+					lastI = i+1;
+					sb.append(">");
+					lastWasSpace = false;
+					break;
+				default:
+					lastWasSpace = false;
+					break;
+			}
+			i++;
+		}
+		if (lastI<textOffset+textCount) {
+			sb.append(text, lastI, textOffset+textCount-lastI);
+		}
+		return sb;
+	}
+
+
+	/**
+	 * Returns whether the token straddles the specified position in the
+	 * document.
+	 *
+	 * @param pos The position in the document to check.
+	 * @return Whether the specified position is straddled by this token.
+	 */
+	public boolean containsPosition(int pos) {
+		return pos>=offset && pos<offset+textCount;
+	}
+
+
+	/**
+	 * Makes one token point to the same text segment, and have the same value
+	 * as another token.
+	 *
+	 * @param t2 The token from which to copy.
+	 */
+	public void copyFrom(Token t2) {
+		text = t2.text;
+		textOffset = t2.textOffset;
+		textCount = t2.textCount;
+		offset = t2.offset;
+		type = t2.type;
+		hyperlink = t2.hyperlink;
+		languageIndex = t2.languageIndex;
+		nextToken = t2.nextToken;
+	}
+
+
+	/**
+	 * Returns the position in the token's internal char array corresponding
+	 * to the specified document position.<p>
+	 * Note that this method does NOT do any bounds checking; you can pass in
+	 * a document position that does not correspond to a position in this
+	 * token, and you will not receive an Exception or any other notification;
+	 * it is up to the caller to ensure valid input.
+	 *
+	 * @param pos A position in the document that is represented by this token.
+	 * @return The corresponding token position >= <code>textOffset</code> and
+	 *         < <code>textOffset+textCount</code>.
+	 * @see #tokenToDocument
+	 */
+	public int documentToToken(int pos) {
+		return pos + (textOffset-offset);
+	}
+
+
+	/**
+	 * Returns whether this token's lexeme ends with the specified characters.
+	 *
+	 * @param ch The characters.
+	 * @return Whether this token's lexeme ends with the specified characters.
+	 * @see #startsWith(char[])
+	 */
+	public boolean endsWith(char[] ch) {
+		if (ch==null || ch.length>textCount) {
+			return false;
+		}
+		final int start = textOffset + textCount - ch.length;
+		for (int i=0; i<ch.length; i++) {
+			if (text[start+i]!=ch[i]) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+
+	/**
+	 * Returns a <code>String</code> of the form "#xxxxxx" good for use
+	 * in HTML, representing the given color.
+	 *
+	 * @param color The color to get a string for.
+	 * @return The HTML form of the color.  If <code>color</code> is
+	 *         <code>null</code>, <code>#000000</code> is returned.
+	 */
+	private static final String getHTMLFormatForColor(Color color) {
+		if (color==null) {
+			return "black";
+		}
+		String hexRed = Integer.toHexString(color.getRed());
+		if (hexRed.length()==1)
+			hexRed = "0" + hexRed;
+		String hexGreen = Integer.toHexString(color.getGreen());
+		if (hexGreen.length()==1)
+			hexGreen = "0" + hexGreen;
+		String hexBlue = Integer.toHexString(color.getBlue());
+		if (hexBlue.length()==1)
+			hexBlue = "0" + hexBlue;
+		return "#" + hexRed + hexGreen + hexBlue;
+	}
+
+
+	/**
+	 * Returns a <code>String</code> containing HTML code for painting this
+	 * token, using the given text area's color scheme.
+	 *
+	 * @param textArea The text area whose color scheme to use.
+	 * @return The HTML representation of the token.
+	 * @see #appendHTMLRepresentation(StringBuffer, RSyntaxTextArea, boolean)
+	 */
+	public String getHTMLRepresentation(RSyntaxTextArea textArea) {
+		StringBuffer buf = new StringBuffer();
+		appendHTMLRepresentation(buf, textArea, true);
+		return buf.toString();
+	}
+
+
+	/**
+	 * Returns the language index of this token.
+	 *
+	 * @return The language index.  A value of <code>0</code> denotes the
+	 *        "main" language, any positive value denotes a specific secondary
+	 *        language.
+	 * @see #setLanguageIndex(int)
+	 */
+	public int getLanguageIndex() {
+		return languageIndex;
+	}
+
+
+	/**
+	 * Returns the last token in this list that is not whitespace or a
+	 * comment.
+	 *
+	 * @return The last non-comment, non-whitespace token, or <code>null</code>
+	 *         if there isn't one.
+	 */
+	public Token getLastNonCommentNonWhitespaceToken() {
+
+		Token last = null;
+
+		for (Token t=this; t!=null && t.isPaintable(); t=t.nextToken) {
+			switch (t.type) {
+				case COMMENT_DOCUMENTATION:
+				case COMMENT_EOL:
+				case COMMENT_MULTILINE:
+				case COMMENT_KEYWORD:
+				case COMMENT_MARKUP:
+				case WHITESPACE:
+					break;
+				default:
+					last = t;
+					break;
+			}
+		}
+
+		return last;
+
+	}
+
+
+	/**
+	 * Returns the last paintable token in this token list, or <code>null</code>
+	 * if there is no paintable token.
+	 *
+	 * @return The last paintable token in this token list.
+	 */
+	public Token getLastPaintableToken() {
+		Token t = this;
+		while (t.isPaintable()) {
+			if (t.nextToken==null || !t.nextToken.isPaintable()) {
+				return t;
+			}
+			t = t.nextToken;
+		}
+		return null;
+	}
+
+
+	/**
+	 * Returns the text of this token, as a string.<p>
+	 *
+	 * Note that this method isn't used much by the
+	 * <code>ryntaxtextarea</code> package internally, as it tries to limit
+	 * memory allocation.
+	 *
+	 * @return The text of this token.
+	 */
+	public String getLexeme() {
+		return new String(text, textOffset, textCount);
+	}
+
+
+	/**
+	 * Determines the offset into this token list (i.e., into the
+	 * document) that covers pixel location <code>x</code> if the token list
+	 * starts at pixel location <code>x0</code><p>.
+	 * This method will return the document position "closest" to the
+	 * x-coordinate (i.e., if they click on the "right-half" of the
+	 * <code>w</code> in <code>awe</code>, the caret will be placed in
+	 * between the <code>w</code> and <code>e</code>; similarly, clicking on
+	 * the left-half places the caret between the <code>a</code> and
+	 * <code>w</code>).  This makes it useful for methods such as
+	 * <code>viewToModel</code> found in <code>javax.swing.text.View</code>
+	 * subclasses.
+	 *
+	 * @param textArea The text area from which the token list was derived.
+	 * @param e How to expand tabs.
+	 * @param x0 The pixel x-location that is the beginning of
+	 *        <code>tokenList</code>.
+	 * @param x The pixel-position for which you want to get the corresponding
+	 *        offset.
+	 * @return The position (in the document, NOT into the token list!) that
+	 *         covers the pixel location.  If <code>tokenList</code> is
+	 *         <code>null</code> or has type <code>Token.NULL</code>, then
+	 *         <code>-1</code is returned; the caller should recognize this and
+	 *         return the actual end position of the (empty) line.
+	 */
+	public int getListOffset(RSyntaxTextArea textArea, TabExpander e,
+			float x0, float x) {
+
+		// If the coordinate in question is before this line's start, quit.
+		if (x0 >= x)
+			return offset;
+
+		float currX = x0; // x-coordinate of current char.
+		float nextX = x0; // x-coordinate of next char.
+		float stableX = x0; // Cached ending x-coord. of last tab or token.
+		Token token = this;
+		int last = offset;
+		FontMetrics fm = null;
+
+		while (token != null && token.isPaintable()) {
+
+			fm = textArea.getFontMetricsForTokenType(token.type);
+			char[] text = token.text;
+			int start = token.textOffset;
+			int end = start + token.textCount;
+
+			for (int i = start; i < end; i++) {
+				currX = nextX;
+				if (text[i] == '\t') {
+					nextX = e.nextTabStop(nextX, 0);
+					stableX = nextX; // Cache ending x-coord. of tab.
+					start = i + 1; // Do charsWidth() from next char.
+				}
+				else {
+					nextX = stableX + fm.charsWidth(text, start, i - start + 1);
+				}
+				if (x >= currX && x < nextX) {
+					if ((x - currX) < (nextX - x)) {
+						return last + i - token.textOffset;
+					}
+					return last + i + 1 - token.textOffset;
+				}
+			}
+
+			stableX = nextX; // Cache ending x-coordinate of token.
+			last += token.textCount;
+			token = token.getNextToken();
+
+		}
+
+		// If we didn't find anything, return the end position of the text.
+		return last;
+
+	}
+
+
+	/**
+	 * Returns the token after this one in the linked list.
+	 *
+	 * @return The next token.
+	 * @see #setNextToken
+	 */
+	public Token getNextToken() {
+		return nextToken;
+	}
+
+
+	/**
+	 * Returns the position in the document that represents the last character
+	 * in the token that will fit into <code>endBeforeX-startX</code> pixels.
+	 * For example, if you're using a monospaced 8-pixel-per-character font,
+	 * have the token "while" and <code>startX</code> is <code>0</code> and
+	 * <code>endBeforeX</code> is <code>30</code>, this method will return the
+	 * document position of the "i" in "while", because the "i" ends at pixel
+	 * <code>24</code>, while the "l" ends at <code>32</code>.  If not even the
+	 * first character fits in <code>endBeforeX-startX</code>, the first
+	 * character's position is still returned so calling methods don't go into
+	 * infinite loops.
+	 *
+	 * @param textArea The text area in which this token is being painted.
+	 * @param e How to expand tabs.
+	 * @param startX The x-coordinate at which the token will be painted.  This
+	 *        is needed because of tabs.
+	 * @param endBeforeX The x-coordinate for which you want to find the last
+	 *        character of <code>t</code> which comes before it.
+	 * @return The last document position that will fit in the specified amount
+	 *         of pixels.
+	 */
+	/*
+	 * @see #getTokenListOffsetBeforeX
+	 * FIXME:  This method does not compute correctly!  It needs to be abstract
+	 * and implemented by subclasses.
+	 */
+	public int getOffsetBeforeX(RSyntaxTextArea textArea, TabExpander e,
+							float startX, float endBeforeX) {
+
+		FontMetrics fm = textArea.getFontMetricsForTokenType(type);
+		int i = textOffset;
+		int stop = i + textCount;
+		float x = startX;
+
+		while (i<stop) {
+			if (text[i]=='\t')
+				x = e.nextTabStop(x, 0);
+			else
+				x += fm.charWidth(text[i]);
+			if (x>endBeforeX) {
+				// If not even the first character fits into the space, go
+				// ahead and say the first char does fit so we don't go into
+				// an infinite loop.
+				int intoToken = Math.max(i-textOffset, 1);
+				return offset + intoToken;
+			}
+			i++;
+		}
+
+		// If we got here, the whole token fit in (endBeforeX-startX) pixels.
+		return offset + textCount - 1;
+
+	}
+
+
+	/**
+	 * Returns the width of this token given the specified parameters.
+	 *
+	 * @param textArea The text area in which the token is being painted.
+	 * @param e Describes how to expand tabs.  This parameter cannot be
+	 *        <code>null</code>.
+	 * @param x0 The pixel-location at which the token begins.  This is needed
+	 *        because of tabs.
+	 * @return The width of the token, in pixels.
+	 * @see #getWidthUpTo
+	 */
+	public float getWidth(RSyntaxTextArea textArea, TabExpander e, float x0) {
+		return getWidthUpTo(textCount, textArea, e, x0);
+	}
+
+
+	/**
+	 * Returns the width of a specified number of characters in this token.
+	 * For example, for the token "while", specifying a value of <code>3</code>
+	 * here returns the width of the "whi" portion of the token.
+	 *
+	 * @param numChars The number of characters for which to get the width.
+	 * @param textArea The text area in which the token is being painted.
+	 * @param e How to expand tabs.  This value cannot be <code>null</code>.
+	 * @param x0 The pixel-location at which this token begins.  This is needed
+	 *        because of tabs.
+	 * @return The width of the specified number of characters in this token.
+	 * @see #getWidth
+	 */
+	public float getWidthUpTo(int numChars, RSyntaxTextArea textArea,
+			TabExpander e, float x0) {
+		float width = x0;
+		FontMetrics fm = textArea.getFontMetricsForTokenType(type);
+		if (fm != null) {
+			int w;
+			int currentStart = textOffset;
+			int endBefore = textOffset + numChars;
+			for (int i = currentStart; i < endBefore; i++) {
+				if (text[i] == '\t') {
+					// Since TokenMaker implementations usually group all
+					// adjacent whitespace into a single token, there
+					// aren't usually any characters to compute a width
+					// for here, so we check before calling.
+					w = i - currentStart;
+					if (w > 0)
+						width += fm.charsWidth(text, currentStart, w);
+					currentStart = i + 1;
+					width = e.nextTabStop(width, 0);
+				}
+			}
+			// Most (non-whitespace) tokens will have characters at this
+			// point to get the widths for, so we don't check for w>0 (mini-
+			// optimization).
+			w = endBefore - currentStart;
+			width += fm.charsWidth(text, currentStart, w);
+		}
+		return width - x0;
+	}
+
+
+	/**
+	 * Returns whether this token's lexeme matches a specific character array.
+	 *
+	 * @param lexeme The lexeme to check for.
+	 * @return Whether this token has that lexeme.
+	 * @see #is(int, char[])
+	 * @see #is(int, String)
+	 * @see #isSingleChar(int, char)
+	 * @see #startsWith(char[])
+	 */
+	public boolean is(char[] lexeme) {
+		if (textCount==lexeme.length) {
+			for (int i=0; i<textCount; i++) {
+				if (text[textOffset+i]!=lexeme[i]) {
+					return false;
+				}
+			}
+			return true;
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns whether this token is of the specified type, with the specified
+	 * lexeme.<p>
+	 * This method is preferred over the other overload in performance-critical
+	 * code where this operation may be called frequently, since it does not
+	 * involve any String allocations.
+	 *
+	 * @param type The type to check for.
+	 * @param lexeme The lexeme to check for.
+	 * @return Whether this token has that type and lexeme.
+	 * @see #is(int, String)
+	 * @see #is(char[])
+	 * @see #isSingleChar(int, char)
+	 * @see #startsWith(char[])
+	 */
+	public boolean is(int type, char[] lexeme) {
+		if (this.type==type && textCount==lexeme.length) {
+			for (int i=0; i<textCount; i++) {
+				if (text[textOffset+i]!=lexeme[i]) {
+					return false;
+				}
+			}
+			return true;
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns whether this token is of the specified type, with the specified
+	 * lexeme.<p>
+	 * The other overload of this method is preferred over this one in
+	 * performance-critical code, as this one involves a String allocation
+	 * while the other does not.
+	 *
+	 * @param type The type to check for.
+	 * @param lexeme The lexeme to check for.
+	 * @return Whether this token has that type and lexeme.
+	 * @see #is(int, char[])
+	 * @see #isSingleChar(int, char)
+	 * @see #startsWith(char[])
+	 */
+	public boolean is(int type, String lexeme) {
+		return this.type==type && textCount==lexeme.length() &&
+				lexeme.equals(getLexeme());
+	}
+
+
+	/**
+	 * Returns whether this token is a comment.
+	 *
+	 * @return Whether this token is a comment.
+	 * @see #isWhitespace()
+	 * @see #isCommentOrWhitespace()
+	 */
+	public boolean isComment() {
+		return type>=Token.COMMENT_EOL && type<=Token.COMMENT_MARKUP;
+	}
+
+
+	/**
+	 * Returns whether this token is a comment or whitespace.
+	 *
+	 * @return Whether this token is a comment or whitespace.
+	 * @see #isComment()
+	 * @see #isWhitespace()
+	 */
+	public boolean isCommentOrWhitespace() {
+		return isComment() || isWhitespace();
+	}
+
+
+	/**
+	 * Returns whether this token is a hyperlink.
+	 *
+	 * @return Whether this token is a hyperlink.
+	 * @see #setHyperlink(boolean)
+	 */
+	public boolean isHyperlink() {
+		return hyperlink;
+	}
+
+
+	/**
+	 * Returns whether this token is an identifier.
+	 *
+	 * @return Whether this token is an identifier.
+	 */
+	public boolean isIdentifier() {
+		return type==IDENTIFIER;
+	}
+
+
+	/**
+	 * Returns whether this token is a {@link #SEPARATOR} representing a single
+	 * left curly brace.
+	 *
+	 * @return Whether this token is a left curly brace.
+	 * @see #isRightCurly()
+	 */
+	public boolean isLeftCurly() {
+		return type==SEPARATOR && isSingleChar('{');
+	}
+
+
+	/**
+	 * Returns whether this token is a {@link #SEPARATOR} representing a single
+	 * right curly brace.
+	 *
+	 * @return Whether this token is a right curly brace.
+	 * @see #isLeftCurly()
+	 */
+	public boolean isRightCurly() {
+		return type==SEPARATOR && isSingleChar('}');
+	}
+
+
+	/**
+	 * Returns whether or not this token is "paintable;" i.e., whether or not
+	 * the type of this token is one such that it has an associated syntax
+	 * style.  What this boils down to is whether the token type is greater
+	 * than <code>Token.NULL</code>.
+	 *
+	 * @return Whether or not this token is paintable.
+	 */
+	public boolean isPaintable() {
+		return type>Token.NULL;
+	}
+
+
+	/**
+	 * Returns whether this token is the specified single character.
+	 *
+	 * @param ch The character to check for.
+	 * @return Whether this token's lexeme is the single character specified.
+	 * @see #isSingleChar(int, char)
+	 */
+	public boolean isSingleChar(char ch) {
+		return textCount==1 && text[textOffset]==ch;
+	}
+
+
+	/**
+	 * Returns whether this token is the specified single character, and of a
+	 * specific type.
+	 *
+	 * @param type The token type.
+	 * @param ch The character to check for.
+	 * @return Whether this token is of the specified type, and with a lexeme
+	 *         Equaling the single character specified.
+	 * @see #isSingleChar(char)
+	 */
+	public boolean isSingleChar(int type, char ch) {
+		return this.type==type && isSingleChar(ch);
+	}
+
+
+	/**
+	 * Returns whether or not this token is whitespace.
+	 *
+	 * @return <code>true</code> iff this token is whitespace.
+	 * @see #isComment()
+	 * @see #isCommentOrWhitespace()
+	 */
+	public boolean isWhitespace() {
+		return type==WHITESPACE;
+	}
+
+
+	/**
+	 * Returns the bounding box for the specified document location.  The
+	 * location must be in the specified token list; if it isn't,
+	 * <code>null</code> is returned.
+	 *
+	 * @param textArea The text area from which the token list was derived.
+	 * @param e How to expand tabs.
+	 * @param pos The position in the document for which to get the bounding
+	 *        box in the view.
+	 * @param x0 The pixel x-location that is the beginning of
+	 *        <code>tokenList</code>.
+	 * @param rect The rectangle in which we'll be returning the results.  This
+	 *        object is reused to keep from frequent memory allocations.
+	 * @return The bounding box for the specified position in the model.
+	 */
+	public Rectangle listOffsetToView(RSyntaxTextArea textArea, TabExpander e,
+			int pos, int x0, Rectangle rect) {
+
+		int stableX = x0; // Cached ending x-coord. of last tab or token.
+		Token token = this;
+		FontMetrics fm = null;
+		Segment s = new Segment();
+
+		while (token != null && token.isPaintable()) {
+
+			fm = textArea.getFontMetricsForTokenType(token.type);
+			if (fm == null) {
+				return rect; // Don't return null as things'll error.
+			}
+			char[] text = token.text;
+			int start = token.textOffset;
+			int end = start + token.textCount;
+
+			// If this token contains the position for which to get the
+			// bounding box...
+			if (token.containsPosition(pos)) {
+
+				s.array = token.text;
+				s.offset = token.textOffset;
+				s.count = pos - token.offset;
+
+				// Must use this (actually fm.charWidth()), and not
+				// fm.charsWidth() for returned value to match up with where
+				// text is actually painted on OS X!
+				int w = Utilities.getTabbedTextWidth(s, fm, stableX, e,
+						token.offset);
+				rect.x = stableX + w;
+				end = token.documentToToken(pos);
+
+				if (text[end] == '\t') {
+					rect.width = fm.charWidth(' ');
+				}
+				else {
+					rect.width = fm.charWidth(text[end]);
+				}
+
+				return rect;
+
+			}
+
+			// If this token does not contain the position for which to get
+			// the bounding box...
+			else {
+				s.array = token.text;
+				s.offset = token.textOffset;
+				s.count = token.textCount;
+				stableX += Utilities.getTabbedTextWidth(s, fm, stableX, e,
+						token.offset);
+			}
+
+			token = token.getNextToken();
+
+		}
+
+		// If we didn't find anything, we're at the end of the line. Return
+		// a width of 1 (so selection highlights don't extend way past line's
+		// text). A ConfigurableCaret will know to paint itself with a larger
+		// width.
+		rect.x = stableX;
+		rect.width = 1;
+		return rect;
+
+	}
+
+
+	/**
+	 * Makes this token start at the specified offset into the document.
+	 *
+	 * @param pos The offset into the document this token should start at.
+	 *        Note that this token must already contain this position; if
+	 *        it doesn't, an exception is thrown.
+	 * @throws IllegalArgumentException If pos is not already contained by
+	 *         this token.
+	 * @see #moveOffset(int)
+	 */
+	public void makeStartAt(int pos) {
+		if (pos<offset || pos>=(offset+textCount)) {
+			throw new IllegalArgumentException("pos " + pos +
+				" is not in range " + offset + "-" + (offset+textCount-1));
+		}
+		int shift = pos - offset;
+		offset = pos;
+		textOffset += shift;
+		textCount -= shift;
+	}
+
+
+	/**
+	 * Moves the starting offset of this token.
+	 *
+	 * @param amt The amount to move the starting offset.  This should be
+	 *        between <code>0</code> and <code>textCount</code>, inclusive.
+	 * @throws IllegalArgumentException If <code>amt</code> is an invalid value.
+	 * @see #makeStartAt(int)
+	 */
+	public void moveOffset(int amt) {
+		if (amt<0 || amt>textCount) {
+			throw new IllegalArgumentException("amt " + amt +
+					" is not in range 0-" + textCount);
+		}
+		offset += amt;
+		textOffset += amt;
+		textCount -= amt;
+	}
+
+
+	/**
+	 * Sets the value of this token to a particular segment of a document.
+	 * The "next token" value is cleared.
+	 *
+	 * @param line The segment from which to get the token.
+	 * @param beg The first character's position in <code>line</code>.
+	 * @param end The last character's position in <code>line</code>.
+	 * @param offset The offset into the document at which this token begins.
+	 * @param type A token type listed as "generic" above.
+	 */
+	public void set(final char[] line, final int beg, final int end,
+							final int offset, final int type) {
+		this.text = line;
+		this.textOffset = beg;
+		this.textCount = end - beg + 1;
+		this.type = type;
+		this.offset = offset;
+		nextToken = null;
+	}
+
+
+	/**
+	 * Sets whether this token is a hyperlink.
+	 *
+	 * @param hyperlink Whether this token is a hyperlink.
+	 * @see #isHyperlink()
+	 */
+	public void setHyperlink(boolean hyperlink) {
+		this.hyperlink = hyperlink;
+	}
+
+
+	/**
+	 * Sets the language index for this token.  If this value is positive, it
+	 * denotes a specific "secondary" language this token represents (such as
+	 * JavaScript code or CSS embedded in an HTML file).  If this value is
+	 * <code>0</code>, this token is in the "main" language being edited.
+	 * Negative values are invalid and treated as <code>0</code>.
+	 *
+	 * @param languageIndex The new language index.  A value of
+	 *        <code>0</code> denotes the "main" language, any positive value
+	 *        denotes a specific secondary language.  Negative values will
+	 *        be treated as <code>0</code>.
+	 * @see #getLanguageIndex()
+	 */
+	public void setLanguageIndex(int languageIndex) {
+		this.languageIndex = languageIndex;
+	}
+
+
+	/**
+	 * Sets the "next token" pointer of this token to point to the specified
+	 * token.
+	 *
+	 * @param nextToken The new next token.
+	 * @see #getNextToken()
+	 */
+	public void setNextToken(Token nextToken) {
+		this.nextToken = nextToken;
+	}
+
+
+	/**
+	 * Returns whether this token starts with the specified characters.
+	 *
+	 * @param chars The characters.
+	 * @return Whether this token starts with those characters.
+	 * @see #endsWith(char[])
+	 * @see #is(int, char[])
+	 */
+	public boolean startsWith(char[] chars) {
+		if (chars.length<=textCount){
+			for (int i=0; i<chars.length; i++) {
+				if (text[textOffset+i]!=chars[i]) {
+					return false;
+				}
+			}
+			return true;
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns the position in the document corresponding to the specified
+	 * position in this token's internal char array (<code>textOffset</code> -
+	 * <code>textOffset+textCount-1</code>).<p>
+	 * Note that this method does NOT do any bounds checking; you can pass in
+	 * an invalid token position, and you will not receive an Exception or any
+	 * other indication that the returned document position is invalid.  It is
+	 * up to the user to ensure valid input.
+	 *
+	 * @param pos A position in the token's internal char array
+	 *        (<code>textOffset</code> - <code>textOffset+textCount</code>).
+	 * @return The corresponding position in the document.
+	 * @see #documentToToken(int)
+	 */
+	public int tokenToDocument(int pos) {
+		return pos + (offset-textOffset);
+	}
+
+
+	/**
+	 * Returns this token as a <code>String</code>, which is useful for
+	 * debugging.
+	 *
+	 * @return A string describing this token.
+	 */
+	public String toString() {
+		return "[Token: " +
+			(type==Token.NULL ? "<null token>" :
+				"text: '" +
+					(text==null ? "<null>" : getLexeme() + "'; " +
+	       		"offset: " + offset + "; type: " + type + "; " +
+		   		"isPaintable: " + isPaintable() +
+		   		"; nextToken==null: " + (nextToken==null))) +
+		   "]";
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenFactory.java b/src/org/fife/ui/rsyntaxtextarea/TokenFactory.java
new file mode 100644
index 0000000..a4d1a0f
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenFactory.java
@@ -0,0 +1,67 @@
+/*
+ * 10/28/2004
+ *
+ * TokenFactory.java - Interface for a class that generates tokens of some type.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.text.Segment;
+
+
+/**
+ * Interface for a class that generates tokens somehow.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+interface TokenFactory {
+
+
+	/**
+	 * Returns a null token.
+	 *
+	 * @return A null token.
+	 */
+	public Token createToken();
+
+
+	/**
+	 * Returns a token.
+	 *
+	 * @param line The segment from which to get the token's text.
+	 * @param beg The starting offset of the token's text in the segment.
+	 * @param end The ending offset of the token's text in the segment.
+	 * @param startOffset The offset in the document of the token.
+	 * @param type The type of token.
+	 * @return The token.
+	 */
+	public Token createToken(final Segment line, final int beg,
+					final int end, final int startOffset, final int type);
+
+
+	/**
+	 * Returns a token.
+	 *
+	 * @param line The char array from which to get the token's text.
+	 * @param beg The starting offset of the token's text in the char array.
+	 * @param end The ending offset of the token's text in the char array.
+	 * @param startOffset The offset in the document of the token.
+	 * @param type The type of token.
+	 * @return The token.
+	 */
+	public Token createToken(final char[] line, final int beg,
+					final int end, final int startOffset, final int type);
+
+
+	/**
+	 * Resets the state of this token maker.  This method should be called
+	 * by the <code>TokenMaker</code> every time a token list is generated for
+	 * a new line so the tokens can be reused.
+	 */
+	public void resetAllTokens();
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/TokenMaker.java
new file mode 100644
index 0000000..af5d81e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenMaker.java
@@ -0,0 +1,170 @@
+/*
+ * 02/24/2004
+ *
+ * TokenMaker.java - An object that can take a chunk of text and return a
+ * linked list of <code>Token</code>s representing it.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.Action;
+import javax.swing.text.Segment;
+
+
+/**
+ * An implementation of <code>TokenMaker</code> is a class that turns text into
+ * a linked list of <code>Token</code>s for syntax highlighting
+ * in a particular language.
+ *
+ * @see Token
+ * @see AbstractTokenMaker
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ */
+public interface TokenMaker {
+
+
+	/**
+	 * Adds a null token to the end of the current linked list of tokens.
+	 * This should be put at the end of the linked list whenever the last
+	 * token on the current line is NOT a multi-line token.
+	 */
+	public void addNullToken();
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array from which to get the text.
+	 * @param start Start offset in <code>segment</code> of token.
+	 * @param end End offset in <code>segment</code> of token.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *        occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+							int startOffset);
+
+
+	/**
+	 * Returns the closest {@link TokenTypes "standard" token type} for a given
+	 * "internal" token type (e.g. one whose value is <code>< 0</code>).
+	 *
+	 * @param type The token type.
+	 * @return The closest "standard" token type.  If a mapping is not defined
+	 *         for this language, then <code>type</code> is returned.
+	 */
+	public int getClosestStandardTokenTypeForInternalType(int type);
+
+
+	/**
+	 * Returns whether this programming language uses curly braces
+	 * ('<tt>{</tt>' and '<tt>}</tt>') to denote code blocks.
+	 *
+	 * @return Whether curly braces denote code blocks.
+	 */
+	public boolean getCurlyBracesDenoteCodeBlocks();
+
+
+	/**
+	 * Returns the last token on this line's type if the token is "unfinished",
+	 * or {@link Token#NULL} if it was finished.  For example, if C-style
+	 * syntax highlighting is being implemented, and <code>text</code>
+	 * contained a line of code that contained the beginning of a comment but
+	 * no end-comment marker ("*\/"), then this method would return
+	 * {@link Token#COMMENT_MULTILINE} for that line.  This is useful
+	 * for doing syntax highlighting.
+	 *
+	 * @param text The line of tokens to examine.
+	 * @param initialTokenType The token type to start with (i.e., the value
+	 *        of <code>getLastTokenTypeOnLine</code> for the line before
+	 *        <code>text</code>).
+	 * @return The last token on this line's type, or {@link Token#NULL}
+	 *         if the line was completed.
+	 */
+	public int getLastTokenTypeOnLine(Segment text, int initialTokenType);
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.  A <code>null</code> value for either means there
+	 *         is no string to add for that part.  A value of
+	 *         <code>null</code> for the array means this language
+	 *         does not support commenting/uncommenting lines.
+	 */
+	public String[] getLineCommentStartAndEnd();
+
+
+	/**
+	 * Returns an action to handle "insert break" key presses (i.e. Enter).
+	 *
+	 * @return The action, or <code>null</code> if the default action should
+	 *         be used.
+	 */
+	public Action getInsertBreakAction();
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type);
+
+
+	/**
+	 * Returns the object in charge of marking all occurrences of the token
+	 * at the current caret position, if it is a relevant token.  If
+	 * <code>null</code> is returned, a default <code>OccurrenceMarker</code>
+	 * is used.
+	 *
+	 * @return The occurrence marker for this language, or <code>null</code>
+	 *         for none.
+	 */
+	public OccurrenceMarker getOccurrenceMarker();
+
+
+	/**
+	 * If a line ends in the specified token, this method returns whether
+	 * a new line inserted after that line should be indented.
+	 *
+	 * @param token The token the previous line ends with.
+	 * @return Whether the next line should be indented.
+	 */
+	public boolean getShouldIndentNextLineAfter(Token token);
+
+
+	/**
+	 * 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);
+
+
+	/**
+	 * Returns whether this language is a markup language.
+	 *
+	 * @return Whether this language is markup.
+	 */
+	public boolean isMarkupLanguage();
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenMakerBase.java b/src/org/fife/ui/rsyntaxtextarea/TokenMakerBase.java
new file mode 100644
index 0000000..bcbbaa5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenMakerBase.java
@@ -0,0 +1,298 @@
+/*
+ * 08/26/2004
+ *
+ * TokenMakerBase.java - A base class for token makers.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.Action;
+import javax.swing.text.Segment;
+
+
+/**
+ * Base class for token makers.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+abstract class TokenMakerBase implements TokenMaker {
+
+	/**
+	 * The first token in the returned linked list.
+	 */
+	protected Token firstToken;
+	
+	/**
+	 * Used in the creation of the linked list.
+	 */
+	protected Token currentToken;
+	
+	/**
+	 * Used in the creation of the linked list.
+	 */
+	protected Token previousToken;
+
+	/**
+	 * The factory that gives us our tokens to use.
+	 */
+	private TokenFactory tokenFactory;
+
+	/**
+	 * Highlights occurrences of the current token in the editor, if it is
+	 * relevant.
+	 */
+	private OccurrenceMarker occurrenceMarker;
+
+	/**
+	 * "0" implies this is the "main" language being highlighted.  Positive
+	 * values imply various "secondary" or "embedded" languages, such as CSS
+	 * or JavaScript in HTML.  While this value is non-zero, tokens will be
+	 * generated with this language index so they can (possibly) be painted
+	 * differently, so "embedded" languages can be rendered with a special
+	 * background.
+	 */
+	private int languageIndex;
+
+
+	/**
+	 * Constructor.
+	 */
+	public TokenMakerBase() {
+		firstToken = currentToken = previousToken = null;
+		tokenFactory = new DefaultTokenFactory();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void addNullToken() {
+		if (firstToken==null) {
+			firstToken = tokenFactory.createToken();
+			currentToken = firstToken;
+		}
+		else {
+			currentToken.setNextToken(tokenFactory.createToken());
+			previousToken = currentToken;
+			currentToken = currentToken.getNextToken();
+		}
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param segment <code>Segment</code> to get text from.
+	 * @param start Start offset in <code>segment</code> of token.
+	 * @param end End offset in <code>segment</code> of token.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *        occurs.
+	 */
+	public void addToken(Segment segment, int start, int end, int tokenType,
+							int startOffset) {
+		addToken(segment.array, start,end, tokenType, startOffset);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset) {
+		addToken(array, start, end, tokenType, startOffset, 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) {
+
+		if (firstToken==null) {
+			firstToken = tokenFactory.createToken(array, start, end,
+									startOffset, tokenType);
+			currentToken = firstToken; // previous token is still null.
+		}
+		else {
+			currentToken.setNextToken(tokenFactory.createToken(array,
+								start,end, startOffset, tokenType));
+			previousToken = currentToken;
+			currentToken = currentToken.getNextToken();
+		}
+
+		currentToken.setLanguageIndex(languageIndex);
+		currentToken.setHyperlink(hyperlink);
+
+	}
+
+
+	/**
+	 * Returns the occurrence marker to use for this token maker.  Subclasses
+	 * can override to use different implementations.
+	 *
+	 * @return The occurrence marker to use.
+	 */
+	protected OccurrenceMarker createOccurrenceMarker() {
+		return new DefaultOccurrenceMarker();
+	}
+
+
+	/**
+	 * Returns the closest {@link TokenTypes "standard" token type} for a given
+	 * "internal" token type (e.g. one whose value is <code>< 0</code>).<p>
+	 * 
+	 * The default implementation returns <code>type</code> always, which
+	 * denotes that a mapping from internal token types to standard token types
+	 * is not defined; subclasses can override.
+	 *
+	 * @param type The token type.
+	 * @return The closest "standard" token type.
+	 */
+	public int getClosestStandardTokenTypeForInternalType(int type) {
+		return type;
+	}
+
+
+	/**
+	 * Returns whether this programming language uses curly braces
+	 * ('<tt>{</tt>' and '<tt>}</tt>') to denote code blocks.<p>
+	 *
+	 * The default implementation returns <code>false</code>; subclasses can
+	 * override this method if necessary.
+	 *
+	 * @return Whether curly braces denote code blocks.
+	 */
+	public boolean getCurlyBracesDenoteCodeBlocks() {
+		return false;
+	}
+
+
+	/**
+	 * Returns an action to handle "insert break" key presses (i.e. Enter).
+	 * The default implementation returns <code>null</code>.  Subclasses
+	 * can override.
+	 *
+	 * @return The default implementation always returns <code>null</code>.
+	 */
+	public Action getInsertBreakAction() {
+		return null;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int getLastTokenTypeOnLine(Segment text, int initialTokenType) {
+
+		// Last parameter doesn't matter if we're not painting.
+		Token t = getTokenList(text, initialTokenType, 0);
+
+		while (t.getNextToken()!=null)
+			t = t.getNextToken();
+
+		return t.type;
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return null;
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.  The default
+	 * implementation returns true if <tt>type</tt> is {@link Token#IDENTIFIER}.
+	 * Subclasses can override this method to support other token types, such
+	 * as {@link Token#VARIABLE}.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public OccurrenceMarker getOccurrenceMarker() {
+		if (occurrenceMarker==null) {
+			occurrenceMarker = createOccurrenceMarker();
+		}
+		return occurrenceMarker;
+	}
+
+
+	/**
+	 * The default implementation returns <code>false</code> always.  Languages
+	 * that wish to better support auto-indentation can override this method.
+	 *
+	 * @param token The token the previous line ends with.
+	 * @return Whether the next line should be indented.
+	 */
+	public boolean getShouldIndentNextLineAfter(Token token) {
+		return false;
+	}
+
+
+	/**
+	 * The default implementation returns <code>false</code> always.
+	 * Subclasses that are highlighting a markup language should override this
+	 * method to return <code>true</code>.
+	 *
+	 * @return <code>false</code> always.
+	 */
+	public boolean isMarkupLanguage() {
+		return false;
+	}
+
+
+	/**
+	 * Deletes the linked list of tokens so we can begin anew.  This should
+	 * never have to be called by the programmer, as it is automatically
+	 * called whenever the user calls
+	 * {@link #getLastTokenTypeOnLine(Segment, int)} or
+	 * {@link #getTokenList(Segment, int, int)}.
+	 */
+	protected void resetTokenList() {
+		firstToken = currentToken = previousToken = null;
+		tokenFactory.resetAllTokens();
+	}
+
+
+	/**
+	 * Sets the language index to assign to tokens moving forward.  This
+	 * property is used to designate tokens as being in "secondary" languages
+	 * (such as CSS or JavaScript in HTML).
+	 *
+	 * @param languageIndex The new language index.  A value of
+	 *        <code>0</code> denotes the "main" language, any positive value
+	 *        denotes a specific secondary language.  Negative values will
+	 *        be treated as <code>0</code>.
+	 */
+	public void setLanguageIndex(int languageIndex) {
+		this.languageIndex = Math.max(0, languageIndex);
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenMakerFactory.java b/src/org/fife/ui/rsyntaxtextarea/TokenMakerFactory.java
new file mode 100644
index 0000000..1aa18eb
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenMakerFactory.java
@@ -0,0 +1,124 @@
+/*
+ * 12/12/2008
+ *
+ * TokenMakerFactory.java - A factory for TokenMakers.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.util.Set;
+
+import org.fife.ui.rsyntaxtextarea.modes.PlainTextTokenMaker;
+
+
+/**
+ * A factory that maps syntax styles to {@link TokenMaker}s capable of splitting
+ * text into tokens for those syntax styles.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class TokenMakerFactory {
+
+	/**
+	 * If this system property is set, a custom <code>TokenMakerFactory</code>
+	 * of the specified class will be used as the default token maker factory.
+	 */
+	public static final String PROPERTY_DEFAULT_TOKEN_MAKER_FACTORY	=
+														"TokenMakerFactory";
+
+	/**
+	 * The singleton default <code>TokenMakerFactory</code> instance.
+	 */
+	private static TokenMakerFactory DEFAULT_INSTANCE;
+
+
+	/**
+	 * Returns the default <code>TokenMakerFactory</code> instance.  This is
+	 * the factory used by all {@link RSyntaxDocument}s by default.
+	 *
+	 * @return The factory.
+	 * @see #setDefaultInstance(TokenMakerFactory)
+	 */
+	public static synchronized TokenMakerFactory getDefaultInstance() {
+		if (DEFAULT_INSTANCE==null) {
+			String clazz = null;
+			try {
+				clazz= System.getProperty(PROPERTY_DEFAULT_TOKEN_MAKER_FACTORY);
+			} catch (java.security.AccessControlException ace) {
+				clazz = null; // We're in an applet; take default.
+			}
+			if (clazz==null) {
+				clazz = "org.fife.ui.rsyntaxtextarea.DefaultTokenMakerFactory";
+			}
+			try {
+				DEFAULT_INSTANCE = (TokenMakerFactory)Class.forName(clazz).
+													newInstance();
+			} catch (RuntimeException re) { // FindBugs
+				throw re;
+			} catch (Exception e) {
+				e.printStackTrace();
+				throw new InternalError("Cannot find TokenMakerFactory: " +
+											clazz);
+			}
+		}
+		return DEFAULT_INSTANCE;
+	}
+
+
+	/**
+	 * Returns a {@link TokenMaker} for the specified key.
+	 *
+	 * @param key The key.
+	 * @return The corresponding <code>TokenMaker</code>, or
+	 *         {@link PlainTextTokenMaker} if none matches the specified key.
+	 */
+	public final TokenMaker getTokenMaker(String key) {
+		TokenMaker tm = getTokenMakerImpl(key);
+		if (tm==null) {
+			tm = new PlainTextTokenMaker();
+		}
+		return tm;
+	}
+
+
+	/**
+	 * Returns a {@link TokenMaker} for the specified key.
+	 *
+	 * @param key The key.
+	 * @return The corresponding <code>TokenMaker</code>, or <code>null</code>
+	 *         if none matches the specified key.
+	 */
+	protected abstract TokenMaker getTokenMakerImpl(String key);
+
+
+	/**
+	 * Returns the set of keys that this factory maps to token makers.
+	 *
+	 * @return The set of keys.
+	 */
+	public abstract Set keySet();
+
+
+	/**
+	 * Sets the default <code>TokenMakerFactory</code> instance.  This is
+	 * the factory used by all future {@link RSyntaxDocument}s by default.
+	 * <code>RSyntaxDocument</code>s that have already been created are not
+	 * affected.
+	 *
+	 * @param tmf The factory.
+	 * @throws IllegalArgumentException If <code>tmf</code> is
+	 *         <code>null</code>.
+	 * @see #getDefaultInstance()
+	 */
+	public static synchronized void setDefaultInstance(TokenMakerFactory tmf) {
+		if (tmf==null) {
+			throw new IllegalArgumentException("tmf cannot be null");
+		}
+		DEFAULT_INSTANCE = tmf;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenMap.java b/src/org/fife/ui/rsyntaxtextarea/TokenMap.java
new file mode 100644
index 0000000..51976fd
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenMap.java
@@ -0,0 +1,276 @@
+/*
+ * 08/26/2004
+ *
+ * TokenMap.java - Similar to a Map in Java, only designed specifically for
+ * org.fife.ui.rsyntaxtextarea.Tokens.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.text.Segment;
+
+
+/**
+ * A hash table for reserved words, etc. defined by a {@link TokenMaker}.
+ * This class is designed for the quick lookup of tokens, as it can compare
+ * <code>Segment</code>s without the need to allocate a new string.<p>
+ *
+ * The <code>org.fife.ui.rsyntaxtextarea</code> package uses this class to help
+ * identify reserved words in programming languages.  An instance of
+ * {@link TokenMaker} will create and initialize an instance of this class
+ * containing all reserved words, data types, and all other words that need to
+ * be syntax-highlighted for that particular language.  When the token maker
+ * parses a line and identifies an individual token, it is looked up in the
+ * <code>TokenMap</code> to see if it should be syntax-highlighted.
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ */
+public class TokenMap {
+
+	private int size;
+	private TokenMapToken[] tokenMap;
+	private boolean ignoreCase;
+
+	private static final int DEFAULT_TOKEN_MAP_SIZE = 52;
+
+
+	/**
+	 * Constructs a new token map that is case-sensitive.
+	 */
+	public TokenMap() {
+		this(DEFAULT_TOKEN_MAP_SIZE);
+	}
+
+
+	/**
+	 * Constructs a new token map that is case-sensitive.
+	 *
+	 * @param size The size of the token map.
+	 */
+	public TokenMap(int size) {
+		this(size, false);
+	}
+
+
+	/**
+	 * Constructs a new token map.
+	 *
+	 * @param ignoreCase Whether or not this token map should ignore case
+	 *        when comparing tokens.
+	 */
+	public TokenMap(boolean ignoreCase) {
+		this(DEFAULT_TOKEN_MAP_SIZE, ignoreCase);
+	}
+
+
+	/**
+	 * Constructs a new token map.
+	 *
+	 * @param size The size of the token map.
+	 * @param ignoreCase Whether or not this token map should ignore case
+	 *        when comparing tokens.
+	 */
+	public TokenMap(int size, boolean ignoreCase) {
+		this.size = size;
+		tokenMap = new TokenMapToken[size];
+		this.ignoreCase = ignoreCase;
+	}
+
+
+	/**
+	 * Adds a token to a specified bucket in the token map.
+	 *
+	 * @param bucket The bucket in which to add the token.
+	 * @param token The token to add.
+	 */
+	private void addTokenToBucket(int bucket, TokenMapToken token) {
+		TokenMapToken old = tokenMap[bucket];
+		token.nextToken = old;
+		tokenMap[bucket] = token;
+	}
+
+
+	/**
+	 * Returns the token type associated with the given text, if the given
+	 * text is in this token map.  If it isn't, <code>-1</code> is returned.
+	 *
+	 * @param text The segment from which to get the text to compare.
+	 * @param start The starting index in the segment of the text.
+	 * @param end The ending index in the segment of the text.
+	 * @return The token type associated with the given text, or
+	 *         <code>-1</code> if this token was not specified in this map.
+	 */
+	public int get(Segment text, int start, int end) {
+		return get(text.array, start, end);
+	}
+
+
+	/**
+	 * Returns the token type associated with the given text, if the given
+	 * text is in this token map.  If it isn't, <code>-1</code> is returned.
+	 *
+	 * @param array1 An array of characters containing the text.
+	 * @param start The starting index in the array of the text.
+	 * @param end The ending index in the array of the text.
+	 * @return The token type associated with the given text, or
+	 *         <code>-1</code> if this token was not specified in this map.
+	 */
+	public int get(char[] array1, int start, int end) {
+
+		int length1 = end - start + 1;
+
+		int hash = getHashCode(array1, start, length1);
+		TokenMapToken token = tokenMap[hash];
+
+		char[] array2;
+		int offset2;
+		int offset1;
+		int length;
+
+		/* We check whether or not to ignore case before doing any looping to
+		 * minimize the number of extraneous comparisons we do.  This makes
+		 * for slightly redundant code, but it'll be a little more efficient.
+		 */
+
+		// If matches are case-sensitive (C, C++, Java, etc.)...
+		if (ignoreCase==false) {
+
+		mainLoop:
+			while (token!=null) {
+				if (token.length==length1) {
+					array2  = token.text;
+					offset2 = token.offset;
+					offset1 = start;
+					length  = length1;
+					while (length-- > 0) {
+						if (array1[offset1++]!=array2[offset2++]) {
+							token = token.nextToken;
+							continue mainLoop;
+						}
+					}
+					return token.tokenType;
+				}
+				token = token.nextToken;
+			}
+
+		}
+
+		// If matches are NOT case-sensitive (HTML)...
+		// Note that all tokens saved in this map were converted to
+		// lower-case already.
+		else {
+
+		mainLoop2:
+			while (token!=null) {
+				if (token.length==length1) {
+					array2  = token.text;
+					offset2 = token.offset;
+					offset1 = start;
+					length  = length1;
+					while (length-- > 0) {
+						if (RSyntaxUtilities.toLowerCase(
+							array1[offset1++]) != array2[offset2++]) {
+							token = token.nextToken;
+							continue mainLoop2;
+						}
+					}
+					return token.tokenType;
+				}
+				token = token.nextToken;
+			}
+
+		}
+
+		// Didn't match any of the tokens in the bucket.
+		return -1;
+
+	}
+
+
+	/**
+	 * Returns the hash code for a given string.
+	 *
+	 * @param text The text to hash.
+	 * @param offset The offset into the text at which to start hashing.
+	 * @param length The last character in the text to hash.
+	 * @return The hash code.
+	 */
+	private final int getHashCode(char[] text, int offset, int length) {
+		return (RSyntaxUtilities.toLowerCase(text[offset]) +
+				RSyntaxUtilities.toLowerCase(text[offset+length-1])) % size;
+	}
+
+
+	/**
+	 * Returns whether this token map ignores case when checking for tokens.
+	 * This property is set in the constructor and cannot be changed, as this
+	 * is an intrinsic property of a particular programming language.
+	 *
+	 * @return Whether or not this token maker is ignoring case.
+	 */
+	protected boolean isIgnoringCase() {
+		return ignoreCase;
+	}
+
+
+	/**
+	 * Adds a string to this token map.
+	 *
+	 * @param string The string to add.
+	 * @param tokenType The type of token the string is.
+	 */
+	public void put(final String string, final int tokenType) {
+		if (isIgnoringCase())
+			put(string.toLowerCase().toCharArray(), tokenType);
+		else
+			put(string.toCharArray(), tokenType);
+	}
+
+
+	/**
+	 * Adds a string to this token map.  The char array passed-in will be used
+	 * as the actual data for the token, so it may well be modified (such as
+	 * lower-casing it if <code>ignoreCase</code> is <code>true</code>).  This
+	 * shouldn't be an issue though as this method is only called from the
+	 * public <code>put</code> method, which allocates a new char array.
+	 *
+	 * @param string The string to add.
+	 * @param tokenType The type of token the string is.
+	 */
+	private void put(char[] string, int tokenType) {
+		int hashCode = getHashCode(string, 0, string.length);
+		addTokenToBucket(hashCode, new TokenMapToken(string, tokenType));
+	}
+
+
+	/**
+	 * The "token" used by a token map.  Note that this isn't the same thing
+	 * as the {@link Token} class, but it's basically a 1-1 correspondence
+	 * for reserved words, etc.
+	 */
+	private static class TokenMapToken {
+
+		char[] text;
+		int offset;
+		int length;
+		int tokenType;
+		TokenMapToken nextToken;
+
+		TokenMapToken(char[] text, int tokenType) {
+			this.text = text;
+			this.offset = 0;
+			this.length = text.length;
+			this.tokenType = tokenType;
+		}
+
+		public String toString() {
+			return "[TokenMapToken: " + new String(text,offset,length) + "]";
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenOrientedView.java b/src/org/fife/ui/rsyntaxtextarea/TokenOrientedView.java
new file mode 100644
index 0000000..a662996
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenOrientedView.java
@@ -0,0 +1,61 @@
+/*
+ * 08/06/2004
+ *
+ * TokenOrientedView.java - An interface for the syntax-highlighting token-
+ * oriented views for token-oriented methods.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * An interface for the syntax-highlighting token oriented views for
+ * token-oriented methods.  This way callers won't need to know what specific
+ * class a view is an instance of to access its tokens.<p>
+ *
+ * Currently, this interface is only useful for obtaining token lists for
+ * "physical lines" (i.e., a word-wrapped view's logical lines may be
+ * represented as several physical lines, thus getting the "physical line" above
+ * a given position may prove complicated).
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public interface TokenOrientedView {
+
+
+	/**
+	 * Returns a token list for the <i>physical</i> line above the physical
+	 * line containing the specified offset into the document.  Note that for
+	 * a plain (non-wrapped) view, this is simply the token list for the
+	 * logical line above the line containing <code>offset</code>, since lines
+	 * are not wrapped.  For a wrapped view, this may or may not be tokens from
+	 * the same line.
+	 *
+	 * @param offset The offset in question.
+	 * @return A token list for the physical (and in this view, logical) line
+	 *         before this one.  If no physical line is above the one
+	 *         containing <code>offset</code>, <code>null</code> is returned.
+	 */
+	public Token getTokenListForPhysicalLineAbove(int offset);
+
+
+	/**
+	 * Returns a token list for the <i>physical</i> line below the physical
+	 * line containing the specified offset into the document.  Note that for
+	 * a plain (non-wrapped) view, this is simply the token list for the
+	 * logical line below the line containing <code>offset</code>, since lines
+	 * are not wrapped.  For a wrapped view, this may or may not be tokens from
+	 * the same line.
+	 *
+	 * @param offset The offset in question.
+	 * @return A token list for the physical (and in this view, logical) line
+	 *         after this one.  If no physical line is after the one
+	 *         containing <code>offset</code>, <code>null</code> is returned.
+	 */
+	public Token getTokenListForPhysicalLineBelow(int offset);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenPainter.java b/src/org/fife/ui/rsyntaxtextarea/TokenPainter.java
new file mode 100644
index 0000000..e8441af
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenPainter.java
@@ -0,0 +1,96 @@
+/*
+ * 03/16/2013
+ *
+ * TokenPainter - Renders tokens in an instance of RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Graphics2D;
+import javax.swing.text.TabExpander;
+
+
+/**
+ * Renders tokens in an instance of {@link RSyntaxTextArea}.  One instance
+ * may render tokens "regularly," another may render visible whitespace, for
+ * example.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+interface TokenPainter {
+
+
+	/**
+	 * Paints this token.
+	 *
+	 * @param token The token to render.
+	 * @param g The graphics context in which to paint.
+	 * @param x The x-coordinate at which to paint.
+	 * @param y The y-coordinate at which to paint.
+	 * @param host The text area this token is in.
+	 * @param e How to expand tabs.
+	 * @return The x-coordinate representing the end of the painted text.
+	 */
+	public float paint(Token token, Graphics2D g, float x, float y,
+						RSyntaxTextArea host, TabExpander e);
+
+
+	/**
+	 * Paints this token.
+	 *
+	 * @param token The token to render.
+	 * @param g The graphics context in which to paint.
+	 * @param x The x-coordinate at which to paint.
+	 * @param y The y-coordinate at which to paint.
+	 * @param host The text area this token is in.
+	 * @param e How to expand tabs.
+	 * @param clipStart The left boundary of the clip rectangle in which we're
+	 *        painting.  This optimizes painting by allowing us to not paint
+	 *        paint when this token is "to the left" of the clip rectangle.
+	 * @return The x-coordinate representing the end of the painted text.
+	 */
+	public float paint(Token token, Graphics2D g, float x, float y,
+			RSyntaxTextArea host, TabExpander e, float clipStart);
+
+
+	/**
+	 * Paints this token as it should appear in a selected region of text
+	 * (assuming painting with a selection-foreground color is enabled in the
+	 * parent <code>RSyntaxTextArea</code>).
+	 *
+	 * @param token The token to render.
+	 * @param g The graphics context in which to paint.
+	 * @param x The x-coordinate at which to paint.
+	 * @param y The y-coordinate at which to paint.
+	 * @param host The text area this token is in.
+	 * @param e How to expand tabs.
+	 * @return The x-coordinate representing the end of the painted text.
+	 */
+	public float paintSelected(Token token, Graphics2D g, float x, float y,
+			RSyntaxTextArea host, TabExpander e);
+
+
+	/**
+	 * Paints this token as it should appear in a selected region of text
+	 * (assuming painting with a selection-foreground color is enabled in the
+	 * parent <code>RSyntaxTextArea</code>).
+	 *
+	 * @param token The token to render.
+	 * @param g The graphics context in which to paint.
+	 * @param x The x-coordinate at which to paint.
+	 * @param y The y-coordinate at which to paint.
+	 * @param host The text area this token is in.
+	 * @param e How to expand tabs.
+	 * @param clipStart The left boundary of the clip rectangle in which we're
+	 *        painting.  This optimizes painting by allowing us to not paint
+	 *        paint when this token is "to the left" of the clip rectangle.
+	 * @return The x-coordinate representing the end of the painted text.
+	 */
+	public float paintSelected(Token token, Graphics2D g, float x, float y,
+			RSyntaxTextArea host, TabExpander e, float clipStart);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenTypes.java b/src/org/fife/ui/rsyntaxtextarea/TokenTypes.java
new file mode 100644
index 0000000..9def2f9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenTypes.java
@@ -0,0 +1,85 @@
+/*
+ * 12/04/2011
+ *
+ * TokenTypes.java - All token types supported by RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * All token types supported by RSyntaxTextArea.<p>
+ *
+ * Note that all valid token types are >= 0, so extensions of the TokenMaker
+ * class are free to internally use all ints < 0 ONLY for "end-of-line"
+ * style markers; they are ignored by painting implementations.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface TokenTypes {
+
+	/**
+	 * Tokens of type <code>NULL</code> mark the end of lines with no
+	 * multi-line token at the end (such as a block comment in C++).
+	 */
+	public static final int NULL							= 0;
+
+	public static final int COMMENT_EOL						= 1;
+	public static final int COMMENT_MULTILINE				= 2;
+	public static final int COMMENT_DOCUMENTATION			= 3;
+	public static final int COMMENT_KEYWORD					= 4;
+	public static final int COMMENT_MARKUP					= 5;
+
+	public static final int RESERVED_WORD					= 6;
+	public static final int RESERVED_WORD_2					= 7;
+
+	public static final int FUNCTION						= 8;
+
+	public static final int LITERAL_BOOLEAN					= 9;
+	public static final int LITERAL_NUMBER_DECIMAL_INT		= 10;
+	public static final int LITERAL_NUMBER_FLOAT			= 11;
+	public static final int LITERAL_NUMBER_HEXADECIMAL		= 12;
+	public static final int LITERAL_STRING_DOUBLE_QUOTE		= 13;
+	public static final int LITERAL_CHAR					= 14;
+	public static final int LITERAL_BACKQUOTE				= 15;
+
+	public static final int DATA_TYPE						= 16;
+
+	public static final int VARIABLE						= 17;
+
+	public static final int REGEX							= 18;
+
+	public static final int ANNOTATION						= 19;
+
+	public static final int IDENTIFIER						= 20;
+
+	public static final int WHITESPACE						= 21;
+
+	public static final int SEPARATOR						= 22;
+
+	public static final int OPERATOR						= 23;
+
+	public static final int PREPROCESSOR					= 24;
+
+	public static final int MARKUP_TAG_DELIMITER			= 25;
+	public static final int MARKUP_TAG_NAME					= 26;
+	public static final int MARKUP_TAG_ATTRIBUTE			= 27;
+	public static final int MARKUP_TAG_ATTRIBUTE_VALUE		= 28;
+	public static final int MARKUP_COMMENT					= 29;
+	public static final int MARKUP_DTD						= 30;
+	public static final int MARKUP_PROCESSING_INSTRUCTION	= 31;
+	public static final int MARKUP_CDATA_DELIMITER			= 32;
+	public static final int MARKUP_CDATA					= 33;
+	public static final int MARKUP_ENTITY_REFERENCE			= 34;
+
+	public static final int ERROR_IDENTIFIER				= 35;
+	public static final int ERROR_NUMBER_FORMAT				= 36;
+	public static final int ERROR_STRING_DOUBLE 			= 37;
+	public static final int ERROR_CHAR						= 38;
+
+	public static final int NUM_TOKEN_TYPES					= 39;
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/URLFileLocation.java b/src/org/fife/ui/rsyntaxtextarea/URLFileLocation.java
new file mode 100644
index 0000000..30c261c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/URLFileLocation.java
@@ -0,0 +1,153 @@
+/*
+ * 11/13/2008
+ *
+ * URLFileLocation.java - The location of a file at a (remote) URL.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URL;
+
+
+/**
+ * The location of a file at a (remote) URL.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class URLFileLocation extends FileLocation {
+
+	/**
+	 * URL of the remote file.
+	 */
+	private URL url;
+
+	/**
+	 * A prettied-up full path of the URL (password removed, etc.).
+	 */
+	private String fileFullPath;
+
+	/**
+	 * A prettied-up filename (leading slash, and possibly "<code>%2F</code>",
+	 * removed).
+	 */
+	private String fileName;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param url The URL of the file.
+	 */
+	URLFileLocation(URL url) {
+		this.url = url;
+		fileFullPath = createFileFullPath();
+		fileName = createFileName();
+	}
+
+
+	/**
+	 * Creates a "prettied-up" URL to use.  This will be stripped of
+	 * sensitive information such as passwords.
+	 *
+	 * @return The full path to use.
+	 */
+	private String createFileFullPath() {
+		String fullPath = url.toString();
+		fullPath = fullPath.replaceFirst("://([^:]+)(?:.+)@", "://$1@");
+		return fullPath;
+	}
+
+
+	/**
+	 * Creates the "prettied-up" filename to use.
+	 *
+	 * @return The base name of the file of this URL.
+	 */
+	private String createFileName() {
+		String fileName = url.getPath();
+		if (fileName.startsWith("/%2F/")) { // Absolute path
+			fileName = fileName.substring(4);
+		}
+		else if (fileName.startsWith("/")) { // All others
+			fileName = fileName.substring(1);
+		}
+		return fileName;
+	}
+
+
+	/**
+	 * Returns the last time this file was modified, or
+	 * {@link TextEditorPane#LAST_MODIFIED_UNKNOWN} if this value cannot be
+	 * computed (such as for a remote file).
+	 *
+	 * @return The last time this file was modified.  This will always be
+	 *         {@link TextEditorPane#LAST_MODIFIED_UNKNOWN} for URL's.
+	 */
+	protected long getActualLastModified() {
+		return TextEditorPane.LAST_MODIFIED_UNKNOWN;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getFileFullPath() {
+		return fileFullPath;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getFileName() {
+		return fileName;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected InputStream getInputStream() throws IOException {
+		return url.openStream();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected OutputStream getOutputStream() throws IOException {
+		return url.openConnection().getOutputStream();
+	}
+
+
+	/**
+	 * Returns whether this file location is a local file.
+	 *
+	 * @return Whether this is a local file.
+	 * @see #isLocalAndExists()
+	 */
+	public boolean isLocal() {
+		return "file".equalsIgnoreCase(url.getProtocol());
+	}
+
+
+	/**
+	 * Returns whether this file location is a local file and already
+	 * exists.  This method always returns <code>false</code> since we
+	 * cannot check this value easily.
+	 *
+	 * @return <code>false</code> always.
+	 * @see #isLocal()
+	 */
+	public boolean isLocalAndExists() {
+		return false;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/VisibleWhitespaceTokenPainter.java b/src/org/fife/ui/rsyntaxtextarea/VisibleWhitespaceTokenPainter.java
new file mode 100644
index 0000000..747986e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/VisibleWhitespaceTokenPainter.java
@@ -0,0 +1,188 @@
+/*
+ * 03/16/2013
+ *
+ * VisibleWhitespaceTokenPainter - Renders tokens in an instance of
+ * RSyntaxTextArea, with special glyphs to denote spaces and tabs.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.awt.Graphics2D;
+import javax.swing.text.TabExpander;
+
+
+/**
+ * A token painter that visibly renders whitespace (spaces and tabs).<p>
+ *
+ * The current implementation paints as follows:
+ * <ul>
+ *   <li>The first tab or space, if any, is found in the token.</li>
+ *   <li>If a tab was found, all characters up to it are painted as a
+ *       group.</li>
+ *   <li>If a space was found, all characters up to and including it are
+ *       painted (it is painted with a special symbol to denote it as
+ *       a space).</li>
+ *   <li>If neither a tab nor a whitespace was found, all characters in the
+ *       token are painted.</li>
+ *   <li>Repeat until all characters are painted.</li>
+ * </ul>
+ * This means that rendering hints are applied to all groups of characters
+ * within a token, excluding whitespace and tabs.<p>
+ *
+ * A problem with this implementation is that FontMetrics.charsWidth() is still
+ * used to calculate the width of a group of chars painted.  Thus, the group of
+ * characters will be painted with the rendering hints specified, but the
+ * following tab (or group of characters if the current group was the end of a
+ * token) will not necessarily be painted at the proper x-coordinate (as
+ * FontMetrics.charsWidth() returns an <code>int</code> and not a
+ * <code>float</code>).  The way around this would be to calculate the token's
+ * width in such a way that a float is returned (Font.getStringBounds()?).
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class VisibleWhitespaceTokenPainter extends DefaultTokenPainter {
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected float paintImpl(Token token, Graphics2D g, float x, float y,
+			RSyntaxTextArea host, TabExpander e, float clipStart,
+			boolean selected) {
+
+		int origX = (int)x;
+		int end = token.textOffset + token.textCount;
+		float nextX = x;
+		int flushLen = 0;
+		int flushIndex = token.textOffset;
+		Color fg, bg;
+		if (selected) {
+			fg = host.getSelectedTextColor();
+			bg = null;
+		}
+		else {
+			fg = host.getForegroundForToken(token);
+			bg = host.getBackgroundForToken(token);
+		}
+		g.setFont(host.getFontForTokenType(token.type));
+		FontMetrics fm = host.getFontMetricsForTokenType(token.type);
+
+		int ascent = fm.getAscent();
+		int height = fm.getHeight();
+
+		for (int i=token.textOffset; i<end; i++) {
+
+			switch (token.text[i]) {
+
+				case '\t':
+
+					// Fill in background.
+					nextX = x+fm.charsWidth(token.text, flushIndex,flushLen);
+					float nextNextX = e.nextTabStop(nextX, 0);
+					if (bg!=null) {
+						paintBackground(x,y, nextNextX-x,height, g,
+										ascent, host, bg, !selected);
+					}
+					g.setColor(fg);
+
+					// Paint chars cached before the tab.
+					if (flushLen > 0) {
+						g.drawChars(token.text, flushIndex, flushLen, (int)x,(int)y);
+						flushLen = 0;
+					}
+					flushIndex = i + 1;
+
+					// Draw an arrow representing the tab.
+					int halfHeight = height / 2;
+					int quarterHeight = halfHeight / 2;
+					int ymid = (int)y - ascent + halfHeight;
+					g.drawLine((int)nextX,ymid, (int)nextNextX,ymid);
+					g.drawLine((int)nextNextX,ymid, (int)nextNextX-4,ymid-quarterHeight);
+					g.drawLine((int)nextNextX,ymid, (int)nextNextX-4,ymid+quarterHeight);
+
+					x = nextNextX;
+					break;
+
+				case ' ':
+
+					// NOTE:  There is a little bit of a "fudge factor"
+					// here when "smooth text" is enabled, as "width"
+					// below may well not be the width given to the space
+					// by fm.charsWidth() (it depends on how it places the
+					// space with respect to the preceding character).
+					// But, we assume the approximation is close enough for
+					// our drawing a dot for the space.
+
+					// "flushLen+1" ensures text is aligned correctly (or,
+					// aligned the same as in getWidth()).
+					nextX = x+fm.charsWidth(token.text, flushIndex,flushLen+1);
+					int width = fm.charWidth(' ');
+
+					// Paint background.
+					if (bg!=null) {
+						paintBackground(x,y, nextX-x,height, g,
+										ascent, host, bg, !selected);
+					}
+					g.setColor(fg);
+
+					// Paint chars before space.
+					if (flushLen>0) {
+						g.drawChars(token.text, flushIndex, flushLen, (int)x,(int)y);
+						flushLen = 0;
+					}
+
+					// Paint a dot representing the space.
+					int dotX = (int)(nextX - width/2f); // "2.0f" for FindBugs
+					int dotY = (int)(y - ascent + height/2f); // Ditto
+					g.drawLine(dotX, dotY, dotX, dotY);
+					flushIndex = i + 1;
+					x = nextX;
+					break;
+
+
+				case '\f':
+					// ???
+					// fall-through for now.
+
+				default:
+					flushLen += 1;
+					break;
+
+			}
+		}
+
+		nextX = x+fm.charsWidth(token.text, flushIndex,flushLen);
+
+		if (flushLen>0 && nextX>=clipStart) {
+			if (bg!=null) {
+				paintBackground(x,y, nextX-x,height, g,
+							ascent, host, bg, !selected);
+			}
+			g.setColor(fg);
+			g.drawChars(token.text, flushIndex, flushLen, (int)x,(int)y);
+		}
+
+		if (host.getUnderlineForToken(token)) {
+			g.setColor(fg);
+			int y2 = (int)(y+1);
+			g.drawLine(origX,y2, (int)nextX,y2);
+		}
+
+		// Don't check if it's whitespace - some TokenMakers may return types
+		// other than Token.WHITESPACE for spaces (such as Token.IDENTIFIER).
+		// This also allows us to paint tab lines for MLC's.
+		if (host.getPaintTabLines() && origX==host.getMargin().left) {// && isWhitespace()) {
+			paintTabLines(token, origX, (int)y, (int)nextX, g, e, host);
+		}
+
+		return nextX;
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView.java b/src/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView.java
new file mode 100644
index 0000000..6f81799
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView.java
@@ -0,0 +1,1372 @@
+/*
+ * 08/06/2004
+ *
+ * WrappedSyntaxView.java - Test implementation of WrappedSyntaxView that
+ * is also aware of RSyntaxTextArea's different fonts per token type.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.*;
+import javax.swing.text.*;
+import javax.swing.text.Position.Bias;
+import javax.swing.event.*;
+
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+import org.fife.ui.rtextarea.Gutter;
+
+
+/**
+ * The view used by {@link RSyntaxTextArea} when word wrap is enabled.
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ */
+public class WrappedSyntaxView extends BoxView implements TabExpander,
+												RSTAView {
+
+	boolean widthChanging;
+	int tabBase;
+	int tabSize;
+    
+	/**
+	 * This is reused to keep from allocating/deallocating.
+	 */
+	private Segment s, drawSeg;
+	
+	/**
+	 * Another variable initialized once to keep from allocating/deallocating.
+	 */
+	private Rectangle tempRect;
+
+	/**
+	 * Cached for each paint() call so each drawView() call has access to it.
+	 */
+	private RSyntaxTextArea host;
+	private FontMetrics metrics;
+	private Token tempToken;
+
+//	/**
+//	 * The end-of-line marker.
+//	 */
+//	private static final char[] eolMarker = { '.' };
+
+	/**
+	 * The width of this view cannot be below this amount, as if the width
+	 * is ever 0 (really a bug), we'll go into an infinite loop.
+	 */
+	private static final int MIN_WIDTH		= 20;
+
+
+	/**
+	 * Creates a new WrappedSyntaxView.  Lines will be wrapped
+	 * on character boundaries.
+	 *
+	 * @param elem the element underlying the view
+	 */
+	public WrappedSyntaxView(Element elem) {
+		super(elem, Y_AXIS);
+		tempToken = new Token();
+		s = new Segment();
+		drawSeg = new Segment();
+		tempRect = new Rectangle();
+	}
+
+
+
+	/**
+	 * This is called by the nested wrapped line
+	 * views to determine the break location.  This can
+	 * be reimplemented to alter the breaking behavior.
+	 * It will either break at word or character boundaries
+	 * depending upon the break argument given at
+	 * construction.
+	 */
+	protected int calculateBreakPosition(int p0, Token tokenList, float x0) {
+//System.err.println("------ beginning calculateBreakPosition() --------");
+		int p = p0;
+		RSyntaxTextArea textArea = (RSyntaxTextArea)getContainer();
+		float currentWidth = getWidth();
+		if (currentWidth==Integer.MAX_VALUE)
+			currentWidth = getPreferredSpan(X_AXIS);
+		// Make sure width>0; this is a huge hack to fix a bug where
+		// loading text into an RTextArea before it is visible if word wrap
+		// is enabled causes an infinite loop in calculateBreakPosition()
+		// because of the 0-width!  We cannot simply check in setSize()
+		// because the width is set to 0 somewhere else too somehow...
+		currentWidth = Math.max(currentWidth, MIN_WIDTH);
+		Token t = tokenList;
+		while (t!=null && t.isPaintable()) {
+// FIXME:  Replace the code below with the commented-out line below.  This will
+// allow long tokens to be broken at embedded spaces (such as MLC's).  But it
+// currently throws BadLocationExceptions sometimes...
+			float tokenWidth = t.getWidth(textArea, this, x0);
+			if (tokenWidth>currentWidth) {
+				// If the current token alone is too long for this line,
+				// break at a character boundary.
+				if (p==p0) {
+					return t.getOffsetBeforeX(textArea, this, 0, currentWidth);
+				}
+				// Return the first non-whitespace char (i.e., don't start
+				// off the continuation of a wrapped line with whitespace).
+				return t.isWhitespace() ? p+t.textCount : p;
+//return getBreakLocation(t, fm, x0, currentWidth, this);
+			}
+			currentWidth -= tokenWidth;
+			x0 += tokenWidth;
+			p += t.textCount;
+//System.err.println("*** *** *** token fit entirely (width==" + tokenWidth + "), adding " + t.textCount + " to p, now p==" + p);
+			t = t.getNextToken();
+		}
+//System.err.println("... ... whole line fits; returning p==" + p);
+//System.err.println("------ ending calculateBreakPosition() --------");
+
+//		return p;
+return p + 1;
+	}
+
+//private int getBreakLocation(Token t, FontMetrics fm, int x0, int x,
+//								TabExpander e) {
+//	Segment s = new Segment();
+//	s.array = t.text;
+//	s.offset = t.textOffset;
+//	s.count = t.textCount;
+//	return t.offset + Utilities.getBreakLocation(s, fm, x0, x, e, t.offset);
+//}
+
+	/**
+	 * Gives notification from the document that attributes were changed
+	 * in a location that this view is responsible for.
+	 *
+	 * @param e the change information from the associated document
+	 * @param a the current allocation of the view
+	 * @param f the factory to use to rebuild if the view has children
+	 * @see View#changedUpdate
+	 */
+	public void changedUpdate(DocumentEvent e, Shape a, ViewFactory f) {
+		updateChildren(e, a);
+	}
+
+
+	/**
+	 * Sets the allocation rectangle for a given line's view, but sets the
+	 * y value to the passed-in value.  This should be used instead of
+	 * {@link #childAllocation(int, Rectangle)} since it allows you to account
+	 * for hidden lines in collapsed fold regions.
+	 *
+	 * @param line
+	 * @param y
+	 * @param alloc
+	 */
+	private void childAllocation2(int line, int y, Rectangle alloc) {
+		alloc.x += getOffset(X_AXIS, line);
+		alloc.y += y;
+		alloc.width = getSpan(X_AXIS, line);
+		alloc.height = getSpan(Y_AXIS, line);
+
+		// FIXME: This is required due to a bug that I can't track down.  The
+		// top margin is being added twice somewhere in wrapped views, so we
+		// have to adjust for it here.
+		alloc.y -= host.getMargin().top;
+
+	}
+
+
+	/**
+	 * Draws a single view (i.e., a line of text for a wrapped view),
+	 * wrapping the text onto multiple lines if necessary.
+	 *
+	 * @param painter The painter to use to render tokens.
+	 * @param g The graphics context in which to paint.
+	 * @param r The rectangle in which to paint.
+	 * @param view The <code>View</code> to paint.
+	 * @param fontHeight The height of the font being used.
+	 * @param y The y-coordinate at which to begin painting.
+	 */
+	protected void drawView(TokenPainter painter, Graphics2D g, Rectangle r,
+							View view, int fontHeight, int y) {
+
+		float x = r.x;
+
+		LayeredHighlighter h = (LayeredHighlighter)host.getHighlighter();
+
+		RSyntaxDocument document = (RSyntaxDocument)getDocument();
+		Element map = getElement();
+
+		int p0 = view.getStartOffset();
+		int lineNumber = map.getElementIndex(p0);
+		int p1 = view.getEndOffset();// - 1;
+
+		setSegment(p0,p1-1, document, drawSeg);
+		//System.err.println("drawSeg=='" + drawSeg + "' (p0/p1==" + p0 + "/" + p1 + ")");
+		int start = p0 - drawSeg.offset;
+		Token token = document.getTokenListForLine(lineNumber);
+
+		// If this line is an empty line, then the token list is simply a
+		// null token.  In this case, the line highlight will be skipped in
+		// the loop below, so unfortunately we must manually do it here.
+		if (token!=null && token.type==Token.NULL) {
+			h.paintLayeredHighlights(g, p0,p1, r, host, this);
+			return;
+		}
+
+		// Loop through all tokens in this view and paint them!
+		while (token!=null && token.isPaintable()) {
+
+			int p = calculateBreakPosition(p0, token, x);
+			x = r.x;
+
+			h.paintLayeredHighlights(g, p0,p, r, host, this);
+
+			while (token!=null && token.isPaintable() && token.offset+token.textCount-1<p) {//<=p) {
+				x = painter.paint(token, g, x,y, host, this);
+				token = token.getNextToken();
+			}
+			
+			if (token!=null && token.isPaintable() && token.offset<p) {
+				int tokenOffset = token.offset;
+				tempToken.set(drawSeg.array, tokenOffset-start, p-1-start,
+						tokenOffset, token.type);
+				painter.paint(tempToken, g, x,y, host, this);
+				token.makeStartAt(p);
+			}
+
+			p0 = (p==p0) ? p1 : p;
+			y += fontHeight;
+			
+		} // End of while (token!=null && token.isPaintable()).
+
+		// NOTE: We should re-use code from Token (paintBackground()) here,
+		// but don't because I'm just too lazy.
+		if (host.getEOLMarkersVisible()) {
+			g.setColor(host.getForegroundForTokenType(Token.WHITESPACE));
+			g.setFont(host.getFontForTokenType(Token.WHITESPACE));
+			g.drawString("\u00B6", x, y-fontHeight);
+		}
+
+	}
+
+
+	/**
+	 * Draws a single view (i.e., a line of text for a wrapped view), wrapping
+	 * the text onto multiple lines if necessary.  Any selected text is
+	 * rendered with the editor's "selected text" color.
+	 *
+	 * @param painter The painter to use to render tokens.
+	 * @param g The graphics context in which to paint.
+	 * @param r The rectangle in which to paint.
+	 * @param view The <code>View</code> to paint.
+	 * @param fontHeight The height of the font being used.
+	 * @param y The y-coordinate at which to begin painting.
+	 * @param selStart The start of the selection.
+	 * @param selEnd The end of the selection.
+	 */
+	protected void drawViewWithSelection(TokenPainter painter, Graphics2D g,
+				Rectangle r, View view, int fontHeight, int y, int selStart,
+				int selEnd) {
+
+		float x = r.x;
+
+		LayeredHighlighter h = (LayeredHighlighter)host.getHighlighter();
+
+		RSyntaxDocument document = (RSyntaxDocument)getDocument();
+		Element map = getElement();
+
+		int p0 = view.getStartOffset();
+		int lineNumber = map.getElementIndex(p0);
+		int p1 = view.getEndOffset();// - 1;
+
+		setSegment(p0,p1-1, document, drawSeg);
+		//System.err.println("drawSeg=='" + drawSeg + "' (p0/p1==" + p0 + "/" + p1 + ")");
+		int start = p0 - drawSeg.offset;
+		Token token = document.getTokenListForLine(lineNumber);
+
+		// If this line is an empty line, then the token list is simply a
+		// null token.  In this case, the line highlight will be skipped in
+		// the loop below, so unfortunately we must manually do it here.
+		if (token!=null && token.type==Token.NULL) {
+			h.paintLayeredHighlights(g, p0,p1, r, host, this);
+			return;
+		}
+
+		// Loop through all tokens in this view and paint them!
+		while (token!=null && token.isPaintable()) {
+
+			int p = calculateBreakPosition(p0, token, x);
+			x = r.x;
+
+			h.paintLayeredHighlights(g, p0,p, r, host, this);
+
+			while (token!=null && token.isPaintable() && token.offset+token.textCount-1<p) {//<=p) {
+
+				// Selection starts in this token
+				if (token.containsPosition(selStart)) {
+
+
+					if (selStart>token.offset) {
+						tempToken.copyFrom(token);
+						tempToken.textCount = selStart - tempToken.offset;
+						x = painter.paint(tempToken,g,x,y,host, this);
+						token.makeStartAt(selStart);
+					}
+
+					int selCount = Math.min(token.textCount, selEnd-token.offset);
+					if (selCount==token.textCount) {
+						x = painter.paintSelected(token, g, x,y, host, this);
+					}
+					else {
+						tempToken.copyFrom(token);
+						tempToken.textCount = selCount;
+						x = painter.paintSelected(tempToken, g, x,y, host, this);
+						token.makeStartAt(token.offset + selCount);
+						x = painter.paint(token, g, x,y, host, this);
+					}
+
+				}
+
+				// Selection ends in this token
+				else if (token.containsPosition(selEnd)) {
+					tempToken.copyFrom(token);
+					tempToken.textCount = selEnd - tempToken.offset;
+					x = painter.paintSelected(tempToken, g, x,y, host, this);
+					token.makeStartAt(selEnd);
+					x = painter.paint(token, g, x,y, host, this);
+				}
+
+				// This token is entirely selected
+				else if (token.offset>=selStart &&
+						(token.offset+token.textCount)<=selEnd) {
+					x = painter.paintSelected(token, g, x,y, host, this);
+				}
+
+				// This token is entirely unselected
+				else {
+					x = painter.paint(token, g, x,y, host, this);
+				}
+
+				token = token.getNextToken();
+
+			}
+
+			// If there's a token that's going to be split onto the next line
+			if (token!=null && token.isPaintable() && token.offset<p) {
+
+				int tokenOffset = token.offset;
+				Token orig = token;
+				token = new Token(drawSeg, tokenOffset-start, p-1-start,
+									tokenOffset, token.type);
+
+				// Selection starts in this token
+				if (token.containsPosition(selStart)) {
+
+					if (selStart>token.offset) {
+						tempToken.copyFrom(token);
+						tempToken.textCount = selStart - tempToken.offset;
+						x = painter.paint(tempToken,g,x,y,host, this);
+						token.makeStartAt(selStart);
+					}
+
+					int selCount = Math.min(token.textCount, selEnd-token.offset);
+					if (selCount==token.textCount) {
+						x = painter.paintSelected(token, g, x,y, host, this);
+					}
+					else {
+						tempToken.copyFrom(token);
+						tempToken.textCount = selCount;
+						x = painter.paintSelected(tempToken, g, x,y, host, this);
+						token.makeStartAt(token.offset + selCount);
+						x = painter.paint(token, g, x,y, host, this);
+					}
+
+				}
+
+				// Selection ends in this token
+				else if (token.containsPosition(selEnd)) {
+					tempToken.copyFrom(token);
+					tempToken.textCount = selEnd - tempToken.offset;
+					x = painter.paintSelected(tempToken, g, x,y, host, this);
+					token.makeStartAt(selEnd);
+					x = painter.paint(token, g, x,y, host, this);
+				}
+
+				// This token is entirely selected
+				else if (token.offset>=selStart &&
+						(token.offset+token.textCount)<=selEnd) {
+					x = painter.paintSelected(token, g, x,y, host, this);
+				}
+
+				// This token is entirely unselected
+				else {
+					x = painter.paint(token, g, x,y, host, this);
+				}
+
+				token = orig;
+				token.makeStartAt(p);
+
+			}
+
+			p0 = (p==p0) ? p1 : p;
+			y += fontHeight;
+			
+		} // End of while (token!=null && token.isPaintable()).
+
+		// NOTE: We should re-use code from Token (paintBackground()) here,
+		// but don't because I'm just too lazy.
+		if (host.getEOLMarkersVisible()) {
+			g.setColor(host.getForegroundForTokenType(Token.WHITESPACE));
+			g.setFont(host.getFontForTokenType(Token.WHITESPACE));
+			g.drawString("\u00B6", x, y-fontHeight);
+		}
+
+	}
+
+
+	/**
+	 * Fetches the allocation for the given child view.<p>
+	 * Overridden to account for code folding.
+	 * 
+	 * @param index The index of the child, >= 0 && < getViewCount().
+	 * @param a The allocation to this view
+	 * @return The allocation to the child; or <code>null</code> if
+	 *         <code>a</code> is <code>null</code>; or <code>null</code> if the
+	 *         layout is invalid
+	 */
+	public Shape getChildAllocation(int index, Shape a) {
+		if (a != null) {
+			Shape ca = getChildAllocationImpl(index, a);
+			if ((ca != null) && (!isAllocationValid())) {
+				// The child allocation may not have been set yet.
+				Rectangle r = (ca instanceof Rectangle) ? (Rectangle) ca : ca
+						.getBounds();
+				if ((r.width == 0) && (r.height == 0)) {
+					return null;
+				}
+			}
+			return ca;
+		}
+		return null;
+	}
+
+	/**
+	 * Fetches the allocation for the given child view to render into.<p>
+	 * Overridden to account for lines hidden by collapsed folded regions.
+	 * 
+	 * @param line The index of the child, >= 0 && < getViewCount()
+	 * @param a The allocation to this view
+	 * @return The allocation to the child
+	 */
+	public Shape getChildAllocationImpl(int line, Shape a) {
+
+		Rectangle alloc = getInsideAllocation(a);
+		host = (RSyntaxTextArea)getContainer();
+		FoldManager fm = host.getFoldManager();
+		int y = alloc.y;
+
+		// TODO: Make cached getOffset() calls for Y_AXIS valid even for
+		// folding, to speed this up!
+		for (int i=0; i<line; i++) {
+			y += getSpan(Y_AXIS, i);
+			Fold fold = fm.getFoldForLine(i);
+			if (fold!=null && fold.isCollapsed()) {
+				i += fold.getCollapsedLineCount();
+			}
+		}
+
+		childAllocation2(line, y, alloc);
+		return alloc;
+
+	}
+
+
+	/**
+	 * Determines the maximum span for this view along an
+	 * axis.  This is implemented to provide the superclass
+	 * behavior after first making sure that the current font
+	 * metrics are cached (for the nested lines which use
+	 * the metrics to determine the height of the potentially
+	 * wrapped lines).
+	 *
+	 * @param axis may be either View.X_AXIS or View.Y_AXIS
+	 * @return  the span the view would like to be rendered into.
+	 *           Typically the view is told to render into the span
+	 *           that is returned, although there is no guarantee.  
+	 *           The parent may choose to resize or break the view.
+	 * @see View#getMaximumSpan
+	 */
+	public float getMaximumSpan(int axis) {
+		updateMetrics();
+		float span = super.getPreferredSpan(axis);
+		if (axis==View.X_AXIS) { // EOL marker
+			span += metrics.charWidth('\u00b6'); // metrics set in updateMetrics
+		}
+		return span;
+	}
+
+
+	/**
+	 * Determines the minimum span for this view along an
+	 * axis.  This is implemented to provide the superclass
+	 * behavior after first making sure that the current font
+	 * metrics are cached (for the nested lines which use
+	 * the metrics to determine the height of the potentially
+	 * wrapped lines).
+	 *
+	 * @param axis may be either View.X_AXIS or View.Y_AXIS
+	 * @return  the span the view would like to be rendered into.
+	 *           Typically the view is told to render into the span
+	 *           that is returned, although there is no guarantee.  
+	 *           The parent may choose to resize or break the view.
+	 * @see View#getMinimumSpan
+	 */
+	public float getMinimumSpan(int axis) {
+		updateMetrics();
+		float span = super.getPreferredSpan(axis);
+		if (axis==View.X_AXIS) { // EOL marker
+			span += metrics.charWidth('\u00b6'); // metrics set in updateMetrics
+		}
+		return span;
+	}
+
+
+	/**
+	 * Determines the preferred span for this view along an
+	 * axis.  This is implemented to provide the superclass
+	 * behavior after first making sure that the current font
+	 * metrics are cached (for the nested lines which use
+	 * the metrics to determine the height of the potentially
+	 * wrapped lines).
+	 *
+	 * @param axis may be either View.X_AXIS or View.Y_AXIS
+	 * @return  the span the view would like to be rendered into.
+	 *           Typically the view is told to render into the span
+	 *           that is returned, although there is no guarantee.  
+	 *           The parent may choose to resize or break the view.
+	 * @see View#getPreferredSpan
+	 */
+	public float getPreferredSpan(int axis) {
+		updateMetrics();
+		float span = 0;
+		if (axis==View.X_AXIS) { // Add EOL marker
+			span = super.getPreferredSpan(axis);
+			span += metrics.charWidth('\u00b6'); // metrics set in updateMetrics
+		}
+		else {
+			span = super.getPreferredSpan(axis);
+			host = (RSyntaxTextArea)getContainer();
+			if (host.isCodeFoldingEnabled()) {
+				// TODO: Cache y-offsets again to speed this up
+				//System.out.println("y-axis baby");
+				int lineCount = host.getLineCount();
+				FoldManager fm = host.getFoldManager();
+				for (int i=0; i<lineCount; i++) {
+					if (fm.isLineHidden(i)) {
+						span -= getSpan(View.Y_AXIS, i);
+					}
+				}
+			}
+		}
+		return span;
+	}
+
+
+	/**
+	 * Returns the tab size set for the document, defaulting to 5.
+	 *
+	 * @return the tab size
+	 */
+	protected int getTabSize() {
+		Integer i = (Integer) getDocument().
+							getProperty(PlainDocument.tabSizeAttribute);
+		int size = (i != null) ? i.intValue() : 5;
+		return size;
+	}
+
+
+	/**
+	 * Overridden to allow for folded regions.
+	 */
+	protected View getViewAtPoint(int x, int y, Rectangle alloc) {
+
+		int lineCount = getViewCount();
+		int curY = alloc.y + getOffset(Y_AXIS, 0); // Always at least 1 line
+		host = (RSyntaxTextArea)getContainer();
+		FoldManager fm = host.getFoldManager();
+
+		for (int line=1; line<lineCount; line++) {
+			int span = getSpan(Y_AXIS, line-1);
+			if (y<curY+span) {
+				childAllocation2(line-1, curY, alloc);
+				return getView(line-1);
+			}
+			curY += span;
+			Fold fold = fm.getFoldForLine(line-1);
+			if (fold!=null && fold.isCollapsed()) {
+				line += fold.getCollapsedLineCount();
+			}
+		}
+
+		// Not found - return last line's view.
+		childAllocation2(lineCount - 1, curY, alloc);
+		return getView(lineCount - 1);
+
+	}
+
+
+	/**
+	 * Gives notification that something was inserted into the 
+	 * document in a location that this view is responsible for.
+	 * This is implemented to simply update the children.
+	 *
+	 * @param changes The change information from the associated document.
+	 * @param a the current allocation of the view
+	 * @param f the factory to use to rebuild if the view has children
+	 * @see View#insertUpdate
+	 */
+	public void insertUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
+		updateChildren(changes, a);
+		Rectangle alloc = ((a != null) && isAllocationValid()) ? 
+									getInsideAllocation(a) : null;
+		int pos = changes.getOffset();
+		View v = getViewAtPosition(pos, alloc);
+		if (v != null)
+			v.insertUpdate(changes, alloc, f);
+	}
+
+
+	/**
+	 * Loads all of the children to initialize the view.
+	 * This is called by the <code>setParent</code> method.
+	 * Subclasses can re-implement this to initialize their
+	 * child views in a different manner.  The default
+	 * implementation creates a child view for each 
+	 * child element.
+	 *
+	 * @param f the view factory
+	 */
+	protected void loadChildren(ViewFactory f) {
+		Element e = getElement();
+		int n = e.getElementCount();
+		if (n > 0) {
+			View[] added = new View[n];
+			for (int i = 0; i < n; i++)
+				added[i] = new WrappedLine(e.getElement(i));
+			replace(0, 0, added);
+		}
+	}
+
+
+	public Shape modelToView(int pos, Shape a, Position.Bias b)
+			throws BadLocationException {
+
+		if (! isAllocationValid()) {
+			Rectangle alloc = a.getBounds();
+			setSize(alloc.width, alloc.height);
+		}
+
+		boolean isBackward = (b == Position.Bias.Backward);
+		int testPos = (isBackward) ? Math.max(0, pos - 1) : pos;
+		if(isBackward && testPos < getStartOffset()) {
+			return null;
+		}
+
+		int vIndex = getViewIndexAtPosition(testPos);
+		if ((vIndex != -1) && (vIndex < getViewCount())) {
+			View v = getView(vIndex);
+			if(v != null && testPos >= v.getStartOffset() &&
+					testPos < v.getEndOffset()) {
+				Shape childShape = getChildAllocation(vIndex, a);
+				if (childShape == null) {
+					// We are likely invalid, fail.
+					return null;
+				}
+				Shape retShape = v.modelToView(pos, childShape, b);
+				if(retShape == null && v.getEndOffset() == pos) {
+					if(++vIndex < getViewCount()) {
+						v = getView(vIndex);
+						retShape = v.modelToView(pos, getChildAllocation(vIndex, a), b);
+					}
+				}
+				return retShape;
+			}
+		}
+
+		throw new BadLocationException("Position not represented by view", pos);
+
+	}
+
+
+	/**
+	 * Provides a mapping, for a given region, from the document model
+	 * coordinate space to the view coordinate space. The specified region is
+	 * created as a union of the first and last character positions.<p>
+	 *
+	 * This is implemented to subtract the width of the second character, as
+	 * this view's <code>modelToView</code> actually returns the width of the
+	 * character instead of "1" or "0" like the View implementations in
+	 * <code>javax.swing.text</code>.  Thus, if we don't override this method,
+	 * the <code>View</code> implementation will return one character's width
+	 * too much for its consumers (implementations of
+	 * <code>javax.swing.text.Highlighter</code>).
+	 *
+	 * @param p0 the position of the first character (>=0)
+	 * @param b0 The bias of the first character position, toward the previous
+	 *        character or the next character represented by the offset, in
+	 *        case the position is a boundary of two views; <code>b0</code>
+	 *        will have one of these values:
+	 * <ul>
+	 *    <li> <code>Position.Bias.Forward</code>
+	 *    <li> <code>Position.Bias.Backward</code>
+	 * </ul>
+	 * @param p1 the position of the last character (>=0)
+	 * @param b1 the bias for the second character position, defined
+	 *		one of the legal values shown above
+	 * @param a the area of the view, which encompasses the requested region
+	 * @return the bounding box which is a union of the region specified
+	 *		by the first and last character positions
+	 * @exception BadLocationException  if the given position does
+	 *   not represent a valid location in the associated document
+	 * @exception IllegalArgumentException if <code>b0</code> or
+	 *		<code>b1</code> are not one of the
+	 *		legal <code>Position.Bias</code> values listed above
+	 * @see View#viewToModel
+	 */
+	public Shape modelToView(int p0, Position.Bias b0,
+							int p1, Position.Bias b1,
+							Shape a) throws BadLocationException {
+
+		Shape s0 = modelToView(p0, a, b0);
+		Shape s1;
+		if (p1 ==getEndOffset()) {
+			try {
+				s1 = modelToView(p1, a, b1);
+			} catch (BadLocationException ble) {
+				s1 = null;
+			}
+			if (s1 == null) {
+				// Assume extends left to right.
+				Rectangle alloc = (a instanceof Rectangle) ? (Rectangle)a :
+								a.getBounds();
+				s1 = new Rectangle(alloc.x + alloc.width - 1, alloc.y,
+								1, alloc.height);
+			}
+		}
+		else {
+			s1 = modelToView(p1, a, b1);
+		}
+		Rectangle r0 = s0.getBounds();
+		Rectangle r1 = (s1 instanceof Rectangle) ? (Rectangle) s1 :
+													s1.getBounds();
+		if (r0.y != r1.y) {
+			// If it spans lines, force it to be the width of the view.
+			Rectangle alloc = (a instanceof Rectangle) ? (Rectangle)a :
+								a.getBounds();
+			r0.x = alloc.x;
+			r0.width = alloc.width;
+		}
+
+		r0.add(r1);
+		// The next line is the only difference between this method and
+		// View's implementation.  We're subtracting the width of the second
+		// character.  This is because this method is used by Highlighter
+		// implementations to get the area to "highlight", and if we don't do
+		// this, one character too many is highlighted thanks to our
+		// modelToView() implementation returning the actual width of the
+		// character requested!
+		if (p1>p0) r0.width -= r1.width;
+		return r0;
+
+	}
+
+
+	/**
+	 * Returns the next tab stop position after a given reference position.
+	 * This implementation does not support things like centering so it
+	 * ignores the tabOffset argument.
+	 *
+	 * @param x the current position >= 0
+	 * @param tabOffset the position within the text stream
+	 *   that the tab occurred at >= 0.
+	 * @return the tab stop, measured in points >= 0
+	 */
+	public float nextTabStop(float x, int tabOffset) {
+		if (tabSize == 0)
+			return x;
+		int ntabs = ((int) x - tabBase) / tabSize;
+		return tabBase + ((ntabs + 1) * tabSize);
+	}
+
+
+	/**
+	 * Paints the word-wrapped text.
+	 *
+	 * @param g The graphics context in which to paint.
+	 * @param a The shape (usually a rectangle) in which to paint.
+	 */
+	public void paint(Graphics g, Shape a) {
+
+		Rectangle alloc = (a instanceof Rectangle) ?
+							(Rectangle)a : a.getBounds();
+		tabBase = alloc.x;
+
+		Graphics2D g2d = (Graphics2D)g;
+		host = (RSyntaxTextArea)getContainer();
+		int ascent = host.getMaxAscent();
+		int fontHeight = host.getLineHeight();
+		FoldManager fm = host.getFoldManager();
+		TokenPainter painter = host.getTokenPainter();
+		Element root = getElement();
+
+		// Whether token styles should always be painted, even in selections
+		int selStart = host.getSelectionStart();
+		int selEnd = host.getSelectionEnd();
+		boolean useSelectedTextColor = host.getUseSelectedTextColor();
+
+		int n = getViewCount();	// Number of lines.
+		int x = alloc.x + getLeftInset();
+		tempRect.y = alloc.y + getTopInset();
+		Rectangle clip = g.getClipBounds();
+		for (int i = 0; i < n; i++) {
+
+			tempRect.x = x + getOffset(X_AXIS, i);
+			//tempRect.y = y + getOffset(Y_AXIS, i);
+			tempRect.width = getSpan(X_AXIS, i);
+			tempRect.height = getSpan(Y_AXIS, i);
+			//System.err.println("For line " + i + ": tempRect==" + tempRect);
+
+			if (tempRect.intersects(clip)) {
+				Element lineElement = root.getElement(i);
+				int startOffset = lineElement.getStartOffset();
+				int endOffset = lineElement.getEndOffset()-1; // Why always "-1"?
+				View view = getView(i);
+				if (!useSelectedTextColor || selStart==selEnd ||
+						(startOffset>=selEnd || endOffset<selStart)) {
+					drawView(painter, g2d, alloc, view, fontHeight,
+							tempRect.y+ascent);
+				}
+				else {
+					//System.out.println("Drawing line with selection: " + i);
+					drawViewWithSelection(painter, g2d, alloc, view, fontHeight,
+							tempRect.y+ascent, selStart, selEnd);
+				}
+			}
+
+			tempRect.y += tempRect.height;
+
+			Fold possibleFold = fm.getFoldForLine(i);
+			if (possibleFold!=null && possibleFold.isCollapsed()) {
+				i += possibleFold.getCollapsedLineCount();
+				// Visible indicator of collapsed lines
+				Color c = RSyntaxUtilities.getFoldedLineBottomColor(host);
+				if (c!=null) {
+					g.setColor(c);
+					g.drawLine(x,tempRect.y-1, alloc.width,tempRect.y-1);
+				}
+			}
+
+		}
+
+	}
+
+
+	/**
+	 * Gives notification that something was removed from the 
+	 * document in a location that this view is responsible for.
+	 * This is implemented to simply update the children.
+	 *
+	 * @param changes The change information from the associated document.
+	 * @param a the current allocation of the view
+	 * @param f the factory to use to rebuild if the view has children
+	 * @see View#removeUpdate
+	 */
+	public void removeUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
+
+		updateChildren(changes, a);
+
+		Rectangle alloc = ((a != null) && isAllocationValid()) ? 
+									getInsideAllocation(a) : null;
+		int pos = changes.getOffset();
+		View v = getViewAtPosition(pos, alloc);
+		if (v != null)
+            v.removeUpdate(changes, alloc, f);
+
+	}
+
+
+	/**
+	 * Makes a <code>Segment</code> point to the text in our
+	 * document between the given positions.  Note that the positions MUST be
+	 * valid positions in the document.
+	 *
+	 * @param p0 The first position in the document.
+	 * @param p1 The second position in the document.
+	 * @param document The document from which you want to get the text.
+	 * @param seg The segment in which to load the text.
+	 */
+	private void setSegment(int p0, int p1, Document document,
+							Segment seg) {
+		try {
+//System.err.println("... in setSharedSegment, p0/p1==" + p0 + "/" + p1);
+			document.getText(p0, p1-p0, seg);
+			//System.err.println("... in setSharedSegment: s=='" + s + "'; line/numLines==" + line + "/" + numLines);
+		} catch (BadLocationException ble) { // Never happens
+			ble.printStackTrace();
+		}
+	}
+
+
+	/**
+	 * Sets the size of the view.  This should cause layout of the view along
+	 * the given axis, if it has any layout duties.
+	 *
+	 * @param width the width >= 0
+	 * @param height the height >= 0
+	 */
+	public void setSize(float width, float height) {
+		updateMetrics();
+		if ((int) width != getWidth()) {
+			// invalidate the view itself since the childrens
+			// desired widths will be based upon this views width.
+			preferenceChanged(null, true, true);
+			widthChanging = true;
+		}
+		super.setSize(width, height);
+		widthChanging = false;
+	}
+
+
+	/**
+	 * Update the child views in response to a 
+	 * document event.
+	 */
+	void updateChildren(DocumentEvent e, Shape a) {
+
+		Element elem = getElement();
+		DocumentEvent.ElementChange ec = e.getChange(elem);
+
+		// This occurs when syntax highlighting only changes on lines
+		// (i.e. beginning a multiline comment).
+		if (e.getType()==DocumentEvent.EventType.CHANGE) {
+			//System.err.println("Updating the damage due to a CHANGE event...");
+			// FIXME:  Make me repaint more intelligently.
+			getContainer().repaint();
+			//damageLineRange(startLine,endLine, a, host);
+		}
+
+		else if (ec != null) {
+
+			// the structure of this element changed.
+			Element[] removedElems = ec.getChildrenRemoved();
+			Element[] addedElems = ec.getChildrenAdded();
+			View[] added = new View[addedElems.length];
+
+			for (int i = 0; i < addedElems.length; i++)
+				added[i] = new WrappedLine(addedElems[i]);
+			//System.err.println("Replacing " + removedElems.length +
+			// " children with " + addedElems.length);
+			replace(ec.getIndex(), removedElems.length, added);
+
+			// should damge a little more intelligently.
+			if (a != null) {
+				preferenceChanged(null, true, true);
+				getContainer().repaint();
+			}
+
+		}
+
+		// update font metrics which may be used by the child views
+		updateMetrics();
+
+	}
+
+
+	final void updateMetrics() {
+		Component host = getContainer();
+		Font f = host.getFont();
+		metrics = host.getFontMetrics(f); // Metrics for the default font.
+		tabSize = getTabSize() * metrics.charWidth('m');
+	}
+
+
+	public int viewToModel(float x, float y, Shape a, Position.Bias[] bias) {
+
+		int offs = -1;
+
+		if (! isAllocationValid()) {
+			Rectangle alloc = a.getBounds();
+			setSize(alloc.width, alloc.height);
+		}
+
+		// Get the child view for the line at (x,y), and ask it for the
+		// specific offset.
+		Rectangle alloc = getInsideAllocation(a);
+		View v = getViewAtPoint((int) x, (int) y, alloc);
+		if (v != null) {
+			offs = v.viewToModel(x, y, alloc, bias);
+		}
+
+		// Code folding may have hidden the last line.  If so, return the last
+		// visible offset instead of the last offset.
+		if (host.isCodeFoldingEnabled() && v==getView(getViewCount()-1) &&
+				offs==v.getEndOffset()-1) {
+			offs = host.getLastVisibleOffset();
+		}
+
+		return offs;
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int yForLine(Rectangle alloc, int line) throws BadLocationException {
+		return yForLineContaining(alloc,
+				getElement().getElement(line).getStartOffset());
+//return alloc.y + getOffset(Y_AXIS, line);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int yForLineContaining(Rectangle alloc, int offs)
+								throws BadLocationException {
+		if (isAllocationValid()) {
+			// TODO: make cached Y_AXIS offsets valid even with folding enabled
+			// to speed this back up!
+			Rectangle r = (Rectangle)modelToView(offs, alloc, Bias.Forward);
+			if (r!=null) {
+				if (host.isCodeFoldingEnabled()) {
+					int line = host.getLineOfOffset(offs);
+					FoldManager fm = host.getFoldManager();
+					if (fm.isLineHidden(line)) {
+						return -1;
+					}
+				}
+				return r.y;
+			}
+		}
+		return -1;
+	}
+
+
+	/**
+	 * Simple view of a line that wraps if it doesn't
+	 * fit within the horizontal space allocated.
+	 * This class tries to be lightweight by carrying little 
+	 * state of it's own and sharing the state of the outer class 
+	 * with it's siblings.
+	 */
+	class WrappedLine extends View {
+
+		int nlines;
+
+		WrappedLine(Element elem) {
+			super(elem);
+		}
+
+		/**
+		 * Calculate the number of lines that will be rendered
+		 * by logical line when it is wrapped.
+		 */
+		final int calculateLineCount() {
+
+			int nlines = 0;
+			int startOffset = getStartOffset();
+			int p1 = getEndOffset();
+
+			// Get the token list for this line so we don't have to keep
+			// recomputing it if this logical line spans multiple physical
+			// lines.
+			RSyntaxTextArea textArea = (RSyntaxTextArea)getContainer();
+			RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+			Element map = doc.getDefaultRootElement();
+			int line = map.getElementIndex(startOffset);
+			Token tokenList = doc.getTokenListForLine(line);
+			float x0 = 0;// FIXME:  should be alloc.x!! alloc.x;//0;
+
+
+//System.err.println(">>> calculateLineCount: " + startOffset + "-" + p1);
+			for (int p0=startOffset; p0<p1; ) {
+//System.err.println("... ... " + p0 + ", " + p1);
+				nlines += 1;
+				x0 = RSyntaxUtilities.makeTokenListStartAt(tokenList, p0,
+							WrappedSyntaxView.this, textArea, x0);
+				int p = calculateBreakPosition(p0, tokenList, x0);
+
+//System.err.println("... ... ... break position p==" + p);
+				p0 = (p == p0) ? ++p : p; // this is the fix of #4410243
+									// we check on situation when
+									// width is too small and
+									// break position is calculated
+									// incorrectly.
+//System.err.println("... ... ... new p0==" + p0);
+			}
+/*
+int numLines = 0;
+try {
+	numLines = textArea.getLineCount();
+} catch (BadLocationException ble) {
+	ble.printStackTrace();
+}
+System.err.println(">>> >>> calculated number of lines for this view (line " + line + "/" + numLines + ": " + nlines);
+*/
+			return nlines;
+		}
+
+		/**
+		 * Determines the preferred span for this view along an
+		 * axis.
+		 *
+		 * @param axis may be either X_AXIS or Y_AXIS
+		 * @return   the span the view would like to be rendered into.
+		 *           Typically the view is told to render into the span
+		 *           that is returned, although there is no guarantee.  
+		 *           The parent may choose to resize or break the view.
+		 * @see View#getPreferredSpan
+		 */
+		public float getPreferredSpan(int axis) {
+			switch (axis) {
+				case View.X_AXIS:
+					float width = getWidth();
+					if (width == Integer.MAX_VALUE) {
+						// We have been initially set to MAX_VALUE, but we don't
+						// want this as our preferred.
+						return 100f;
+					}
+					return width;
+				case View.Y_AXIS:
+					if (nlines == 0 || widthChanging)
+						nlines = calculateLineCount();
+					int h = nlines * ((RSyntaxTextArea)getContainer()).getLineHeight();
+					return h;
+				default:
+					throw new IllegalArgumentException("Invalid axis: " + axis);
+			}
+		}
+
+		/**
+		 * Renders using the given rendering surface and area on that
+		 * surface.  The view may need to do layout and create child
+		 * views to enable itself to render into the given allocation.
+		 *
+		 * @param g the rendering surface to use
+		 * @param a the allocated region to render into
+		 * @see View#paint
+		 */
+		public void paint(Graphics g, Shape a) {
+			// This is done by drawView() above.
+		}
+
+		/**
+		 * Provides a mapping from the document model coordinate space
+		 * to the coordinate space of the view mapped to it.
+		 *
+		 * @param pos the position to convert
+		 * @param a the allocated region to render into
+		 * @return the bounding box of the given position is returned
+		 * @exception BadLocationException  if the given position does not
+		 *            represent a valid location in the associated document.
+		 */
+		public Shape modelToView(int pos, Shape a, Position.Bias b)
+										throws BadLocationException {
+
+			//System.err.println("--- begin modelToView ---");
+			Rectangle alloc = a.getBounds();
+			RSyntaxTextArea textArea = (RSyntaxTextArea)getContainer();
+			alloc.height = textArea.getLineHeight();//metrics.getHeight();
+			alloc.width = 1;
+			int p0 = getStartOffset();
+			int p1 = getEndOffset();
+			int testP = (b == Position.Bias.Forward) ? pos :
+											Math.max(p0, pos - 1);
+
+			// Get the token list for this line so we don't have to keep
+			// recomputing it if this logical line spans multiple physical
+			// lines.
+			RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+			Element map = doc.getDefaultRootElement();
+			int line = map.getElementIndex(p0);
+			Token tokenList = doc.getTokenListForLine(line);
+			float x0 = alloc.x;//0;
+
+			while (p0 < p1) {
+				x0 = RSyntaxUtilities.makeTokenListStartAt(tokenList, p0,
+							WrappedSyntaxView.this, textArea, x0);
+				int p = calculateBreakPosition(p0, tokenList, x0);
+				if ((pos >= p0) && (testP<p)) {//pos < p)) {
+					// it's in this line
+					alloc = RSyntaxUtilities.getLineWidthUpTo(
+									textArea, s, p0, pos,
+									WrappedSyntaxView.this,
+									alloc, alloc.x);
+					//System.err.println("--- end modelToView ---");
+					return alloc;
+				}
+				//if (p == p1 && pos == p1) {
+				if (p==p1-1 && pos==p1-1) {
+					// Wants end.
+					if (pos > p0) {
+						alloc = RSyntaxUtilities.getLineWidthUpTo(
+									textArea, s, p0, pos,
+									WrappedSyntaxView.this,
+									alloc, alloc.x);
+					}
+					//System.err.println("--- end modelToView ---");
+					return alloc;
+				}
+
+				p0 = (p == p0) ? p1 : p;
+				//System.err.println("... ... Incrementing y");
+				alloc.y += alloc.height;
+
+			}
+
+			throw new BadLocationException(null, pos);
+
+		}
+
+		/**
+		 * Provides a mapping from the view coordinate space to the logical
+		 * coordinate space of the model.
+		 *
+		 * @param fx the X coordinate
+		 * @param fy the Y coordinate
+		 * @param a the allocated region to render into
+		 * @return the location within the model that best represents the
+		 *  given point in the view
+		 * @see View#viewToModel
+		 */
+		public int viewToModel(float fx, float fy, Shape a, Position.Bias[] bias) {
+
+			// PENDING(prinz) implement bias properly
+			bias[0] = Position.Bias.Forward;
+
+			Rectangle alloc = (Rectangle) a;
+			RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+			int x = (int) fx;
+			int y = (int) fy;
+			if (y < alloc.y) {
+				// above the area covered by this icon, so the the position
+				// is assumed to be the start of the coverage for this view.
+				return getStartOffset();
+			}
+			else if (y > alloc.y + alloc.height) {
+				// below the area covered by this icon, so the the position
+				// is assumed to be the end of the coverage for this view.
+				return getEndOffset() - 1;
+			}
+			else {
+
+				// positioned within the coverage of this view vertically,
+				// so we figure out which line the point corresponds to.
+				// if the line is greater than the number of lines
+				// contained, then simply use the last line as it represents
+				// the last possible place we can position to.
+
+				RSyntaxTextArea textArea = (RSyntaxTextArea)getContainer();
+				alloc.height = textArea.getLineHeight();
+				int p1 = getEndOffset();
+
+				// Get the token list for this line so we don't have to keep
+				// recomputing it if this logical line spans multiple
+				// physical lines.
+				Element map = doc.getDefaultRootElement();
+				int p0 = getStartOffset();
+				int line = map.getElementIndex(p0);
+				Token tlist = doc.getTokenListForLine(line);
+
+				// Look at each physical line-chunk of this logical line.
+				while (p0<p1) {
+
+					// We can always use alloc.x since we always break
+					// lines so they start at the beginning of a physical
+					// line.
+					RSyntaxUtilities.makeTokenListStartAt(tlist, p0,
+						WrappedSyntaxView.this, textArea, alloc.x);
+					int p = calculateBreakPosition(p0, tlist, alloc.x);
+
+					// If desired view position is in this physical chunk.
+					if ((y>=alloc.y) && (y<(alloc.y+alloc.height))) {
+
+						// Point is to the left of the line
+						if (x < alloc.x) {
+							return p0;
+						}
+
+						// Point is to the right of the line
+						else if (x > alloc.x + alloc.width) {
+							return p - 1;
+						}
+
+						// Point is in this physical line!
+						else {
+
+							// Start at alloc.x since this chunk starts
+							// at the beginning of a physical line.
+							int n = tlist.getListOffset(textArea,
+										WrappedSyntaxView.this,
+										alloc.x, x);
+
+							// NOTE:  We needed to add the max() with
+							// p0 as getTokenListForLine returns -1
+							// for empty lines (just a null token).
+							// How did this work before?
+							// FIXME:  Have null tokens have their
+							// offset but a -1 length.
+							return Math.max(Math.min(n, p1-1), p0);
+
+						}  // End of else.
+
+					} // End of if ((y>=alloc.y) && ...
+
+					p0 = (p == p0) ? p1 : p;
+					alloc.y += alloc.height;
+
+				} // End of while (p0<p1).
+
+				return getEndOffset() - 1;
+
+			} // End of else.
+
+		}
+
+		private void handleDocumentEvent(DocumentEvent e, Shape a,
+											ViewFactory f) {
+			int n = calculateLineCount();
+			if (this.nlines != n) {
+				this.nlines = n;
+				WrappedSyntaxView.this.preferenceChanged(this, false, true);
+				// have to repaint any views after the receiver.
+				RSyntaxTextArea textArea = (RSyntaxTextArea)getContainer();
+				textArea.repaint();
+				// Must also revalidate container so gutter components, such
+				// as line numbers, get updated for this line's new height
+				Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+				if (gutter!=null) {
+					gutter.revalidate();
+					gutter.repaint();
+				}
+			}
+			else if (a != null) {
+				Component c = getContainer();
+				Rectangle alloc = (Rectangle) a;
+				c.repaint(alloc.x, alloc.y, alloc.width, alloc.height);
+			}
+		}
+
+		public void insertUpdate(DocumentEvent e, Shape a, ViewFactory f) {
+			handleDocumentEvent(e, a, f);
+		}
+
+		public void removeUpdate(DocumentEvent e, Shape a, ViewFactory f) {
+			handleDocumentEvent(e, a, f);
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView2.java b/src/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView2.java
new file mode 100644
index 0000000..1910777
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView2.java
@@ -0,0 +1,157 @@
+package org.fife.ui.rsyntaxtextarea;
+
+//import java.awt.Graphics;
+//import java.awt.Rectangle;
+//import java.awt.Shape;
+
+//import javax.swing.text.CompositeView;
+import javax.swing.text.Element;
+//import javax.swing.text.View;
+
+
+/**
+ * Replacement for the old <code>WrappedSyntaxView</code> class, designed to
+ * be faster with large wrapped documents.  Heavily based off of
+ * <code>BoxView</code>, but streamlined to only care about the y-axis, and
+ * takes code folding into account.<p>
+ *
+ * This class is not currently used.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class WrappedSyntaxView2 {//extends CompositeView {
+
+//	private Rectangle tempRect;
+//	private int[] cachedOffsets;
+//	private int[] cachedSpans;
+//	private boolean sizeRequirementsValid;
+
+
+	public WrappedSyntaxView2(Element root) {
+		//super(root);
+//		tempRect = new Rectangle();
+//		cachedOffsets = new int[0];
+//		cachedSpans = new int[0];
+//		sizeRequirementsValid = false;
+	}
+
+
+//	protected void childAllocation(int index, Rectangle alloc) {
+//		alloc.y += getOffset(index);
+//		alloc.height = getHeight(index);
+//	}
+//
+//
+//	private int getHeight(int childIndex) {
+//		return cachedSpans[childIndex];
+//	}
+//
+//
+//	private int getOffset(int childIndex) {
+//		return cachedOffsets[childIndex]; 
+//	}
+//
+//
+//	protected View getViewAtPoint(int x, int y, Rectangle alloc) {
+//		// TODO Auto-generated method stub
+//		return null;
+//	}
+//
+//
+//	/**
+//	 * @param alloc The allocated region; this is the area inside of the insets
+//	 * @return Whether the point lies after the region.
+//	 */
+//	protected boolean isAfter(int x, int y, Rectangle alloc) {
+//		return y > (alloc.y + alloc.height);
+//	}
+//
+//
+//	/**
+//	 * @param alloc The allocated region; this is the area inside of the insets
+//	 * @return Whether the point lies before the region.
+//	 */
+//	protected boolean isBefore(int x, int y, Rectangle alloc) {
+//		return y < alloc.y;
+//	}
+//
+//
+//	public float getPreferredSpan(int axis) {
+//		if (axis==X_AXIS) {
+//			return preferredWidth + getLeftInset() + getRightInset();
+//		}
+//		else {
+//			return preferredHeight + getTopInset() + getBottomInset();
+//		}
+//	}
+//
+//
+//	public void paint(Graphics g, Shape allocation) {
+//
+//		Rectangle alloc = (allocation instanceof Rectangle) ?
+//				(Rectangle)allocation : allocation.getBounds();
+//		int n = getViewCount();
+//
+//		int x = alloc.x + getLeftInset();
+//		int y = alloc.y + getTopInset();
+//		Rectangle clip = g.getClipBounds();
+//		int preferredWidth = (int)getPreferredSpan(X_AXIS);
+//
+//		for (int i = 0; i < n; i++) {
+//			tempRect.x = x;
+//			tempRect.y = y + getOffset(i);
+//			tempRect.width = preferredWidth;
+//			tempRect.height = getHeight(i);
+//			if (tempRect.intersects(clip)) {
+//				paintChild(g, tempRect, i);
+//			}
+//		}
+//
+//	}
+//
+//
+//	/**
+//	 * Called when a child view's preferred span changes.  This invalidates
+//	 * our layout cache and calls the super implementation.
+//	 */
+//	public void preferenceChanged(View child, boolean widthPreferenceChanged,
+//								boolean heightPreferenceChanged) {
+//
+//		if (heightPreferenceChanged) {
+//			sizeRequirementsValid = false;
+////			majorAllocValid = false;
+//		}
+////		if (width) {
+////			minorReqValid = false;
+////			minorAllocValid = false;
+////		}
+//
+//		super.preferenceChanged(child, widthPreferenceChanged, heightPreferenceChanged);
+//
+//	}
+//
+//	public void replace(int index, int length, View[] elems) {
+//
+//		super.replace(index, length, elems);
+//
+//		// Invalidate cache
+//		int insertCount = elems==null ? 0 : elems.length;
+//		cachedOffsets = updateLayoutArray(cachedOffsets, index, insertCount);
+//		majorReqValid = false;
+//		majorAllocValid = false;
+//
+//	}
+//
+//
+//	private int[] updateLayoutArray(int[] oldArray, int offset, int nInserted) {
+//		int n = getViewCount(); // Called after super.replace() so this is accurate
+//		int[] newArray = new int[n];
+//		System.arraycopy(oldArray, 0, newArray, 0, offset);
+//		System.arraycopy(oldArray, offset, 
+//				newArray, offset + nInserted, n - nInserted - offset);
+//		return newArray;
+//	}
+//
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/XmlOccurrenceMarker.java b/src/org/fife/ui/rsyntaxtextarea/XmlOccurrenceMarker.java
new file mode 100644
index 0000000..b780e83
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/XmlOccurrenceMarker.java
@@ -0,0 +1,185 @@
+/*
+ * 03/09/2013
+ *
+ * XmlOccurrenceMarker - Marks occurrences of the current token for XML.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.util.Stack;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Element;
+
+
+/**
+ * Marks occurrences of the current token for XML.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class XmlOccurrenceMarker implements OccurrenceMarker {
+
+	private static final char[] CLOSE_TAG_START = { '<', '/' };
+	private static final char[] TAG_SELF_CLOSE = { '/', '>' };
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void markOccurrences(RSyntaxDocument doc, Token t,
+			RSyntaxTextAreaHighlighter h, MarkOccurrencesHighlightPainter p) {
+
+		char[] lexeme = t.getLexeme().toCharArray();
+		int tokenOffs = t.offset;
+		Element root = doc.getDefaultRootElement();
+		int lineCount = root.getElementCount();
+		int curLine = root.getElementIndex(t.offset);
+
+		// For now, we only check for tags on the current line, for
+		// simplicity.  Tags spanning multiple lines aren't common anyway.
+		boolean found = false;
+		boolean forward = true;
+		t = doc.getTokenListForLine(curLine);
+		while (t!=null && t.isPaintable()) {
+			if (t.type==Token.MARKUP_TAG_DELIMITER) {
+				if (t.isSingleChar('<') && t.offset+1==tokenOffs) {
+					found = true;
+					break;
+				}
+				else if (t.is(CLOSE_TAG_START) && t.offset+2==tokenOffs) {
+					found = true;
+					forward = false;
+					break;
+				}
+			}
+			t = t.getNextToken();
+		}
+
+		if (!found) {
+			return;
+		}
+
+		if (forward) {
+
+			int depth = 0;
+			t = t.getNextToken().getNextToken();
+
+			do {
+
+				while (t!=null && t.isPaintable()) {
+					if (t.type==Token.MARKUP_TAG_DELIMITER) {
+						if (t.isSingleChar('<')) {
+							depth++;
+						}
+						else if (t.is(TAG_SELF_CLOSE)) {
+							if (depth>0) {
+								depth--;
+							}
+							else {
+								return; // No match for this tag
+							}
+						}
+						else if (t.is(CLOSE_TAG_START)) {
+							if (depth>0) {
+								depth--;
+							}
+							else {
+								Token match = t.getNextToken();
+								if (match!=null && match.is(lexeme)) {
+									try {
+										int end = match.offset + match.textCount;
+										h.addMarkedOccurrenceHighlight(match.offset, end, p);
+										end = tokenOffs + match.textCount;
+										h.addMarkedOccurrenceHighlight(tokenOffs, end, p);
+									} catch (BadLocationException ble) {
+										ble.printStackTrace(); // Never happens
+									}
+								}
+								return; // We're done!
+							}
+						}
+					}
+					t = t.getNextToken();
+				}
+
+				if (++curLine<lineCount) {
+					t = doc.getTokenListForLine(curLine);
+				}
+
+			} while (curLine<lineCount);
+				
+
+		}
+
+		else { // !forward
+
+			Stack matches = new Stack();
+			boolean inPossibleMatch = false;
+			t = doc.getTokenListForLine(curLine);
+			final int endBefore = tokenOffs - 2; // Stop before "</".
+
+			do {
+
+				while (t!=null && t.offset<endBefore && t.isPaintable()) {
+					if (t.type==Token.MARKUP_TAG_DELIMITER) {
+						if (t.isSingleChar('<')) {
+							Token next = t.getNextToken();
+							if (next!=null) {
+								if (next.is(lexeme)) {
+									matches.push(next);
+									inPossibleMatch = true;
+								}
+								else {
+									inPossibleMatch = false;
+								}
+								t = next;
+							}
+						}
+						else if (t.isSingleChar('>')) {
+							inPossibleMatch = false;
+						}
+						else if (inPossibleMatch && t.is(TAG_SELF_CLOSE)) {
+							matches.pop();
+						}
+						else if (t.is(CLOSE_TAG_START)) {
+							Token next = t.getNextToken();
+							if (next!=null) {
+								// Invalid XML might not have a match
+								if (next.is(lexeme) && !matches.isEmpty()) {
+									matches.pop();
+								}
+								t = next;
+							}
+						}
+					}
+					t = t.getNextToken();
+				}
+
+				if (!matches.isEmpty()) {
+					try {
+						Token match = (Token)matches.pop();
+						int end = match.offset + match.textCount;
+						h.addMarkedOccurrenceHighlight(match.offset, end, p);
+						end = tokenOffs + match.textCount;
+						h.addMarkedOccurrenceHighlight(tokenOffs, end, p);
+					} catch (BadLocationException ble) {
+						ble.printStackTrace(); // Never happens
+					}
+					return;
+				}
+
+				if (--curLine>=0) {
+					t = doc.getTokenListForLine(curLine);
+				}
+
+			} while (curLine>=0);
+				
+
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.java b/src/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.java
new file mode 100644
index 0000000..da4e6f1
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.java
@@ -0,0 +1,344 @@
+/*
+ * 07/29/2009
+ *
+ * FocusableTip.java - A focusable tool tip, like those in Eclipse.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.focusabletip;
+
+import java.awt.Component;
+import java.awt.ComponentOrientation;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Window;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+import java.net.URL;
+import java.util.ResourceBundle;
+import javax.swing.*;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.event.HyperlinkListener;
+import javax.swing.event.MouseInputAdapter;
+
+import org.fife.ui.rsyntaxtextarea.PopupWindowDecorator;
+
+
+/**
+ * A focusable tool tip, similar to those found in Eclipse.  The user
+ * can click in the tip and it becomes a "real," resizable window.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FocusableTip {
+
+	private JTextArea textArea;
+	private TipWindow tipWindow;
+	private URL imageBase;
+	private TextAreaListener textAreaListener;
+	private HyperlinkListener hyperlinkListener;
+	private String lastText;
+
+	/**
+	 * The screen bounds in which the mouse has to stay for the currently
+	 * displayed tip to stay visible.
+	 */
+	private Rectangle tipVisibleBounds;
+
+	/**
+	 * Margin from mouse cursor at which to draw focusable tip.
+	 */
+	private static final int X_MARGIN = 18;
+
+	/**
+	 * Margin from mouse cursor at which to draw focusable tip.
+	 */
+	private static final int Y_MARGIN = 12;
+
+	private static final String MSG =
+		"org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip";
+	private static final ResourceBundle msg = ResourceBundle.getBundle(MSG);
+
+
+	public FocusableTip(JTextArea textArea, HyperlinkListener listener) {
+		setTextArea(textArea);
+		this.hyperlinkListener = listener;
+		textAreaListener = new TextAreaListener();
+		tipVisibleBounds = new Rectangle();
+	}
+
+
+	/**
+	 * Compute the bounds in which the user can move the mouse without the
+	 * tip window disappearing.
+	 */
+	private void computeTipVisibleBounds() {
+		// Compute area that the mouse can move in without hiding the
+		// tip window. Note that Java 1.4 can only detect mouse events
+		// in Java windows, not globally.
+		Rectangle r = tipWindow.getBounds();
+		Point p = r.getLocation();
+		SwingUtilities.convertPointFromScreen(p, textArea);
+		r.setLocation(p);
+		tipVisibleBounds.setBounds(r.x,r.y-15, r.width,r.height+15*2);
+	}
+
+
+	private void createAndShowTipWindow(final MouseEvent e, final String text) {
+
+		Window owner = SwingUtilities.getWindowAncestor(textArea);
+		tipWindow = new TipWindow(owner, this, text);
+		tipWindow.setHyperlinkListener(hyperlinkListener);
+
+		// Give apps a chance to decorate us with drop shadows, etc.
+		PopupWindowDecorator decorator = PopupWindowDecorator.get();
+		if (decorator!=null) {
+			decorator.decorate(tipWindow);
+		}
+
+		// TODO: Position tip window better (handle RTL, edges of screen, etc.).
+		// Wrap in an invokeLater() to work around a JEditorPane issue where it
+		// doesn't return its proper preferred size until after it is displayed.
+		// See http://forums.sun.com/thread.jspa?forumID=57&threadID=574810
+		// for a discussion.
+		SwingUtilities.invokeLater(new Runnable() {
+			public void run() {
+
+				// If a new FocusableTip is requested while another one is
+				// *focused* and visible, the focused tip (i.e. "tipWindow")
+				// will be disposed of.  If this Runnable is run after the
+				// dispose(), tipWindow will be null.  All of this is done on
+				// the EDT so no synchronization should be necessary.
+				if (tipWindow==null) {
+					return;
+				}
+
+				tipWindow.fixSize();
+				ComponentOrientation o = textArea.getComponentOrientation();
+
+				Point p = e.getPoint();
+				SwingUtilities.convertPointToScreen(p, textArea);
+
+				// Ensure tool tip is in the window bounds.
+				// Multi-monitor support - make sure the completion window (and
+				// description window, if applicable) both fit in the same
+				// window in a multi-monitor environment.  To do this, we decide
+				// which monitor the rectangle "p" is in, and use that one.
+				Rectangle sb = TipUtil.getScreenBoundsForPoint(p.x, p.y);
+				//Dimension ss = tipWindow.getToolkit().getScreenSize();
+
+				// Try putting our stuff "below" the mouse first.
+				int y = p.y + Y_MARGIN;
+				if (y+tipWindow.getHeight()>=sb.y+sb.height) {
+					y = p.y - Y_MARGIN - tipWindow.getHeight();
+				}
+
+				// Get x-coordinate of completions.  Try to align left edge
+				// with the mouse first (with a slight margin).
+				int x = p.x - X_MARGIN; // ltr
+				if (!o.isLeftToRight()) {
+					x = p.x - tipWindow.getWidth() + X_MARGIN;
+				}
+				if (x<sb.x) {
+					x = sb.x;
+				}
+				else if (x+tipWindow.getWidth()>sb.x+sb.width) { // completions don't fit
+					x = sb.x + sb.width - tipWindow.getWidth();
+				}
+
+				tipWindow.setLocation(x, y);
+				tipWindow.setVisible(true);
+
+				computeTipVisibleBounds(); // Do after tip is visible
+				textAreaListener.install(textArea);
+				lastText = text;
+
+			}
+		});
+
+	}
+
+
+	/**
+	 * Returns the base URL to use when loading images in this focusable tip.
+	 *
+	 * @return The base URL to use.
+	 * @see #setImageBase(URL)
+	 */
+	public URL getImageBase() {
+		return imageBase;
+	}
+
+
+	/**
+	 * Returns localized text for the given key.
+	 *
+	 * @param key The key into the resource bundle.
+	 * @return The localized text.
+	 */
+	static String getString(String key) {
+		return msg.getString(key);
+	}
+
+
+	/**
+	 * Disposes of the focusable tip currently displayed, if any.
+	 */
+	public void possiblyDisposeOfTipWindow() {
+		if (tipWindow != null) {
+			tipWindow.dispose();
+			tipWindow = null;
+			textAreaListener.uninstall();
+			tipVisibleBounds.setBounds(-1, -1, 0, 0);
+			lastText = null;
+			textArea.requestFocus();
+		}
+	}
+
+
+	void removeListeners() {
+		//System.out.println("DEBUG: Removing text area listeners");
+		textAreaListener.uninstall();
+	}
+
+
+	/**
+	 * Sets the base URL to use when loading images in this focusable tip.
+	 * 
+	 * @param url The base URL to use.
+	 * @see #getImageBase()
+	 */
+	public void setImageBase(URL url) {
+		imageBase = url;
+	}
+
+
+	private void setTextArea(JTextArea textArea) {
+		this.textArea = textArea;
+		// Is okay to do multiple times.
+		ToolTipManager.sharedInstance().registerComponent(textArea);
+	}
+
+
+	public void toolTipRequested(MouseEvent e, String text) {
+
+		if (text==null || text.length()==0) {
+			possiblyDisposeOfTipWindow();
+			lastText = text;
+			return;
+		}
+
+		if (lastText==null || text.length()!=lastText.length()
+				|| !text.equals(lastText)) {
+			possiblyDisposeOfTipWindow();
+			createAndShowTipWindow(e, text);
+		}
+
+	}
+
+
+	private class TextAreaListener extends MouseInputAdapter implements
+			CaretListener, ComponentListener, FocusListener, KeyListener {
+
+		public void caretUpdate(CaretEvent e) {
+			Object source = e.getSource();
+			if (source == textArea) {
+				possiblyDisposeOfTipWindow();
+			}
+		}
+
+		public void componentHidden(ComponentEvent e) {
+			handleComponentEvent(e);
+		}
+
+		public void componentMoved(ComponentEvent e) {
+			handleComponentEvent(e);
+		}
+
+		public void componentResized(ComponentEvent e) {
+			handleComponentEvent(e);
+		}
+
+		public void componentShown(ComponentEvent e) {
+			handleComponentEvent(e);
+		}
+
+		public void focusGained(FocusEvent e) {
+		}
+
+		public void focusLost(FocusEvent e) {
+			// Only dispose of tip if it wasn't the TipWindow that was clicked
+			// "c" can be null, at least on OS X, so we must check that before
+			// calling SwingUtilities.getWindowAncestor() to guard against an
+			// NPE.
+			Component c = e.getOppositeComponent();
+			boolean tipClicked = (c instanceof TipWindow) ||
+				(c!=null &&
+					SwingUtilities.getWindowAncestor(c) instanceof TipWindow);
+			if (!tipClicked) {
+				possiblyDisposeOfTipWindow();
+			}
+		}
+
+		private void handleComponentEvent(ComponentEvent e) {
+			possiblyDisposeOfTipWindow();
+		}
+
+		public void install(JTextArea textArea) {
+			textArea.addCaretListener(this);
+			textArea.addComponentListener(this);
+			textArea.addFocusListener(this);
+			textArea.addKeyListener(this);
+			textArea.addMouseListener(this);
+			textArea.addMouseMotionListener(this);
+		}
+
+		public void keyPressed(KeyEvent e) {
+			if (e.getKeyCode()==KeyEvent.VK_ESCAPE) {
+				possiblyDisposeOfTipWindow();
+			}
+			else if (e.getKeyCode()==KeyEvent.VK_F2) {
+				if (tipWindow!=null && !tipWindow.getFocusableWindowState()) {
+					tipWindow.actionPerformed(null);
+					e.consume(); // Don't do bookmarking stuff
+				}
+			}
+		}
+
+		public void keyReleased(KeyEvent e) {
+		}
+
+		public void keyTyped(KeyEvent e) {
+		}
+
+		public void mouseExited(MouseEvent e) {
+			// possiblyDisposeOfTipWindow();
+		}
+
+		public void mouseMoved(MouseEvent e) {
+			if (tipVisibleBounds==null ||
+					!tipVisibleBounds.contains(e.getPoint())) {
+				possiblyDisposeOfTipWindow();
+			}
+		}
+
+		public void uninstall() {
+			textArea.removeCaretListener(this);
+			textArea.removeComponentListener(this);
+			textArea.removeFocusListener(this);
+			textArea.removeKeyListener(this);
+			textArea.removeMouseListener(this);
+			textArea.removeMouseMotionListener(this);
+		}
+
+	}
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/focusabletip/SizeGrip.java b/src/org/fife/ui/rsyntaxtextarea/focusabletip/SizeGrip.java
new file mode 100644
index 0000000..6c5479e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/focusabletip/SizeGrip.java
@@ -0,0 +1,249 @@
+/*
+ * 12/23/2008
+ *
+ * SizeGrip.java - A size grip component that sits at the bottom of the window,
+ * allowing the user to easily resize that window.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.focusabletip;
+
+import java.awt.Color;
+import java.awt.ComponentOrientation;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.Point;
+import java.awt.Window;
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import javax.imageio.ImageIO;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.event.MouseInputAdapter;
+
+
+/**
+ * A component that allows its parent window to be resizable, similar to the
+ * size grip seen on status bars.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class SizeGrip extends JPanel {
+
+	/**
+	 * The size grip to use if we're on OS X.
+	 */
+	private Image osxSizeGrip;
+
+
+	public SizeGrip() {
+		MouseHandler adapter = new MouseHandler();
+		addMouseListener(adapter);
+		addMouseMotionListener(adapter);
+		setPreferredSize(new Dimension(16, 16));
+	}
+
+
+	/**
+	 * Overridden to ensure that the cursor for this component is appropriate
+	 * for the orientation.
+	 *
+	 * @param o The new orientation.
+	 */
+	public void applyComponentOrientation(ComponentOrientation o) {
+		possiblyFixCursor(o.isLeftToRight());
+		super.applyComponentOrientation(o);
+	}
+
+
+	/**
+	 * Creates and returns the OS X size grip image.
+	 *
+	 * @return The OS X size grip.
+	 */
+	private Image createOSXSizeGrip() {
+		ClassLoader cl = getClass().getClassLoader();
+		URL url = cl.getResource("org/fife/ui/rsyntaxtextarea/focusabletip/osx_sizegrip.png");
+		if (url==null) {
+			// We're not running in a jar - we may be debugging in Eclipse,
+			// for example
+			File f = new File("../RSyntaxTextArea/src/org/fife/ui/rsyntaxtextarea/focusabletip/osx_sizegrip.png");
+			if (f.isFile()) {
+				try {
+					url = f.toURI().toURL();
+				} catch (MalformedURLException mue) { // Never happens
+					mue.printStackTrace();
+					return null;
+				}
+			}
+			else {
+				return null; // Can't find resource or image file
+			}
+		}
+		Image image = null;
+		try {
+			image = ImageIO.read(url);
+		} catch (IOException ioe) { // Never happens
+			ioe.printStackTrace();
+		}
+		return image;
+	}
+
+
+	/**
+	 * Paints this panel.
+	 *
+	 * @param g The graphics context.
+	 */
+	protected void paintComponent(Graphics g) {
+
+		super.paintComponent(g);
+
+		Dimension dim = getSize();
+
+		if (osxSizeGrip!=null) {
+			g.drawImage(osxSizeGrip, dim.width-16, dim.height-16, null);
+			return;
+		}
+
+		Color c1 = UIManager.getColor("Label.disabledShadow");
+		Color c2 = UIManager.getColor("Label.disabledForeground");
+		ComponentOrientation orientation = getComponentOrientation();
+
+		if (orientation.isLeftToRight()) {
+			int width = dim.width  -= 3;
+			int height = dim.height -= 3;
+			g.setColor(c1);
+			g.fillRect(width-9,height-1, 3,3);
+			g.fillRect(width-5,height-1, 3,3);
+			g.fillRect(width-1,height-1, 3,3);
+			g.fillRect(width-5,height-5, 3,3);
+			g.fillRect(width-1,height-5, 3,3);
+			g.fillRect(width-1,height-9, 3,3);
+			g.setColor(c2);
+			g.fillRect(width-9,height-1, 2,2);
+			g.fillRect(width-5,height-1, 2,2);
+			g.fillRect(width-1,height-1, 2,2);
+			g.fillRect(width-5,height-5, 2,2);
+			g.fillRect(width-1,height-5, 2,2);
+			g.fillRect(width-1,height-9, 2,2);
+		}
+		else {
+			int height = dim.height -= 3;
+			g.setColor(c1);
+			g.fillRect(10,height-1, 3,3);
+			g.fillRect(6,height-1, 3,3);
+			g.fillRect(2,height-1, 3,3);
+			g.fillRect(6,height-5, 3,3);
+			g.fillRect(2,height-5, 3,3);
+			g.fillRect(2,height-9, 3,3);
+			g.setColor(c2);
+			g.fillRect(10,height-1, 2,2);
+			g.fillRect(6,height-1, 2,2);
+			g.fillRect(2,height-1, 2,2);
+			g.fillRect(6,height-5, 2,2);
+			g.fillRect(2,height-5, 2,2);
+			g.fillRect(2,height-9, 2,2);
+		}
+
+	}
+
+
+	/**
+	 * Ensures that the cursor for this component is appropriate for the
+	 * orientation.
+	 *
+	 * @param ltr Whether the current component orientation is LTR.
+	 */
+	protected void possiblyFixCursor(boolean ltr) {
+		int cursor = Cursor.NE_RESIZE_CURSOR;
+		if (ltr) {
+			cursor = Cursor.NW_RESIZE_CURSOR;
+		}
+		if (cursor!=getCursor().getType()) {
+			setCursor(Cursor.getPredefinedCursor(cursor));
+		}
+	}
+
+
+	public void updateUI() {
+		super.updateUI();
+		// TODO: Key off of Aqua LaF, not just OS X, as this size grip looks
+		// bad on other LaFs on Mac such as Nimbus.
+		if (System.getProperty("os.name").indexOf("OS X")>-1) {
+			if (osxSizeGrip==null) {
+				osxSizeGrip = createOSXSizeGrip();
+			}
+		}
+		else { // Clear memory in case of runtime LaF change.
+			osxSizeGrip = null;
+		}
+
+	}
+
+
+	/**
+	 * Listens for mouse events on this panel and resizes the parent window
+	 * appropriately.
+	 */
+	/*
+	 * NOTE: We use SwingUtilities.convertPointToScreen() instead of just using
+	 * the locations relative to the corner component because the latter proved
+	 * buggy - stretch the window too wide and some kind of arithmetic error
+	 * started happening somewhere - our window would grow way too large.
+	 */
+	private class MouseHandler extends MouseInputAdapter {
+
+		private Point origPos;
+
+		public void mouseDragged(MouseEvent e) {
+			Point newPos = e.getPoint();
+			SwingUtilities.convertPointToScreen(newPos, SizeGrip.this);
+			int xDelta = newPos.x - origPos.x;
+			int yDelta = newPos.y - origPos.y;
+			Window wind = SwingUtilities.getWindowAncestor(SizeGrip.this);
+			if (wind!=null) { // Should always be true
+				if (getComponentOrientation().isLeftToRight()) {
+					int w = wind.getWidth();
+					if (newPos.x>=wind.getX()) {
+						w += xDelta;
+					}
+					int h = wind.getHeight();
+					if (newPos.y>=wind.getY()) {
+						h += yDelta;
+					}
+					wind.setSize(w,h);
+				}
+				else { // RTL
+					int newW = Math.max(1, wind.getWidth()-xDelta);
+					int newH = Math.max(1, wind.getHeight()+yDelta);
+					wind.setBounds(newPos.x, wind.getY(), newW, newH);
+				}
+				// invalidate()/validate() needed pre-1.6.
+				wind.invalidate();
+				wind.validate();
+			}
+			origPos.setLocation(newPos);
+		}
+
+		public void mousePressed(MouseEvent e) {
+			origPos = e.getPoint();
+			SwingUtilities.convertPointToScreen(origPos, SizeGrip.this);
+		}
+
+		public void mouseReleased(MouseEvent e) {
+			origPos = null;
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/focusabletip/TipUtil.java b/src/org/fife/ui/rsyntaxtextarea/focusabletip/TipUtil.java
new file mode 100644
index 0000000..c8027ff
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/focusabletip/TipUtil.java
@@ -0,0 +1,226 @@
+/*
+ * 08/13/2009
+ *
+ * TipUtil.java - Utility methods for homemade tool tips.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.focusabletip;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.Rectangle;
+import java.awt.SystemColor;
+import javax.swing.BorderFactory;
+import javax.swing.JEditorPane;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import javax.swing.plaf.ColorUIResource;
+import javax.swing.text.html.HTMLDocument;
+
+
+/**
+ * Static utility methods for focusable tips.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class TipUtil {
+
+
+	private TipUtil() {
+	}
+
+
+	/**
+	 * Returns a hex string for the specified color, suitable for HTML.
+	 *
+	 * @param c The color.
+	 * @return The string representation, in the form "<code>#rrggbb</code>",
+	 *         or <code>null</code> if <code>c</code> is <code>null</code>.
+	 */
+	private static final String getHexString(Color c) {
+
+		if (c==null) {
+			return null;
+		}
+
+		StringBuffer sb = new StringBuffer("#");
+		int r = c.getRed();
+		if (r<16) {
+			sb.append('0');
+		}
+		sb.append(Integer.toHexString(r));
+		int g = c.getGreen();
+		if (g<16) {
+			sb.append('0');
+		}
+		sb.append(Integer.toHexString(g));
+		int b = c.getBlue();
+		if (b<16) {
+			sb.append('0');
+		}
+		sb.append(Integer.toHexString(b));
+
+		return sb.toString();
+
+	}
+
+
+	/**
+	 * Returns the screen coordinates for the monitor that contains the
+	 * specified point.  This is useful for setups with multiple monitors,
+	 * to ensure that popup windows are positioned properly.
+	 *
+	 * @param x The x-coordinate, in screen coordinates.
+	 * @param y The y-coordinate, in screen coordinates.
+	 * @return The bounds of the monitor that contains the specified point.
+	 */
+	public static Rectangle getScreenBoundsForPoint(int x, int y) {
+		GraphicsEnvironment env = GraphicsEnvironment.
+										getLocalGraphicsEnvironment();
+		GraphicsDevice[] devices = env.getScreenDevices();
+		for (int i=0; i<devices.length; i++) {
+			GraphicsConfiguration[] configs = devices[i].getConfigurations();
+			for (int j=0; j<configs.length; j++) {
+				Rectangle gcBounds = configs[j].getBounds();
+				if (gcBounds.contains(x, y)) {
+					return gcBounds;
+				}
+			}
+		}
+		// If point is outside all monitors, default to default monitor (?)
+		return env.getMaximumWindowBounds();
+	}
+
+
+	/**
+	 * Returns the default background color to use for tool tip windows.
+	 *
+	 * @return The default background color.
+	 */
+	public static Color getToolTipBackground() {
+
+		Color c = UIManager.getColor("ToolTip.background");
+
+		// Tooltip.background is wrong color on Nimbus (!)
+		boolean isNimbus = isNimbusLookAndFeel();
+		if (c==null || isNimbus) {
+			c = UIManager.getColor("info"); // Used by Nimbus (and others)
+			if (c==null || (isNimbus && isDerivedColor(c))) {
+				c = SystemColor.info; // System default
+			}
+		}
+
+		// Workaround for a bug (?) with Nimbus - calling JLabel.setBackground()
+		// with a ColorUIResource does nothing, must be a normal Color
+		if (c instanceof ColorUIResource) {
+			c = new Color(c.getRGB());
+		}
+
+		return c;
+
+	}
+
+
+	/**
+	 * Returns the border used by tool tips in this look and feel.
+	 *
+	 * @return The border.
+	 */
+	public static Border getToolTipBorder() {
+
+		Border border = UIManager.getBorder("ToolTip.border");
+
+		if (border==null || isNimbusLookAndFeel()) {
+			border = UIManager.getBorder("nimbusBorder");
+			if (border==null) {
+				border = BorderFactory.createLineBorder(SystemColor.controlDkShadow);
+			}
+		}
+
+		return border;
+
+	}
+
+
+	/**
+	 * Returns whether a color is a Nimbus DerivedColor, which is troublesome
+	 * in that it doesn't use its RGB values (uses HSB instead?) and so
+	 * querying them is useless.
+	 *
+	 * @param c The color to check.
+	 * @return Whether it is a DerivedColor
+	 */
+	private static final boolean isDerivedColor(Color c) {
+		return c!=null && c.getClass().getName().endsWith(".DerivedColor");
+	}
+
+
+	/**
+	 * Returns whether the Nimbus Look and Feel is installed.
+	 *
+	 * @return Whether the current LAF is Nimbus.
+	 */
+	private static final boolean isNimbusLookAndFeel() {
+		return UIManager.getLookAndFeel().getName().equals("Nimbus");
+	}
+
+
+	/**
+	 * Tweaks a <code>JEditorPane</code> so it can be used to render the
+	 * content in a focusable pseudo-tool tip.  It is assumed that the editor
+	 * pane is using an <code>HTMLDocument</code>.
+	 *
+	 * @param textArea The editor pane to tweak.
+	 */
+	public static void tweakTipEditorPane(JEditorPane textArea) {
+
+		// Jump through a few hoops to get things looking nice in Nimbus
+		boolean isNimbus = isNimbusLookAndFeel();
+		if (isNimbus) {
+			Color selBG = textArea.getSelectionColor();
+			Color selFG = textArea.getSelectedTextColor();
+			textArea.setUI(new javax.swing.plaf.basic.BasicEditorPaneUI());
+			textArea.setSelectedTextColor(selFG);
+			textArea.setSelectionColor(selBG);
+		}
+
+		textArea.setEditable(false); // Required for links to work!
+		textArea.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+
+		// Make selection visible even though we are not (initially) focusable.
+		textArea.getCaret().setSelectionVisible(true);
+
+		// Set the foreground color.  Important because when rendering HTML,
+		// default foreground becomes black, which may not match all LAF's
+		// (e.g. Substance).
+		Color fg = UIManager.getColor("Label.foreground");
+		if (fg==null || (isNimbus && isDerivedColor(fg))) {
+			fg = SystemColor.textText;
+		}
+		textArea.setForeground(fg);
+
+		// Make it use the "tool tip" background color.
+		textArea.setBackground(TipUtil.getToolTipBackground());
+
+		// Force JEditorPane to use a certain font even in HTML.
+		// All standard LookAndFeels, even Nimbus (!), define Label.font.
+		Font font = UIManager.getFont("Label.font");
+		if (font == null) { // Try to make a sensible default
+			font = new Font("SansSerif", Font.PLAIN, 12);
+		}
+		HTMLDocument doc = (HTMLDocument) textArea.getDocument();
+		doc.getStyleSheet().addRule(
+				"body { font-family: " + font.getFamily() +
+						"; font-size: " + font.getSize() + "pt" +
+						"; color: " + getHexString(fg) + "; }");
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/focusabletip/TipWindow.java b/src/org/fife/ui/rsyntaxtextarea/focusabletip/TipWindow.java
new file mode 100644
index 0000000..fa568aa
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/focusabletip/TipWindow.java
@@ -0,0 +1,334 @@
+/*
+ * 07/29/2009
+ *
+ * TipWindow.java - The actual window component representing the tool tip.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.focusabletip;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import javax.swing.BorderFactory;
+import javax.swing.JEditorPane;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
+import javax.swing.JWindow;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkListener;
+import javax.swing.event.MouseInputAdapter;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.html.HTMLDocument;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
+
+
+/**
+ * The actual tool tip component.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class TipWindow extends JWindow implements ActionListener {
+
+	private FocusableTip ft;
+	private JEditorPane textArea;
+	private String text;
+	private TipListener tipListener;
+	private HyperlinkListener userHyperlinkListener;
+
+	private static TipWindow visibleInstance;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param owner The parent window.
+	 * @param msg The text of the tool tip.  This can be HTML.
+	 */
+	public TipWindow(Window owner, FocusableTip ft, String msg) {
+
+		super(owner);
+		this.ft = ft;
+		// Render plain text tool tips correctly.
+		if (msg!=null && msg.length()>=6 &&
+				!msg.substring(0,6).toLowerCase().equals("<html>")) {
+			msg = "<html>" + RSyntaxUtilities.escapeForHtml(msg, "<br>", false);
+		}
+		this.text = msg;
+		tipListener = new TipListener();
+
+		JPanel cp = new JPanel(new BorderLayout());
+		cp.setBorder(TipUtil.getToolTipBorder());
+		cp.setBackground(TipUtil.getToolTipBackground());
+		textArea = new JEditorPane("text/html", text);
+		TipUtil.tweakTipEditorPane(textArea);
+		if (ft.getImageBase()!=null) { // Base URL for images
+			((HTMLDocument)textArea.getDocument()).setBase(ft.getImageBase());
+		}
+		textArea.addMouseListener(tipListener);
+		textArea.addHyperlinkListener(new HyperlinkListener() {
+			public void hyperlinkUpdate(HyperlinkEvent e) {
+				if (e.getEventType()==HyperlinkEvent.EventType.ACTIVATED) {
+					TipWindow.this.ft.possiblyDisposeOfTipWindow();
+				}
+			}
+		});
+		cp.add(textArea);
+
+		setFocusableWindowState(false);
+		setContentPane(cp);
+		setBottomPanel(); // Must do after setContentPane()
+		pack();
+
+		// InputMap/ActionMap combo doesn't work for JWindows (even when
+		// using the JWindow's JRootPane), so we'll resort to KeyListener
+		KeyAdapter ka = new KeyAdapter() {
+			public void keyPressed(KeyEvent e) {
+				if (e.getKeyCode()==KeyEvent.VK_ESCAPE) {
+					TipWindow.this.ft.possiblyDisposeOfTipWindow();
+				}
+			}
+		};
+		addKeyListener(ka);
+		textArea.addKeyListener(ka);
+
+		// Ensure only 1 TipWindow is ever visible.  If the caller does what
+		// they're supposed to and only creates these on the EDT, the
+		// synchronization isn't necessary, but we'll be extra safe.
+		synchronized (TipWindow.class) {
+			if (visibleInstance!=null) {
+				visibleInstance.dispose();
+			}
+			visibleInstance = this;
+		}
+
+	}
+
+
+	public void actionPerformed(ActionEvent e) {
+
+		if (!getFocusableWindowState()) {
+			setFocusableWindowState(true);
+			setBottomPanel();
+			textArea.removeMouseListener(tipListener);
+			pack();
+			addWindowFocusListener(new WindowAdapter() {
+				public void windowLostFocus(WindowEvent e) {
+					ft.possiblyDisposeOfTipWindow();
+				}
+			});
+			ft.removeListeners();
+			if (e==null) { // Didn't get here via our mouseover timer
+				requestFocus();
+			}
+		}
+
+	}
+
+
+	/**
+	 * Disposes of this window.
+	 */
+	public void dispose() {
+		//System.out.println("[DEBUG]: Disposing...");
+		Container cp = getContentPane();
+		for (int i=0; i<cp.getComponentCount(); i++) {
+			// Okay if listener is already removed
+			cp.getComponent(i).removeMouseListener(tipListener);
+		}
+		ft.removeListeners();
+		super.dispose();
+	}
+
+
+	/**
+	 * Workaround for JEditorPane not returning its proper preferred size
+	 * when rendering HTML until after layout already done.  See
+	 * http://forums.sun.com/thread.jspa?forumID=57&threadID=574810 for a
+	 * discussion.
+	 */
+	void fixSize() {
+
+		Dimension d = textArea.getPreferredSize();
+		Rectangle r = null;
+		try {
+
+			// modelToView call is required for this hack, never remove!
+			r = textArea.modelToView(textArea.getDocument().getLength()-1);
+
+			// Ensure the text area doesn't start out too tall or wide.
+			d = textArea.getPreferredSize();
+			d.width += 25; // Just a little extra space
+			final int MAX_WINDOW_W = 600;
+			d.width = Math.min(d.width, MAX_WINDOW_W);
+			d.height = Math.min(d.height, 400);
+
+			// Both needed for modelToView() calculation below...
+			textArea.setPreferredSize(d);
+			textArea.setSize(d);
+
+			// if the new textArea width causes our text to wrap, we must
+			// compute a new preferred size to get all our physical lines.
+			r = textArea.modelToView(textArea.getDocument().getLength()-1);
+			if (r.y+r.height>d.height) {
+				d.height = r.y + r.height + 5;
+				textArea.setPreferredSize(d);
+			}
+
+		} catch (BadLocationException ble) { // Never happens
+			ble.printStackTrace();
+		}
+
+		pack(); // Must re-pack to calculate proper size.
+
+	}
+
+
+	public String getText() {
+		return text;
+	}
+
+
+	private void setBottomPanel() {
+
+		final JPanel panel = new JPanel(new BorderLayout());
+		panel.add(new JSeparator(), BorderLayout.NORTH);
+
+		boolean focusable = getFocusableWindowState();
+		if (focusable) {
+			SizeGrip sg = new SizeGrip();
+			sg.applyComponentOrientation(sg.getComponentOrientation()); // Workaround
+			panel.add(sg, BorderLayout.LINE_END);
+			MouseInputAdapter adapter = new MouseInputAdapter() {
+				private Point lastPoint;
+				public void mouseDragged(MouseEvent e) {
+					Point p = e.getPoint();
+					SwingUtilities.convertPointToScreen(p, panel);
+					if (lastPoint==null) {
+						lastPoint = p;
+					}
+					else {
+						int dx = p.x - lastPoint.x;
+						int dy = p.y - lastPoint.y;
+						setLocation(getX()+dx, getY()+dy);
+						lastPoint = p;
+					}
+				}
+				public void mousePressed(MouseEvent e) {
+					lastPoint = e.getPoint();
+					SwingUtilities.convertPointToScreen(lastPoint, panel);
+				}
+			};
+			panel.addMouseListener(adapter);
+			panel.addMouseMotionListener(adapter);
+			// Don't add tipListener to the panel or SizeGrip
+		}
+		else {
+			panel.setOpaque(false);
+			JLabel label = new JLabel(FocusableTip.getString("FocusHotkey"));
+			Color fg = UIManager.getColor("Label.disabledForeground");
+			Font font = textArea.getFont();
+			font = font.deriveFont(font.getSize2D() - 1.0f);
+			label.setFont(font);
+			if (fg==null) { // Non BasicLookAndFeel-derived Looks
+				fg = Color.GRAY;
+			}
+			label.setOpaque(true);
+			Color bg = TipUtil.getToolTipBackground();
+			label.setBackground(bg);
+			label.setForeground(fg);
+			label.setHorizontalAlignment(SwingConstants.TRAILING);
+			label.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
+			panel.add(label);
+			panel.addMouseListener(tipListener);
+		}
+
+		// Replace the previous SOUTH Component with the new one.
+		Container cp = getContentPane();
+		if (cp.getComponentCount()==2) { // Skip first time through
+			Component comp = cp.getComponent(0);
+			cp.remove(0);
+			JScrollPane sp = new JScrollPane(comp);
+			Border emptyBorder = BorderFactory.createEmptyBorder();
+			sp.setBorder(emptyBorder);
+			sp.setViewportBorder(emptyBorder);
+			sp.setBackground(textArea.getBackground());
+			sp.getViewport().setBackground(textArea.getBackground());
+			cp.add(sp);
+			// What was component 1 is now 0.
+			cp.getComponent(0).removeMouseListener(tipListener);
+			cp.remove(0);
+		}
+
+		cp.add(panel, BorderLayout.SOUTH);
+
+	}
+
+
+	/**
+	 * Sets the listener for hyperlink events in this tip window.
+	 *
+	 * @param listener The new listener.  The old listener (if any) is
+	 *        removed.  A value of <code>null</code> means "no listener."
+	 */
+	public void setHyperlinkListener(HyperlinkListener listener) {
+		// We've added a separate listener, so remove only the user's.
+		if (userHyperlinkListener!=null) {
+			textArea.removeHyperlinkListener(userHyperlinkListener);
+		}
+		userHyperlinkListener = listener;
+		if (userHyperlinkListener!=null) {
+			textArea.addHyperlinkListener(userHyperlinkListener);
+		}
+	}
+
+
+	/**
+	 * Listens for events in this window.
+	 */
+	private class TipListener extends MouseAdapter {
+
+		public TipListener() {
+		}
+
+		public void mousePressed(MouseEvent e) {
+			actionPerformed(null); // Manually create "real" window
+		}
+
+		public void mouseExited(MouseEvent e) {
+			// Since we registered this listener on the child components of
+			// the JWindow, not the JWindow iteself, we have to be careful.
+			Component source = (Component)e.getSource();
+			Point p = e.getPoint();
+			SwingUtilities.convertPointToScreen(p, source);
+			if (!TipWindow.this.getBounds().contains(p)) {
+				ft.possiblyDisposeOfTipWindow();
+			}
+		}
+
+	}
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/focusabletip/osx_sizegrip.png b/src/org/fife/ui/rsyntaxtextarea/focusabletip/osx_sizegrip.png
new file mode 100644
index 0000000..07fa8b1
Binary files /dev/null and b/src/org/fife/ui/rsyntaxtextarea/focusabletip/osx_sizegrip.png differ
diff --git a/src/org/fife/ui/rsyntaxtextarea/focusabletip/package.html b/src/org/fife/ui/rsyntaxtextarea/focusabletip/package.html
new file mode 100644
index 0000000..f271f6d
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/focusabletip/package.html
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	An implementation of a focusable tooltip. 
+	</body>
+</html>
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/CurlyFoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/CurlyFoldParser.java
new file mode 100644
index 0000000..832121a
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/CurlyFoldParser.java
@@ -0,0 +1,317 @@
+/*
+ * 10/08/2011
+ *
+ * CurlyFoldParser.java - Fold parser for languages with C-style syntax.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+import org.fife.ui.rsyntaxtextarea.TokenMaker;
+
+
+/**
+ * A basic fold parser that can be used for languages such as C, that use
+ * curly braces to denote code blocks.  This parser searches for curly brace
+ * pairs and creates code folds out of them.  It can also optionally find
+ * C-style multi-line comments ("<code>/* ... */</code>") and make them
+ * foldable as well.<p>
+ * 
+ * This parser knows nothing about language semantics; it uses
+ * <code>RSyntaxTextArea</code>'s syntax highlighting tokens to identify
+ * curly braces.  By default, it looks for single-char tokens of type
+ * {@link Token#SEPARATOR}, with lexemes '<code>{</code>' or '<code>}</code>'.
+ * If your {@link TokenMaker} uses a different token type for curly braces, you
+ * should override the {@link #isLeftCurly(Token)} and
+ * {@link #isRightCurly(Token)} methods with your own definitions.  In theory,
+ * you could extend this fold parser to parse languages that use completely
+ * different tokens than curly braces to denote foldable regions by overriding
+ * those two methods.<p>
+ *
+ * Note also that this class may impose somewhat of a performance penalty on
+ * large source files, since it re-parses the entire document each time folds
+ * are reevaluated.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class CurlyFoldParser implements FoldParser {
+
+	/**
+	 * Whether to scan for C-style multi-line comments and make them foldable.
+	 */
+	private boolean foldableMultiLineComments;
+
+	/**
+	 * Whether this parser is folding Java.
+	 */
+	private final boolean java;
+
+	/**
+	 * Used to find import statements when folding Java code.
+	 */
+	private static final char[] KEYWORD_IMPORT = "import".toCharArray();
+
+	/**
+	 * Ending of a multi-line comment in C, C++, Java, etc.
+	 */
+	protected static final char[] C_MLC_END = "*/".toCharArray();
+
+
+	/**
+	 * Creates a fold parser that identifies foldable regions via curly braces
+	 * as well as C-style multi-line comments.
+	 */
+	public CurlyFoldParser() {
+		this(true, false);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cStyleMultiLineComments Whether to scan for C-style multi-line
+	 *        comments and make them foldable.
+	 * @param java Whether this parser is folding Java.  This adds extra
+	 *        parsing rules, such as grouping all import statements into a
+	 *        fold section.
+	 */
+	public CurlyFoldParser(boolean cStyleMultiLineComments, boolean java) {
+		this.foldableMultiLineComments = cStyleMultiLineComments;
+		this.java = java;
+	}
+
+
+	/**
+	 * Returns whether multi-line comments are foldable with this parser.
+	 *
+	 * @return Whether multi-line comments are foldable.
+	 * @see #setFoldableMultiLineComments(boolean)
+	 */
+	public boolean getFoldableMultiLineComments() {
+		return foldableMultiLineComments;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public List getFolds(RSyntaxTextArea textArea) {
+
+		List folds = new ArrayList();
+
+		Fold currentFold = null;
+		int lineCount = textArea.getLineCount();
+		boolean inMLC = false;
+		int mlcStart = 0;
+		int importStartLine = -1;
+		int lastSeenImportLine = -1;
+		int importGroupStartOffs = -1;
+		int importGroupEndOffs = -1;
+
+		try {
+
+			for (int line=0; line<lineCount; line++) {
+
+				Token t = textArea.getTokenListForLine(line);
+				while (t!=null && t.isPaintable()) {
+
+					if (getFoldableMultiLineComments() && t.isComment()) {
+
+						// Java-specific stuff
+						if (java) {
+
+							if (importStartLine>-1) {
+								if (lastSeenImportLine>importStartLine) {
+									Fold fold = null;
+									// Any imports found *should* be a top-level fold,
+									// but we're extra lenient here and allow groups
+									// of them anywhere to keep our parser better-behaved
+									// if they have random "imports" throughout code.
+									if (currentFold==null) {
+										fold = new Fold(FoldType.IMPORTS,
+												textArea, importGroupStartOffs);
+										folds.add(fold);
+									}
+									else {
+										fold = currentFold.createChild(FoldType.IMPORTS,
+												importGroupStartOffs);
+									}
+									fold.setEndOffset(importGroupEndOffs);
+								}
+								importStartLine = lastSeenImportLine =
+								importGroupStartOffs = importGroupEndOffs = -1;
+							}
+
+						}
+
+						if (inMLC) {
+							// If we found the end of an MLC that started
+							// on a previous line...
+							if (t.endsWith(C_MLC_END)) {
+								int mlcEnd = t.offset + t.textCount - 1;
+								if (currentFold==null) {
+									currentFold = new Fold(FoldType.COMMENT, textArea, mlcStart);
+									currentFold.setEndOffset(mlcEnd);
+									folds.add(currentFold);
+									currentFold = null;
+								}
+								else {
+									currentFold = currentFold.createChild(FoldType.COMMENT, mlcStart);
+									currentFold.setEndOffset(mlcEnd);
+									currentFold = currentFold.getParent();
+								}
+								//System.out.println("Ending MLC at: " + mlcEnd + ", parent==" + currentFold);
+								inMLC = false;
+								mlcStart = 0;
+							}
+							// Otherwise, this MLC is continuing on to yet
+							// another line.
+						}
+						else {
+							// If we're an MLC that ends on a later line...
+							if (t.type!=Token.COMMENT_EOL && !t.endsWith(C_MLC_END)) {
+								//System.out.println("Starting MLC at: " + t.offset);
+								inMLC = true;
+								mlcStart = t.offset;
+							}
+						}
+
+					}
+
+					else if (isLeftCurly(t)) {
+
+						// Java-specific stuff
+						if (java) {
+
+							if (importStartLine>-1) {
+								if (lastSeenImportLine>importStartLine) {
+									Fold fold = null;
+									// Any imports found *should* be a top-level fold,
+									// but we're extra lenient here and allow groups
+									// of them anywhere to keep our parser better-behaved
+									// if they have random "imports" throughout code.
+									if (currentFold==null) {
+										fold = new Fold(FoldType.IMPORTS,
+												textArea, importGroupStartOffs);
+										folds.add(fold);
+									}
+									else {
+										fold = currentFold.createChild(FoldType.IMPORTS,
+												importGroupStartOffs);
+									}
+									fold.setEndOffset(importGroupEndOffs);
+								}
+								importStartLine = lastSeenImportLine =
+								importGroupStartOffs = importGroupEndOffs = -1;
+							}
+
+						}
+
+						if (currentFold==null) {
+							currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+							folds.add(currentFold);
+						}
+						else {
+							currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+						}
+
+					}
+
+					else if (isRightCurly(t)) {
+
+						if (currentFold!=null) {
+							currentFold.setEndOffset(t.offset);
+							Fold parentFold = currentFold.getParent();
+							//System.out.println("... Adding regular fold at " + t.offset + ", parent==" + parentFold);
+							// Don't add fold markers for single-line blocks
+							if (currentFold.isOnSingleLine()) {
+								if (!currentFold.removeFromParent()) {
+									folds.remove(folds.size()-1);
+								}
+							}
+							currentFold = parentFold;
+						}
+
+					}
+
+					// Java-specific folding rules
+					else if (java) {
+
+						if (t.is(Token.RESERVED_WORD, KEYWORD_IMPORT)) {
+							if (importStartLine==-1) {
+								importStartLine = line;
+								importGroupStartOffs = t.offset;
+								importGroupEndOffs = t.offset;
+							}
+							lastSeenImportLine = line;
+						}
+
+						else if (importStartLine>-1 &&
+								t.isIdentifier() &&//SEPARATOR &&
+								t.isSingleChar(';')) {
+							importGroupEndOffs = t.offset;
+						}
+
+					}
+
+					t = t.getNextToken();
+
+				}
+
+			}
+
+		} catch (BadLocationException ble) { // Should never happen
+			ble.printStackTrace();
+		}
+
+		return folds;
+
+	}
+
+
+	/**
+	 * Returns whether the token is a left curly brace.  This method exists
+	 * so subclasses can provide their own curly brace definition.
+	 *
+	 * @param t The token.
+	 * @return Whether it is a left curly brace.
+	 * @see #isRightCurly(Token)
+	 */
+	public boolean isLeftCurly(Token t) {
+		return t.isLeftCurly();
+	}
+
+
+	/**
+	 * Returns whether the token is a right curly brace.  This method exists
+	 * so subclasses can provide their own curly brace definition.
+	 *
+	 * @param t The token.
+	 * @return Whether it is a right curly brace.
+	 * @see #isLeftCurly(Token)
+	 */
+	public boolean isRightCurly(Token t) {
+		return t.isRightCurly();
+	}
+
+
+	/**
+	 * Sets whether multi-line comments are foldable with this parser.
+	 *
+	 * @param foldable Whether multi-line comments are foldable.
+	 * @see #getFoldableMultiLineComments()
+	 */
+	public void setFoldableMultiLineComments(boolean foldable) {
+		this.foldableMultiLineComments = foldable;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/Fold.java b/src/org/fife/ui/rsyntaxtextarea/folding/Fold.java
new file mode 100644
index 0000000..b449711
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/Fold.java
@@ -0,0 +1,564 @@
+/*
+ * 10/08/2011
+ *
+ * Fold.java - A foldable region of text in an RSyntaxTextArea instance.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Element;
+import javax.swing.text.Position;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+
+
+/**
+ * Information about a foldable region.<p>
+ * 
+ * A <code>Fold</code> has zero or more children, and <code>Folds</code> thus
+ * form a hierarchical structure, with "parent" folds containing the info about
+ * any "child" folds they contain.<p>
+ *
+ * Fold regions are denoted by a starting and ending offset, but the actual
+ * folding is done on a per-line basis, so <code>Fold</code> instances provide
+ * methods for retrieving both starting and ending offsets and lines.  The
+ * starting and ending offsets/lines are "sticky" and correctly track their
+ * positions even as the document is modified.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class Fold implements Comparable {
+
+	private int type;
+	private RSyntaxTextArea textArea;
+	private Position startOffs;
+	private Position endOffs;
+	private Fold parent;
+	private List children;
+	private boolean collapsed;
+	private int childCollapsedLineCount;
+
+	private int lastStartOffs = -1;
+	private int cachedStartLine;
+
+	private int lastEndOffs = -1;
+	private int cachedEndLine;
+
+
+	public Fold(int type, RSyntaxTextArea textArea, int startOffs)
+					throws BadLocationException {
+		this.type = type;
+		this.textArea = textArea;
+		this.startOffs = textArea.getDocument().createPosition(startOffs);
+	}
+
+
+	/**
+	 * Creates a fold that is a child of this one.
+	 *
+	 * @param type The type of fold.
+	 * @param startOffs The starting offset of the fold.
+	 * @return The child fold.
+	 * @throws BadLocationException If <code>startOffs</code> is invalid.
+	 * @see FoldType
+	 */
+	public Fold createChild(int type, int startOffs) throws BadLocationException {
+		Fold child = new Fold(type, textArea, startOffs);
+		child.parent = this;
+		if (children==null) {
+			children = new ArrayList();
+		}
+		children.add(child);
+		return child;
+	}
+
+
+	/**
+	 * Two folds are considered equal if they start at the same offset.
+	 *
+	 * @param otherFold Another fold to compare this one to.
+	 * @return How this fold compares to the other.
+	 */
+	public int compareTo(Object otherFold) {
+		int result = -1;
+		if (otherFold instanceof Fold) {
+			result = startOffs.getOffset() - ((Fold)otherFold).startOffs.getOffset();
+			//result = getStartLine() - ((Fold)otherFold).getStartLine();
+		}
+		return result;
+	}
+
+
+	/**
+	 * Returns whether the specified line would be hidden in this fold.  Since
+	 * RSTA displays the "first" line in a fold, this means that the line must
+	 * must be between <code>(getStartLine()+1)</code> and
+	 * <code>getEndLine()</code>, inclusive.
+	 * 
+	 * @param line The line to check.
+	 * @return Whether the line would be hidden if this fold is collapsed.
+	 * @see #containsOffset(int)
+	 * @see #containsOrStartsOnLine(int)
+	 */
+	public boolean containsLine(int line) {
+		return line>getStartLine() && line<=getEndLine();
+	}
+
+
+	/**
+	 * Returns whether the given line is in the range
+	 * <code>[getStartLine(), getEndLine()]</code>, inclusive.
+	 *
+	 * @param line The line to check.
+	 * @return Whether this fold contains, or starts on, the line.
+	 * @see #containsLine(int)
+	 */
+	public boolean containsOrStartsOnLine(int line) {
+		return line>=getStartLine() && line<=getEndLine();
+	}
+
+
+	/**
+	 * Returns whether the specified offset is "inside" the fold.  This method
+	 * returns <code>true</code> if the offset is greater than the fold start
+	 * offset, and no further than the last offset of the last folded line.
+	 *
+	 * @param offs The offset to check.
+	 * @return Whether the offset is "inside" the fold.
+	 * @see #containsLine(int)
+	 */
+	public boolean containsOffset(int offs) {
+		boolean contained = false;
+		if (offs>getStartOffset()) {
+			// Use Elements to avoid BadLocationExceptions
+			Element root = textArea.getDocument().getDefaultRootElement();
+			int line = root.getElementIndex(offs);
+			contained = line<=getEndLine();
+		}
+		return contained;
+	}
+
+
+	/**
+	 * Two folds are considered equal if they have the same starting offset.
+	 *
+	 * @param otherFold Another fold to compare this one to.
+	 * @return Whether the two folds are equal.
+	 * @see #compareTo(Object)
+	 */
+	public boolean equals(Object otherFold) {
+		return compareTo(otherFold)==0;
+	}
+
+
+	/**
+	 * Returns a specific child fold.
+	 *
+	 * @param index The index of the child fold.
+	 * @return The child fold.
+	 * @see #getChildCount()
+	 */
+	public Fold getChild(int index) {
+		return (Fold)children.get(index);
+	}
+
+
+	/**
+	 * Returns the number of child folds.
+	 *
+	 * @return The number of child folds.
+	 * @see #getChild(int)
+	 */
+	public int getChildCount() {
+		return children==null ? 0 : children.size();
+	}
+
+
+	/**
+	 * Returns the array of child folds.  This is a shallow copy.
+	 *
+	 * @return The array of child folds, or <code>null</code> if there are
+	 *         none.
+	 */
+	List getChildren() {
+		return children;
+	}
+
+
+	/**
+	 * Returns the number of collapsed lines under this fold.  If this fold
+	 * is collapsed, this method returns {@link #getLineCount()}, otherwise
+	 * it returns the sum of all collapsed lines of all child folds of this
+	 * one.<p>
+	 *
+	 * The value returned is cached, so this method returns quickly and
+	 * shouldn't affect performance.
+	 *
+	 * @return The number of collapsed lines under this fold.
+	 */
+	public int getCollapsedLineCount() {
+		return collapsed ? getLineCount() : childCollapsedLineCount;
+	}
+
+
+	/**
+	 * Returns the "deepest" fold containing the specified offset.  It is
+	 * assumed that it's already been verified that <code>offs</code> is indeed
+	 * contained in this fold.
+	 *
+	 * @param offs The offset.
+	 * @return The fold, or <code>null</code> if no child fold also contains
+	 *         the offset.
+	 * @see FoldManager#getDeepestFoldContaining(int)
+	 */
+	Fold getDeepestFoldContaining(int offs) {
+		Fold deepestFold = this;
+		for (int i=0; i<getChildCount(); i++) {
+			Fold fold = getChild(i);
+			if (fold.containsOffset(offs)) {
+				deepestFold = fold.getDeepestFoldContaining(offs);
+				break;
+			}
+		}
+		return deepestFold;
+	}
+
+
+	/**
+	 * Returns the "deepest" open fold containing the specified offset.  It
+	 * is assumed that it's already been verified that <code>offs</code> is
+	 * indeed contained in this fold.
+	 *
+	 * @param offs The offset.
+	 * @return The fold, or <code>null</code> if no open fold contains the
+	 *         offset.
+	 * @see FoldManager#getDeepestOpenFoldContaining(int)
+	 */
+	Fold getDeepestOpenFoldContaining(int offs) {
+
+		Fold deepestFold = this;
+
+		for (int i=0; i<getChildCount(); i++) {
+			Fold fold = getChild(i);
+			if (fold.containsOffset(offs)) {
+				if (fold.isCollapsed()) {
+					break;
+				}
+				deepestFold = fold.getDeepestOpenFoldContaining(offs);
+				break;
+			}
+		}
+
+		return deepestFold;
+
+	}
+
+
+	/**
+	 * Returns the end line of this fold.  For example, in languages such as
+	 * C and Java, this might be the line containing the closing curly brace of
+	 * a code block.<p>
+	 *
+	 * The value returned by this method will automatically update as the
+	 * text area's contents are modified, to track the ending line of the
+	 * code block.
+	 *
+	 * @return The end line of this code block.
+	 * @see #getEndOffset()
+	 * @see #getStartLine()
+	 */
+	public int getEndLine() {
+		int endOffs = getEndOffset();
+		if (lastEndOffs==endOffs) {
+			return cachedEndLine;
+		}
+		lastEndOffs = endOffs;
+		Element root = textArea.getDocument().getDefaultRootElement();
+		return cachedEndLine = root.getElementIndex(endOffs);
+	}
+
+
+	/**
+	 * Returns the end offset of this fold.  For example, in languages such as
+	 * C and Java, this might be the offset of the closing curly brace of a
+	 * code block.<p>
+	 *
+	 * The value returned by this method will automatically update as the
+	 * text area's contents are modified, to track the ending offset of the
+	 * code block.
+	 *
+	 * @return The end offset of this code block, or {@link Integer#MAX_VALUE}
+	 *         if this fold region isn't closed properly.  The latter causes
+	 *         this fold to collapsed all lines through the end of the file.
+	 * @see #getEndLine()
+	 * @see #getStartOffset()
+	 */
+	public int getEndOffset() {
+		return endOffs!=null ? endOffs.getOffset() : Integer.MAX_VALUE;
+	}
+
+
+	/**
+	 * Returns the type of fold this is.  This will be one of the values in
+	 * {@link FoldType}, or a user-defined value.
+	 *
+	 * @return The type of fold this is.
+	 */
+	public int getFoldType() {
+		return type;
+	}
+
+
+	/**
+	 * Returns whether this fold has any child folds.
+	 *
+	 * @return Whether this fold has any children.
+	 * @see #getChildCount()
+	 */
+	public boolean getHasChildFolds() {
+		return getChildCount()>0;
+	}
+
+
+	/**
+	 * Returns the last child fold.
+	 *
+	 * @return The last child fold, or <code>null</code> if this fold does not
+	 *         have any children.
+	 * @see #getChild(int)
+	 * @see #getHasChildFolds()
+	 */
+	public Fold getLastChild() {
+		int childCount = getChildCount();
+		return childCount==0 ? null : getChild(childCount-1);
+	}
+
+
+	/**
+	 * Returns the number of lines that are hidden when this fold is
+	 * collapsed.
+	 *
+	 * @return The number of lines hidden.
+	 * @see #getStartLine()
+	 * @see #getEndLine()
+	 */
+	public int getLineCount() {
+		return getEndLine() - getStartLine();
+	}
+
+
+	/**
+	 * Returns the parent fold of this one.
+	 *
+	 * @return The parent fold, or <code>null</code> if this is a top-level
+	 *         fold.
+	 */
+	public Fold getParent() {
+		return parent;
+	}
+
+
+	/**
+	 * Returns the starting line of this fold region.  This is the only line
+	 * in the fold region that is not hidden when a fold is collapsed.<p>
+	 *
+	 * The value returned by this method will automatically update as the
+	 * text area's contents are modified, to track the starting line of the
+	 * code block.
+	 *
+	 * @return The starting line of the code block.
+	 * @see #getEndLine()
+	 * @see #getStartOffset()
+	 */
+	public int getStartLine() {
+		int startOffs = getStartOffset();
+		if (lastStartOffs==startOffs) {
+			return cachedStartLine;
+		}
+		lastStartOffs = startOffs;
+		Element root = textArea.getDocument().getDefaultRootElement();
+		return cachedStartLine = root.getElementIndex(startOffs);
+	}
+
+
+	/**
+	 * Returns the starting offset of this fold region.  For example, for
+	 * languages such as C and Java, this would be the offset of the opening
+	 * curly brace of a code block.<p>
+	 *
+	 * The value returned by this method will automatically update as the
+	 * text area's contents are modified, to track the starting offset of the
+	 * code block.
+	 *
+	 * @return The start offset of this fold.
+	 * @see #getStartLine()
+	 * @see #getEndOffset()
+	 */
+	public int getStartOffset() {
+		return startOffs.getOffset();
+	}
+
+
+	public int hashCode() {
+		return getStartLine();
+	}
+
+
+	/**
+	 * Returns whether this fold is collapsed.
+	 *
+	 * @return Whether this fold is collapsed.
+	 * @see #setCollapsed(boolean)
+	 * @see #toggleCollapsedState()
+	 */
+	public boolean isCollapsed() {
+		return collapsed;
+	}
+
+
+	/**
+	 * Returns whether this fold is entirely on a single line.  In general,
+	 * a {@link FoldParser} should not remember fold regions all on a single
+	 * line, since there's really nothing to fold.
+	 *
+	 * @return Whether this fold is on a single line.
+	 * @see #removeFromParent()
+	 */
+	public boolean isOnSingleLine() {
+		return getStartLine()==getEndLine();
+	}
+
+
+	/**
+	 * Removes this fold from its parent.  This should only be called by
+	 * {@link FoldParser} implementations if they determine that a fold is all
+	 * on a single line (and thus shouldn't be remembered) after creating it.
+	 *
+	 * @return Whether this fold had a parent to be removed from.
+	 * @see #isOnSingleLine()
+	 */
+	public boolean removeFromParent() {
+		if (parent!=null) {
+			parent.removeMostRecentChild();
+			parent = null;
+			return true;
+		}
+		return false;
+	}
+
+
+	private void removeMostRecentChild() {
+		children.remove(children.size()-1);
+	}
+
+
+	/**
+	 * Sets whether this <code>Fold</code> is collapsed.  Calling this method
+	 * will update both the text area and all <code>Gutter</code> components.
+	 *
+	 * @param collapsed Whether this fold should be collapsed.
+	 * @see #isCollapsed()
+	 * @see #toggleCollapsedState()
+	 */
+	public void setCollapsed(boolean collapsed) {
+
+		if (collapsed!=this.collapsed) {
+
+			// Change our fold state and cached info about folded line count.
+			int lineCount = getLineCount();
+			int linesToCollapse = lineCount - childCollapsedLineCount;
+			if (!collapsed) { // If we're expanding
+				linesToCollapse = -linesToCollapse;
+			}
+			//System.out.println("Hiding lines: " + linesToCollapse +
+			//		" (" + lineCount + ", " + linesToCollapse + ")");
+			this.collapsed = collapsed;
+			if (parent!=null) {
+				parent.updateChildCollapsedLineCount(linesToCollapse);
+			}
+
+			// If an end point of the selection is being hidden, move the caret
+			// "out" of the fold.
+			if (collapsed) {
+				int dot = textArea.getSelectionStart(); // Forgive variable name
+				Element root = textArea.getDocument().getDefaultRootElement();
+				int dotLine = root.getElementIndex(dot);
+				boolean updateCaret = containsLine(dotLine);
+				if (!updateCaret) {
+					int mark = textArea.getSelectionEnd();
+					if (mark!=dot) {
+						int markLine = root.getElementIndex(mark);
+						updateCaret = containsLine(markLine);
+					}
+				}
+				if (updateCaret) {
+					dot = root.getElement(getStartLine()).getEndOffset() - 1;
+					textArea.setCaretPosition(dot);
+				}
+			}
+
+			textArea.foldToggled(this);
+
+		}
+
+	}
+
+
+	/**
+	 * Sets the ending offset of this fold, such as the closing curly brace
+	 * of a code block in C or Java. {@link FoldParser} implementations should
+	 * call this on an existing <code>Fold</code> upon finding its end.  If
+	 * this method isn't called, then this <code>Fold</code> is considered to
+	 * have no end, i.e., it will collapse everything to the end of the file.
+	 * 
+	 * @param endOffs The end offset of this fold.
+	 * @throws BadLocationException If <code>endOffs</code> is not a valid
+	 *         location in the text area.
+	 */
+	public void setEndOffset(int endOffs) throws BadLocationException {
+		this.endOffs = textArea.getDocument().createPosition(endOffs);
+	}
+
+
+	/**
+	 * Toggles the collapsed state of this fold.
+	 *
+	 * @see #setCollapsed(boolean)
+	 */
+	public void toggleCollapsedState() {
+		setCollapsed(!collapsed);
+	}
+
+
+	private void updateChildCollapsedLineCount(int count) {
+		childCollapsedLineCount += count;
+		//if (childCollapsedLineCount>getLineCount()) {
+		//	Thread.dumpStack();
+		//}
+		if (!collapsed && parent!=null) {
+			parent.updateChildCollapsedLineCount(count);
+		}
+	}
+
+
+	/**
+	 * Overridden for debugging purposes.
+	 *
+	 * @return A string representation of this <code>Fold</code>.
+	 */
+	public String toString() {
+		return "[Fold: " +
+				"startOffs=" + getStartOffset() +
+				", endOffs=" + getEndOffset() +
+				", collapsed=" + collapsed +
+				"]";
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/FoldCollapser.java b/src/org/fife/ui/rsyntaxtextarea/folding/FoldCollapser.java
new file mode 100644
index 0000000..5196d8e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/FoldCollapser.java
@@ -0,0 +1,106 @@
+/*
+ * 10/23/2011
+ *
+ * FoldCollapser.java - Goes through an RSTA instance and collapses folds of
+ * specific types, such as comments.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * Collapses folds based on their type.  You can create an instance of this
+ * class to collapse all comment blocks when opening a new file, for example.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FoldCollapser {
+
+	private List typesToCollapse;
+
+
+	/**
+	 * Creates an instance that collapses all comment blocks.
+	 */
+	public FoldCollapser() {
+		this(FoldType.COMMENT);
+	}
+
+
+	/**
+	 * Creates an instance that collapses all blocks of the specified
+	 * type.
+	 *
+	 * @param typeToCollapse The type to collapse.
+	 * @see FoldType
+	 */
+	public FoldCollapser(int typeToCollapse) {
+		typesToCollapse = new ArrayList();
+		addTypeToCollapse(typeToCollapse);
+	}
+
+
+	/**
+	 * Adds a type of fold to collapse.
+	 *
+	 * @param typeToCollapse The type of fold to collapse.
+	 */
+	public void addTypeToCollapse(int typeToCollapse) {
+		typesToCollapse.add(new Integer(typeToCollapse));
+	}
+
+
+	/**
+	 * Collapses any relevant folds known by the fold manager.
+	 *
+	 * @param fm The fold manager.
+	 */
+	public void collapseFolds(FoldManager fm) {
+		for (int i=0; i<fm.getFoldCount(); i++) {
+			Fold fold = fm.getFold(i);
+			collapseImpl(fold);
+		}
+	}
+
+
+	/**
+	 * Collapses the specified fold, and any of its child folds, as
+	 * appropriate.
+	 *
+	 * @param fold The fold to examine.
+	 * @see #getShouldCollapse(Fold)
+	 */
+	protected void collapseImpl(Fold fold) {
+		if (getShouldCollapse(fold)) {
+			fold.setCollapsed(true);
+		}
+		for (int i=0; i<fold.getChildCount(); i++) {
+			collapseImpl(fold.getChild(i));
+		}
+	}
+
+
+	/**
+	 * Returns whether a specific fold should be collapsed.
+	 *
+	 * @param fold The fold to examine.
+	 * @return Whether the fold should be collapsed.
+	 */
+	public boolean getShouldCollapse(Fold fold) {
+		int type = fold.getFoldType();
+		for (int i=0; i<typesToCollapse.size(); i++) {
+			if (type==((Integer)typesToCollapse.get(i)).intValue()) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/FoldManager.java b/src/org/fife/ui/rsyntaxtextarea/folding/FoldManager.java
new file mode 100644
index 0000000..25129f9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/FoldManager.java
@@ -0,0 +1,710 @@
+/*
+ * 10/08/2011
+ *
+ * FoldManager.java - Manages code folding in an RSyntaxTextArea instance.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.parser.AbstractParser;
+import org.fife.ui.rsyntaxtextarea.parser.DefaultParseResult;
+import org.fife.ui.rsyntaxtextarea.parser.ParseResult;
+import org.fife.ui.rsyntaxtextarea.parser.Parser;
+
+
+/**
+ * Manages code folding in an instance of RSyntaxTextArea.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FoldManager {
+
+	private RSyntaxTextArea textArea;
+	private FoldParser parser;
+	private List folds;
+	private boolean codeFoldingEnabled;
+	private PropertyChangeSupport support;
+
+
+	/**
+	 * Property fired when folds have been updated.
+	 */
+	public static final String PROPERTY_FOLDS_UPDATED = "FoldsUpdated";
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The text area whose folds we are managing.
+	 */
+	public FoldManager(RSyntaxTextArea textArea) {
+		this.textArea = textArea;
+		support = new PropertyChangeSupport(this);
+		Listener l = new Listener();
+		textArea.getDocument().addDocumentListener(l);
+		textArea.addPropertyChangeListener(RSyntaxTextArea.SYNTAX_STYLE_PROPERTY, l);
+		folds = new ArrayList();
+		updateFoldParser(); 
+	}
+
+
+	/**
+	 * Adds a property change listener to this fold manager.
+	 *
+	 * @param l The new listener.
+	 * @see #removePropertyChangeListener(PropertyChangeListener)
+	 */
+	public void addPropertyChangeListener(PropertyChangeListener l) {
+		support.addPropertyChangeListener(l);
+	}
+
+
+	/**
+	 * Removes all folds.
+	 */
+	public void clear() {
+		folds.clear();
+	}
+
+
+	/**
+	 * Ensures that the specified offset is not hidden in a collapsed fold.
+	 * Any folds containing this offset that are collapsed will be expanded.
+	 *
+	 * @param offs The offset.
+	 * @return Whether any folds had to be opened.
+	 * @see #getDeepestFoldContaining(int)
+	 */
+	public boolean ensureOffsetNotInClosedFold(int offs) {
+		boolean foldsOpened = false;
+		Fold fold = getDeepestFoldContaining(offs);
+		while (fold!=null) {
+			if (fold.isCollapsed()) {
+				fold.setCollapsed(false);
+				foldsOpened = true;
+			}
+			fold = fold.getParent();
+		}
+		return foldsOpened;
+	}
+
+
+	/**
+	 * Returns the "deepest" nested fold containing the specified offset.
+	 *
+	 * @param offs The offset.
+	 * @return The deepest fold containing the offset, or <code>null</code> if
+	 *         no fold contains the offset.
+	 */
+	public Fold getDeepestFoldContaining(int offs) {
+		Fold deepestFold = null;
+		if (offs>-1) {
+			for (int i=0; i<folds.size(); i++) {
+				Fold fold = getFold(i);
+				if (fold.containsOffset(offs)) {
+					deepestFold = fold.getDeepestFoldContaining(offs);
+					break;
+				}
+			}
+		}
+		return deepestFold;
+	}
+
+
+	/**
+	 * Returns the "deepest" open fold containing the specified offset.
+	 *
+	 * @param offs The offset.
+	 * @return The fold, or <code>null</code> if no open fold contains the
+	 *         offset.
+	 */
+	public Fold getDeepestOpenFoldContaining(int offs) {
+
+		Fold deepestFold = null;
+
+		if (offs>-1) {
+			for (int i=0; i<folds.size(); i++) {
+				Fold fold = getFold(i);
+				if (fold.containsOffset(offs)) {
+					if (fold.isCollapsed()) {
+						return null;
+					}
+					deepestFold = fold.getDeepestOpenFoldContaining(offs);
+					break;
+				}
+			}
+		}
+
+		return deepestFold;
+
+	}
+
+
+	/**
+	 * Returns a specific top-level fold, which may have child folds.
+	 *
+	 * @param index The index of the fold.
+	 * @return The fold.
+	 * @see #getFoldCount()
+	 */
+	public Fold getFold(int index) {
+		return (Fold)folds.get(index);
+	}
+
+
+	/**
+	 * Returns the number of top-level folds.
+	 *
+	 * @return The number of top-level folds.
+	 * @see #getFold(int)
+	 */
+	public int getFoldCount() {
+		return folds.size();
+	}
+
+
+	/**
+	 * Returns the fold region that starts at the specified line.
+	 *
+	 * @param line The line number.
+	 * @return The fold, or <code>null</code> if the line is not the start
+	 *         of a fold region.
+	 * @see #isFoldStartLine(int)
+	 */
+	public Fold getFoldForLine(int line) {
+		return getFoldForLineImpl(null, folds, line);
+	}
+
+
+private Fold getFoldForLineImpl(Fold parent, List folds, int line) {
+
+	int low = 0;
+	int high = folds.size() - 1;
+
+	while (low <= high) {
+		int mid = (low + high) >> 1;
+		Fold midFold = (Fold)folds.get(mid);
+		int startLine = midFold.getStartLine();
+		if (line==startLine) {
+			return midFold;
+		}
+		else if (line<startLine) {
+			high = mid - 1;
+		}
+		else {
+			int endLine = midFold.getEndLine();
+			if (line>=endLine) {
+				low = mid + 1;
+			}
+			else { // line>startLine && line<=endLine
+				List children = midFold.getChildren();
+				return children!=null ? getFoldForLineImpl(midFold, children, line) : null;
+			}
+		}
+	}
+
+	return null; // No fold for this line
+}
+
+
+	/**
+	 * Returns the total number of hidden (folded) lines.
+	 *
+	 * @return The total number of hidden (folded) lines.
+	 * @see #getHiddenLineCountAbove(int)
+	 */
+	public int getHiddenLineCount() {
+		int count = 0;
+		for (int i=0; i<folds.size(); i++) {
+			count += ((Fold)folds.get(i)).getCollapsedLineCount();
+		}
+		return count;
+	}
+
+
+	/**
+	 * Returns the number of lines "hidden" by collapsed folds above the
+	 * specified line.
+	 *
+	 * @param line The line.  This is the line number for a logical line.
+	 *        For the line number of a physical line (i.e. visible, not folded),
+	 *        use <code>getHiddenLineCountAbove(int, true)</code>.
+	 * @return The number of lines hidden in folds above <code>line</code>.
+	 * @see #getHiddenLineCountAbove(int, boolean)
+	 */
+	public int getHiddenLineCountAbove(int line) {
+		return getHiddenLineCountAbove(line, false);
+	}
+	
+
+	/**
+	 * Returns the number of lines "hidden" by collapsed folds above the
+	 * specified line.
+	 *
+	 * @param line The line.
+	 * @param physical Whether <code>line</code> is the number of a physical
+	 *        line (i.e. visible, not code-folded), or a logical one (i.e. any
+	 *        line from the model).  If <code>line</code> was determined by a
+	 *        raw line calculation (i.e. <code>(visibleTopY / lineHeight)</code>),
+	 *        this value should be <code>true</code>.  It should be
+	 *        <code>false</code> when it was calculated from an offset in the
+	 *        document (for example).
+	 * @return The number of lines hidden in folds above <code>line</code>.
+	 */
+	public int getHiddenLineCountAbove(int line, boolean physical) {
+
+		int count = 0;
+
+		for (int i=0; i<folds.size(); i++) {
+			Fold fold = (Fold)folds.get(i);
+			int comp = physical ? line+count : line;
+			if (fold.getStartLine()>=comp) {
+				break;
+			}
+			count += getHiddenLineCountAboveImpl(fold, comp, physical);
+		}
+
+		return count;
+
+	}
+
+
+	/**
+	 * Returns the number of lines "hidden" by collapsed folds above the
+	 * specified line.
+	 *
+	 * @param fold The current fold in the recursive algorithm.  It and its
+	 *        children are examined.
+	 * @param line The line.
+	 * @param physical Whether <code>line</code> is the number of a physical
+	 *        line (i.e. visible, not code-folded), or a logical one (i.e. any
+	 *        line from the model).  If <code>line</code> was determined by a
+	 *        raw line calculation (i.e. <code>(visibleTopY / lineHeight)</code>),
+	 *        this value should be <code>true</code>.  It should be
+	 *        <code>false</code> when it was calculated from an offset in the
+	 *        document (for example).
+	 * @return The number of lines hidden in folds that are descendants of
+	 *         <code>fold</code>, or <code>fold</code> itself, above
+	 *         <code>line</code>.
+	 */
+	private int getHiddenLineCountAboveImpl(Fold fold, int line, boolean physical) {
+
+		int count = 0;
+
+		if (fold.getEndLine()<line ||
+				(fold.isCollapsed() && fold.getStartLine()<line)) {
+			count = fold.getCollapsedLineCount();
+		}
+		else {
+			int childCount = fold.getChildCount();
+			for (int i=0; i<childCount; i++) {
+				Fold child = fold.getChild(i);
+				int comp = physical ? line+count : line;
+				if (child.getStartLine()>=comp) {
+					break;
+				}
+				count += getHiddenLineCountAboveImpl(child, comp, physical);
+			}
+		}
+
+		return count;
+
+	}
+
+
+	/**
+	 * Returns the last visible line in the text area, taking into account
+	 * folds.
+	 *
+	 * @return The last visible line.
+	 */
+	public int getLastVisibleLine() {
+
+		int lastLine = textArea.getLineCount() - 1;
+
+		if (isCodeFoldingSupportedAndEnabled()) {
+			int foldCount = getFoldCount();
+			if (foldCount>0) {
+				Fold lastFold = getFold(foldCount-1);
+				if (lastFold.containsLine(lastLine)) {
+					if (lastFold.isCollapsed()) {
+						lastLine = lastFold.getStartLine();
+					}
+					else { // Child fold may end on the same line as parent
+						while (lastFold.getHasChildFolds()) {
+							lastFold = lastFold.getLastChild();
+							if (lastFold.containsLine(lastLine)) {
+								if (lastFold.isCollapsed()) {
+									lastLine = lastFold.getStartLine();
+									break;
+								}
+							}
+							else { // Higher up
+								break;
+							}
+						}
+					}
+				}
+			}
+		}
+
+		return lastLine;
+
+	}
+
+
+	public int getVisibleLineAbove(int line) {
+
+		if (line<=0 || line>=textArea.getLineCount()) {
+			return -1;
+		}
+
+		do {
+			line--;
+		} while (line>=0 && isLineHidden(line));
+
+		return line;
+
+	}
+
+
+	public int getVisibleLineBelow(int line) {
+
+		int lineCount = textArea.getLineCount();
+		if (line<0 || line>=lineCount-1) {
+			return -1;
+		}
+
+		do {
+			line++;
+		} while (line<lineCount && isLineHidden(line));
+
+		return line==lineCount ? -1 : line;
+
+	}
+
+
+//	private static int binaryFindFoldContainingLine(int line) {
+//
+//List allFolds;
+//
+//		int low = 0;
+//		int high = allFolds.size() - 1;
+//
+//		while (low <= high) {
+//			int mid = (low + high) >> 1;
+//			Fold midVal = (Fold)allFolds.get(mid);
+//			if (midVal.containsLine(line)) {
+//				return mid;
+//			}
+//			if (line<=midVal.getStartLine()) {
+//				high = mid - 1;
+//			}
+//			else { // line > midVal.getEndLine()
+//				low = mid + 1;
+//			}
+//		}
+//
+//		return -(low + 1); // key not found
+//
+//	}
+
+
+    /**
+	 * Returns whether code folding is enabled.  Note that only certain
+	 * languages support code folding; those that do not will ignore this
+	 * property.
+	 *
+	 * @return Whether code folding is enabled.
+	 * @see #setCodeFoldingEnabled(boolean)
+	 */
+	public boolean isCodeFoldingEnabled() {
+		return codeFoldingEnabled;
+	}
+
+
+	/**
+	 * Returns <code>true</code> if and only if code folding is enabled for
+	 * this text area, AND folding is supported for the language it is editing.
+	 * Whether or not folding is supported for a language depends on whether
+	 * a fold parser is registered for that language with the
+	 * <code>FoldParserManager</code>.
+	 *
+	 * @return Whether folding is supported and enabled for this text area.
+	 * @see FoldParserManager
+	 */
+	public boolean isCodeFoldingSupportedAndEnabled() {
+		return codeFoldingEnabled && parser!=null;
+	}
+
+
+	/**
+	 * Returns whether the specified line contains the start of a fold region.
+	 *
+	 * @param line The line.
+	 * @return Whether the line contains the start of a fold region.
+	 * @see #getFoldForLine(int)
+	 */
+	public boolean isFoldStartLine(int line) {
+		return getFoldForLine(line)!=null;
+	}
+
+
+	/**
+	 * Returns whether a line is hidden in a collapsed fold.
+	 *
+	 * @param line The line to check.
+	 * @return Whether the line is hidden in a collapsed fold.
+	 */
+	public boolean isLineHidden(int line) {
+		for (int i=0; i<folds.size(); i++) {
+			Fold fold = (Fold)folds.get(i);
+			if (fold.containsLine(line)) {
+				if (fold.isCollapsed()) {
+					return true;
+				}
+				else {
+					return isLineHiddenImpl(fold, line);
+				}
+			}
+		}
+		return false;
+	}
+
+
+	private boolean isLineHiddenImpl(Fold parent, int line) {
+		for (int i=0; i<parent.getChildCount(); i++) {
+			Fold child = parent.getChild(i);
+			if (child.containsLine(line)) {
+				if (child.isCollapsed()) {
+					return true;
+				}
+				else {
+					return isLineHiddenImpl(child, line);
+				}
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Checks whether a single fold was there in the "old" set of folds.  If
+	 * it was, its collapsed state is preserved.
+	 *
+	 * @param newFold The "new" fold to check for.
+	 * @param oldFolds The previous folds before an edit occurred.
+	 */
+	private void keepFoldState(Fold newFold, List oldFolds) {
+		int previousLoc = Collections.binarySearch(oldFolds, newFold);
+		//System.out.println(newFold + " => " + previousLoc);
+		if (previousLoc>=0) {
+			Fold prevFold = (Fold)oldFolds.get(previousLoc);
+			newFold.setCollapsed(prevFold.isCollapsed());
+		}
+		else {
+			//previousLoc = -(insertion point) - 1;
+			int insertionPoint = -(previousLoc + 1);
+			if (insertionPoint>0) {
+				Fold possibleParentFold = (Fold)oldFolds.get(insertionPoint-1);
+				if (possibleParentFold.containsOffset(
+						newFold.getStartOffset())) {
+					List children = possibleParentFold.getChildren();
+					if (children!=null) {
+						keepFoldState(newFold, children);
+					}
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * Called when new folds come in from the fold parser.  Checks whether any
+	 * folds from the "old" fold list are still in the "new" list; if so, their
+	 * collapsed state is preserved.
+	 *
+	 * @param newFolds The "new" folds after an edit occurred.  This cannot be
+	 *        <code>null</code>.
+	 * @param oldFolds The previous folds before the edit occurred.
+	 */
+	private void keepFoldStates(List newFolds, List oldFolds) {
+		for (int i=0; i<newFolds.size(); i++) {
+			Fold newFold = (Fold)newFolds.get(i);
+			keepFoldState(newFold, folds);
+			List newChildFolds = newFold.getChildren();
+			if (newChildFolds!=null) {
+				keepFoldStates(newChildFolds, oldFolds);
+			}
+		}
+	}
+
+
+	/**
+	 * Removes a property change listener from this fold manager.
+	 *
+	 * @param l The listener to remove.
+	 * @see #addPropertyChangeListener(PropertyChangeListener)
+	 */
+	public void removePropertyChangeListener(PropertyChangeListener l) {
+		support.removePropertyChangeListener(l);
+	}
+
+
+	/**
+	 * Forces an immediate reparsing for folds, if folding is enabled.  This
+	 * usually does not need to be called by the programmer, since fold
+	 * parsing is done automatically by RSTA.
+	 */
+	public void reparse() {
+
+		if (codeFoldingEnabled && parser!=null) {
+
+			// Re-calculate folds.  Keep the fold state of folds that are
+			// still around.
+			List newFolds = parser.getFolds(textArea);
+			if (newFolds==null) {
+				newFolds = Collections.EMPTY_LIST;
+			}
+			else {
+				keepFoldStates(newFolds, folds);
+			}
+			folds = newFolds;
+
+			// Let folks (gutter, etc.) know that folds have been updated.
+			support.firePropertyChange(PROPERTY_FOLDS_UPDATED, null, folds);
+			textArea.repaint();
+
+		}
+		else {
+			folds.clear();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether code folding is enabled.  Note that only certain
+	 * languages will support code folding out of the box.  Those languages
+	 * which do not support folding will ignore this property.
+	 *
+	 * @param enabled Whether code folding should be enabled.
+	 * @see #isCodeFoldingEnabled()
+	 */
+	public void setCodeFoldingEnabled(boolean enabled) {
+		if (enabled!=codeFoldingEnabled) {
+			codeFoldingEnabled = enabled;
+			if (tempParser!=null) {
+				textArea.removeParser(tempParser);
+			}
+			if (enabled) {
+				tempParser = new AbstractParser() {
+					public ParseResult parse(RSyntaxDocument doc, String style) {
+						reparse();
+						return new DefaultParseResult(this);
+					}
+				};
+				textArea.addParser(tempParser);
+				support.firePropertyChange(PROPERTY_FOLDS_UPDATED, null, null);
+				//reparse();
+			}
+			else {
+				folds = Collections.EMPTY_LIST;
+				textArea.repaint();
+				support.firePropertyChange(PROPERTY_FOLDS_UPDATED, null, null);
+			}
+		}
+	}
+private Parser tempParser;
+
+
+	/**
+	 * Sets the folds for this fold manager.
+	 *
+	 * @param folds The new folds.  This should not be <code>null</code>.
+	 */
+	public void setFolds(List folds) {
+		this.folds = folds;
+	}
+
+
+	/**
+	 * Updates the fold parser to be the one appropriate for the language
+	 * currently being highlighted.
+	 */
+	private void updateFoldParser() {
+		parser = FoldParserManager.get().getFoldParser(
+											textArea.getSyntaxEditingStyle());
+	}
+
+
+	/**
+	 * Listens for events in the text editor.
+	 */
+	private class Listener implements DocumentListener, PropertyChangeListener {
+
+		public void changedUpdate(DocumentEvent e) {
+		}
+
+		public void insertUpdate(DocumentEvent e) {
+			// Adding text containing a newline to the visible line of a folded
+			// Fold causes that Fold to unfold.  Check only start offset of
+			// insertion since that's the line that was "modified".
+			int startOffs = e.getOffset();
+			int endOffs = startOffs + e.getLength();
+			Document doc = e.getDocument();
+			Element root = doc.getDefaultRootElement();
+			int startLine = root.getElementIndex(startOffs);
+			int endLine = root.getElementIndex(endOffs);
+			if (startLine!=endLine) { // Inserted text covering > 1 line...
+				Fold fold = getFoldForLine(startLine);
+				if (fold!=null && fold.isCollapsed()) {
+					fold.toggleCollapsedState();
+				}
+			}
+		}
+
+		public void propertyChange(PropertyChangeEvent e) {
+			// Syntax style changed in editor.
+			updateFoldParser();
+			reparse(); // Even if no fold parser change, highlighting did
+		}
+		public void removeUpdate(DocumentEvent e) {
+			// Removing text from the visible line of a folded Fold causes that
+			// Fold to unfold.  We only need to check the removal offset since
+			// that's the new caret position.
+			int offs = e.getOffset();
+			try {
+				int lastLineModified = textArea.getLineOfOffset(offs);
+				//System.out.println(">>> " + lastLineModified);
+				Fold fold = getFoldForLine(lastLineModified);
+				//System.out.println("&&& " + fold);
+				if (fold!=null && fold.isCollapsed()) {
+					fold.toggleCollapsedState();
+				}
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Never happens
+			}
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/FoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/FoldParser.java
new file mode 100644
index 0000000..31d0c51
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/FoldParser.java
@@ -0,0 +1,41 @@
+/*
+ * 10/08/2011
+ *
+ * FoldParser.java - Locates folds in an RSyntaxTextArea instance.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.List;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+
+
+/**
+ * Locates folds in a document.  If you are implementing a language that has
+ * sections of source code that can be logically "folded," you can create an
+ * instance of this interface that locates those regions and represents them
+ * as {@link Fold}s.  <code>RSyntaxTextArea</code> knows how to take it from
+ * there and implement code folding in the editor.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see CurlyFoldParser
+ * @see XmlFoldParser
+ */
+public interface FoldParser {
+
+
+	/**
+	 * Returns a list of all folds in the text area.
+	 *
+	 * @param textArea The text area whose contents should be analyzed.
+	 * @return The list of folds.  If this method returns <code>null</code>,
+	 *         it is treated as if no folds were found.
+	 */
+	public List getFolds(RSyntaxTextArea textArea);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/FoldParserManager.java b/src/org/fife/ui/rsyntaxtextarea/folding/FoldParserManager.java
new file mode 100644
index 0000000..8c1fdf0
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/FoldParserManager.java
@@ -0,0 +1,120 @@
+/*
+ * 10/08/2011
+ *
+ * FoldParserManager.java - Used by RSTA to determine what fold parser to use
+ * for each language it supports.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
+
+
+/**
+ * Manages fold parsers.  Instances of <code>RSyntaxTextArea</code> call into
+ * this class to retrieve fold parsers for whatever language they're editing.
+ * Folks implementing custom languages can add a {@link FoldParser}
+ * implementation for their language to this manager and it will be used by
+ * RSTA.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FoldParserManager implements SyntaxConstants {
+
+	/**
+	 * Map from syntax styles to fold parsers.
+	 */
+	private Map foldParserMap;
+
+	private static final FoldParserManager INSTANCE = new FoldParserManager();
+
+
+	/**
+	 * Private constructor to prevent instantiation.
+	 */
+	private FoldParserManager() {
+		foldParserMap = createFoldParserMap();
+	}
+
+
+	/**
+	 * Adds a mapping from a syntax style to a fold parser.  The parser
+	 * specified will be shared among all RSTA instances editing that language,
+	 * so it should be stateless (which should not be difficult for a fold
+	 * parser).  You can also override the fold parser for built-in languages,
+	 * such as <code>SYNTAX_STYLE_JAVA</code>, with your own parser
+	 * implementations.
+	 *
+	 * @param syntaxStyle The syntax style.
+	 * @param parser The parser.
+	 * @see SyntaxConstants
+	 */
+	public void addFoldParserMapping(String syntaxStyle, FoldParser parser) {
+		foldParserMap.put(syntaxStyle, parser);
+	}
+
+
+	/**
+	 * Creates the syntax style-to-fold parser mapping for built-in languages.
+	 * @return
+	 */
+	private Map createFoldParserMap() {
+
+		Map map = new HashMap();
+
+		map.put(SYNTAX_STYLE_C,					new CurlyFoldParser());
+		map.put(SYNTAX_STYLE_CPLUSPLUS,			new CurlyFoldParser());
+		map.put(SYNTAX_STYLE_CSHARP,			new CurlyFoldParser());
+		map.put(SYNTAX_STYLE_CLOJURE,			new LispFoldParser());
+		map.put(SYNTAX_STYLE_CSS,				new CurlyFoldParser());
+		map.put(SYNTAX_STYLE_GROOVY,			new CurlyFoldParser());
+		map.put(SYNTAX_STYLE_HTML,				new HtmlFoldParser(HtmlFoldParser.LANGUAGE_HTML));
+		map.put(SYNTAX_STYLE_JAVA,				new CurlyFoldParser(true, true));
+		map.put(SYNTAX_STYLE_JAVASCRIPT,		new CurlyFoldParser());
+		map.put(SYNTAX_STYLE_JSON,				new JsonFoldParser());
+		map.put(SYNTAX_STYLE_JSP,				new HtmlFoldParser(HtmlFoldParser.LANGUAGE_JSP));
+		map.put(SYNTAX_STYLE_LATEX,				new LatexFoldParser());
+		map.put(SYNTAX_STYLE_LISP,				new LispFoldParser());
+		map.put(SYNTAX_STYLE_MXML,				new XmlFoldParser());
+		map.put(SYNTAX_STYLE_NSIS,				new NsisFoldParser());
+		map.put(SYNTAX_STYLE_PERL,				new CurlyFoldParser());
+		map.put(SYNTAX_STYLE_PHP,				new HtmlFoldParser(HtmlFoldParser.LANGUAGE_PHP));
+		map.put(SYNTAX_STYLE_SCALA,				new CurlyFoldParser());
+		map.put(SYNTAX_STYLE_XML,				new XmlFoldParser());
+
+		return map;
+
+	}
+
+
+	/**
+	 * Returns the singleton instance of this class.
+	 *
+	 * @return The singleton instance.
+	 */
+	public static FoldParserManager get() {
+		return INSTANCE;
+	}
+
+
+	/**
+	 * Returns a fold parser to use for an editor highlighting code of a
+	 * specific language.
+	 *
+	 * @param syntaxStyle A value from {@link SyntaxConstants}, such as
+	 *        <code>SYNTAX_STYLE_JAVA</code>.
+	 * @return A fold parser to use, or <code>null</code> if none is registered
+	 *         for the language.
+	 */
+	public FoldParser getFoldParser(String syntaxStyle) {
+		return (FoldParser)foldParserMap.get(syntaxStyle);
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/FoldType.java b/src/org/fife/ui/rsyntaxtextarea/folding/FoldType.java
new file mode 100644
index 0000000..6c9873e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/FoldType.java
@@ -0,0 +1,59 @@
+/*
+ * 10/08/2011
+ *
+ * FoldType.java - Types of folds found in many programming languages.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+
+/**
+ * Constants representing the "type" of a folded region.  Implementations of
+ * {@link FoldParser} can also define their own folded region types, provided
+ * they give them values of at least {@link #FOLD_TYPE_USER_DEFINED_MIN}.  This
+ * allows you to identify and auto-fold specific regions of source code when
+ * opening files; for example, a Java editor could identify all import
+ * statements in a file as a foldable region, and give it a user-defined value
+ * for fold type.  Then, the UI could provide a means for the user to specify
+ * that they always want the import region folded when opening a new file.<p>
+ * 
+ * The majority of the time, however, code editors won't need to be that fancy,
+ * and can simply use the standard <code>CODE</code> and <code>COMMENT</code>
+ * fold types.
+ * 
+ * @author Robert Futrell
+ * @version 1.0
+ * @see Fold
+ */
+public interface FoldType {
+
+	/**
+	 * Denotes a <code>Fold</code> as being a region of code.
+	 */
+	public static final int CODE							= 0;
+
+	/**
+	 * Denotes a <code>Fold</code> as being a multi-line comment.
+	 */
+	public static final int COMMENT							= 1;
+
+	/**
+	 * Denotes a <code>Fold</code> as being a section of import statements
+	 * (Java), include statements (C), etc.
+	 */
+	public static final int IMPORTS							= 2;
+
+	/**
+	 * Users building advanced editors such as IDE's, that want to allow their
+	 * users to auto-expand/collapse foldable regions of a specific type other
+	 * than comments, should define their custom fold types using values
+	 * <code>FOLD_TYPE_USER_DEFINED_MIN + <em>n</em></code>.  That way, if
+	 * new default fold types are added to this interface in the future, your
+	 * code won't suddenly break when upgrading to a new version of RSTA.
+	 */
+	public static final int FOLD_TYPE_USER_DEFINED_MIN		= 1000;
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/HtmlFoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/HtmlFoldParser.java
new file mode 100644
index 0000000..c3bef17
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/HtmlFoldParser.java
@@ -0,0 +1,402 @@
+/*
+ * 09/30/2012
+ *
+ * HtmlFoldParser.java - Fold parser for HTML 5 and PHP.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.Stack;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * Fold parser for HTML 5, PHP and JSP.  For HTML, we currently don't fold
+ * <em>everything</em> possible, just the "big" stuff.  For PHP, we only fold
+ * the "big" HTML stuff and PHP regions, not code blocks in the actual PHP.
+ * For JSP we only fold the "big" HTML stuff and JSP blocks, not anything in
+ * the actual Java code.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class HtmlFoldParser implements FoldParser {
+
+	/**
+	 * Constant denoting we're folding HTML.
+	 */
+	public static final int LANGUAGE_HTML	= -1;
+
+	/**
+	 * Constant denoting we're folding PHP.
+	 */
+	public static final int LANGUAGE_PHP	= 0;
+
+	/**
+	 * Constant denoting we're folding JSP.
+	 */
+	public static final int LANGUAGE_JSP	= 1;
+
+	/**
+	 * The language we're folding.
+	 */
+	private final int language;
+
+	/**
+	 * The set of tags we allow to be folded.  These are tags that must have
+	 * explicit close tags in both HTML 4 and HTML 5.
+	 */
+	private static final Set FOLDABLE_TAGS;
+
+	private static final char[] MARKUP_CLOSING_TAG_START = "</".toCharArray();
+	//private static final char[] MARKUP_SHORT_TAG_END = "/>".toCharArray();
+	private static final char[] MLC_START = "<!--".toCharArray();
+	private static final char[] MLC_END   = "-->".toCharArray();
+
+	private static final char[] PHP_START = "<?".toCharArray(); // <? and <?php
+	private static final char[] PHP_END = "?>".toCharArray();
+
+	// Scriptlets, declarations, and expressions all start the same way.
+	private static final char[] JSP_START = "<%".toCharArray();
+	private static final char[] JSP_END = "%>".toCharArray();
+
+	private static final char[][] LANG_START = { PHP_START, JSP_START };
+	private static final char[][] LANG_END   = { PHP_END, JSP_END };
+
+	private static final char[] JSP_COMMENT_START = "<%--".toCharArray();
+	private static final char[] JSP_COMMENT_END   = "--%>".toCharArray();
+
+	static {
+		FOLDABLE_TAGS = new HashSet();
+		FOLDABLE_TAGS.add("body");
+		FOLDABLE_TAGS.add("canvas");
+		FOLDABLE_TAGS.add("div");
+		FOLDABLE_TAGS.add("form");
+		FOLDABLE_TAGS.add("head");
+		FOLDABLE_TAGS.add("html");
+		FOLDABLE_TAGS.add("ol");
+		FOLDABLE_TAGS.add("pre");
+		FOLDABLE_TAGS.add("script");
+		FOLDABLE_TAGS.add("span");
+		FOLDABLE_TAGS.add("style");
+		FOLDABLE_TAGS.add("table");
+		FOLDABLE_TAGS.add("tfoot");
+		FOLDABLE_TAGS.add("thead");
+		FOLDABLE_TAGS.add("tr");
+		FOLDABLE_TAGS.add("td");
+		FOLDABLE_TAGS.add("ul");
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param language The language to fold, such as {@link #LANGUAGE_PHP}.
+	 */
+	public HtmlFoldParser(int language) {
+		if (language<LANGUAGE_HTML && language>LANGUAGE_JSP) {
+			throw new IllegalArgumentException("Invalid language: " + language);
+		}
+		this.language = language;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public List getFolds(RSyntaxTextArea textArea) {
+
+		List folds = new ArrayList();
+		Stack tagNameStack = new Stack();
+		boolean inSublanguage = false;
+
+		Fold currentFold = null;
+		int lineCount = textArea.getLineCount();
+		boolean inMLC = false;
+		boolean inJSMLC = false;
+		TagCloseInfo tci = new TagCloseInfo();
+
+		try {
+
+			for (int line=0; line<lineCount; line++) {
+
+				Token t = textArea.getTokenListForLine(line);
+				while (t!=null && t.isPaintable()) {
+
+					// If we're folding PHP.  Note that PHP folding can only be
+					// "one level deep," so our logic here is simple.
+					if (language>=0 && t.type==Token.SEPARATOR) {
+
+						// <?, <?php, <%, <%!, ...
+						if (t.startsWith(LANG_START[language])) {
+							if (currentFold==null) {
+								currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+								folds.add(currentFold);
+							}
+							else {
+								currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+							}
+							inSublanguage = true;
+						}
+
+						// ?> or %>
+						else if (t.startsWith(LANG_END[language])) {
+							int phpEnd = t.offset + t.textCount - 1;
+							currentFold.setEndOffset(phpEnd);
+							Fold parentFold = currentFold.getParent();
+							// Don't add fold markers for single-line blocks
+							if (currentFold.isOnSingleLine()) {
+								removeFold(currentFold, folds);
+							}
+							currentFold = parentFold;
+							inSublanguage = false;
+							t = t.getNextToken();
+							continue;
+						}
+
+					}
+
+					if (!inSublanguage) {
+
+						if (t.type==Token.COMMENT_MULTILINE) {
+
+							// Continuing an MLC from a previous line
+							if (inMLC) {
+								// Found the end of the MLC starting on a previous line...
+								if (t.endsWith(MLC_END)) {
+									int mlcEnd = t.offset + t.textCount - 1;
+									currentFold.setEndOffset(mlcEnd);
+									Fold parentFold = currentFold.getParent();
+									// Don't add fold markers for single-line blocks
+									if (currentFold.isOnSingleLine()) {
+										removeFold(currentFold, folds);
+									}
+									currentFold = parentFold;
+									inMLC = false;
+								}
+								// Otherwise, this MLC is continuing on to yet
+								// another line.
+							}
+	
+							// Continuing a JS MLC from a previous line
+							else if (inJSMLC) {
+								// Found the end of the MLC starting on a previous line...
+								if (t.endsWith(JSP_COMMENT_END)) {
+									int mlcEnd = t.offset + t.textCount - 1;
+									currentFold.setEndOffset(mlcEnd);
+									Fold parentFold = currentFold.getParent();
+									// Don't add fold markers for single-line blocks
+									if (currentFold.isOnSingleLine()) {
+										removeFold(currentFold, folds);
+									}
+									currentFold = parentFold;
+									inJSMLC = false;
+								}
+								// Otherwise, this MLC is continuing on to yet
+								// another line.
+							}
+
+							// Starting a MLC that ends on a later line...
+							else if (t.startsWith(MLC_START) && !t.endsWith(MLC_END)) {
+								if (currentFold==null) {
+									currentFold = new Fold(FoldType.COMMENT, textArea, t.offset);
+									folds.add(currentFold);
+								}
+								else {
+									currentFold = currentFold.createChild(FoldType.COMMENT, t.offset);
+								}
+								inMLC = true;
+							}
+
+							// Starting a JSP comment that ends on a later line...
+							else if (language==LANGUAGE_JSP &&
+									t.startsWith(JSP_COMMENT_START) &&
+									!t.endsWith(JSP_COMMENT_END)) {
+								if (currentFold==null) {
+									currentFold = new Fold(FoldType.COMMENT, textArea, t.offset);
+									folds.add(currentFold);
+								}
+								else {
+									currentFold = currentFold.createChild(FoldType.COMMENT, t.offset);
+								}
+								inJSMLC = true;
+							}
+
+						}
+
+						// If we're starting a new tag...
+						else if (t.isSingleChar(Token.MARKUP_TAG_DELIMITER, '<')) {
+							Token tagStartToken = t;
+							Token tagNameToken = t.getNextToken();
+							if (isFoldableTag(tagNameToken)) {
+								getTagCloseInfo(tagNameToken, textArea, line, tci);
+								if (tci.line==-1) { // EOF reached before end of tag
+									return folds;
+								}
+								// We have found either ">" or "/>" with tci.
+								Token tagCloseToken = tci.closeToken;
+								if (tagCloseToken.isSingleChar(Token.MARKUP_TAG_DELIMITER, '>')) {
+									if (currentFold==null) {
+										currentFold = new Fold(FoldType.CODE, textArea, tagStartToken.offset);
+										folds.add(currentFold);
+									}
+									else {
+										currentFold = currentFold.createChild(FoldType.CODE, tagStartToken.offset);
+									}
+									tagNameStack.push(tagNameToken.getLexeme());
+								}
+								t = tagCloseToken; // Continue parsing after tag
+							}
+						}
+
+						// If we've found a closing tag (e.g. "</div>").
+						else if (t.is(Token.MARKUP_TAG_DELIMITER, MARKUP_CLOSING_TAG_START)) {
+							if (currentFold!=null) {
+								Token tagNameToken = t.getNextToken();
+								if (isFoldableTag(tagNameToken) &&
+										isEndOfLastFold(tagNameStack, tagNameToken)) {
+									tagNameStack.pop();
+									currentFold.setEndOffset(t.offset);
+									Fold parentFold = currentFold.getParent();
+									// Don't add fold markers for single-line blocks
+									if (currentFold.isOnSingleLine()) {
+										removeFold(currentFold, folds);
+									}
+									currentFold = parentFold;
+									t = tagNameToken;
+								}
+							}
+						}
+
+					}
+
+					t = t.getNextToken();
+
+				}
+
+			}
+
+		} catch (BadLocationException ble) { // Should never happen
+			ble.printStackTrace();
+		}
+
+		return folds;
+	
+	}
+
+
+	/**
+	 * Grabs the token representing the closing of a tag (i.e.
+	 * "<code>></code>" or "<code>/></code>").  This should only be
+	 * called after a tag name has been parsed, to ensure  the "closing" of
+	 * other tags is not identified.
+	 * 
+	 * @param tagNameToken The token denoting the name of the tag.
+	 * @param textArea The text area whose contents are being parsed.
+	 * @param line The line we're currently on.
+	 * @param info On return, information about the closing of the tag is
+	 *        returned in this object.
+	 */
+	private void getTagCloseInfo(Token tagNameToken, RSyntaxTextArea textArea,
+			int line, TagCloseInfo info) {
+
+		info.reset();
+		Token t = tagNameToken.getNextToken();
+
+		do {
+
+			while (t!=null && t.type!=Token.MARKUP_TAG_DELIMITER) {
+				t = t.getNextToken();
+			}
+
+			if (t!=null) {
+				info.closeToken = t;
+				info.line = line;
+				break;
+			}
+
+		} while (++line<textArea.getLineCount() &&
+				(t=textArea.getTokenListForLine(line))!=null);
+
+	}
+
+
+	/**
+	 * Returns whether a closing tag ("<code></...></code>") with a
+	 * specific name is the closing tag of our current fold region.
+	 *
+	 * @param tagNameStack The stack of fold regions.
+	 * @param tagNameToken The tag name of the most recently parsed closing
+	 *        tag.
+	 * @return Whether it's the end of the current fold region.
+	 */
+	private static final boolean isEndOfLastFold(Stack tagNameStack,
+			Token tagNameToken) {
+		if (tagNameToken!=null && !tagNameStack.isEmpty()) {
+			return tagNameToken.getLexeme().equalsIgnoreCase((String)tagNameStack.peek());
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns whether a tag is one we allow as a foldable region.
+	 *
+	 * @param tagNameToken The tag's name token.  This may be <code>null</code>.
+	 * @return Whether this tag can be a foldable region.
+	 */
+	private static final boolean isFoldableTag(Token tagNameToken) {
+		return tagNameToken!=null &&
+				FOLDABLE_TAGS.contains(tagNameToken.getLexeme().toLowerCase());
+	}
+
+
+	/**
+	 * If this fold has a parent fold, this method removes it from its parent.
+	 * Otherwise, it's assumed to be the most recent (top-level) fold in the
+	 * <code>folds</code> list, and is removed from that.
+	 *
+	 * @param fold The fold to remove.
+	 * @param folds The list of top-level folds.
+	 */
+	private static final void removeFold(Fold fold, List folds) {
+		if (!fold.removeFromParent()) {
+			folds.remove(folds.size()-1);
+		}
+	}
+
+
+	/**
+	 * A simple wrapper for the token denoting the closing of a tag (i.e.
+	 * "<code>></code>" or "<code>/></code>").
+	 */
+	private static class TagCloseInfo {
+
+		private Token closeToken;
+		private int line;
+
+		public void reset() {
+			closeToken = null;
+			line = -1;
+		}
+
+		public String toString() {
+			return "[TagCloseInfo: " +
+					"closeToken=" + closeToken +
+					", line=" + line +
+					"]";
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/JsonFoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/JsonFoldParser.java
new file mode 100644
index 0000000..a08a298
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/JsonFoldParser.java
@@ -0,0 +1,161 @@
+/*
+ * 12/23/2012
+ *
+ * JsonFoldParser.java - Fold parser for JSON.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+import org.fife.ui.rsyntaxtextarea.TokenTypes;
+
+
+/**
+ * The fold parser for JSON.  Objects (<code>"{ ... }</code>") and arrays
+ * (<code>"[ ... ]"</code>) that span multiple lines are considered fold
+ * regions.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class JsonFoldParser implements FoldParser {
+
+	private static final Object OBJECT_BLOCK = new Object();
+	private static final Object ARRAY_BLOCK = new Object();
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public List getFolds(RSyntaxTextArea textArea) {
+
+		Stack blocks = new Stack();
+		List folds = new ArrayList();
+
+		Fold currentFold = null;
+		int lineCount = textArea.getLineCount();
+
+		try {
+
+			for (int line=0; line<lineCount; line++) {
+
+				Token t = textArea.getTokenListForLine(line);
+				while (t!=null && t.isPaintable()) {
+
+					if (t.isLeftCurly()) {
+						if (currentFold==null) {
+							currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+							folds.add(currentFold);
+						}
+						else {
+							currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+						}
+						blocks.push(OBJECT_BLOCK);
+					}
+
+					else if (t.isRightCurly() && popOffTop(blocks, OBJECT_BLOCK)) {
+						if (currentFold!=null) {
+							currentFold.setEndOffset(t.offset);
+							Fold parentFold = currentFold.getParent();
+							//System.out.println("... Adding regular fold at " + t.offset + ", parent==" + parentFold);
+							// Don't add fold markers for single-line blocks
+							if (currentFold.isOnSingleLine()) {
+								if (!currentFold.removeFromParent()) {
+									folds.remove(folds.size()-1);
+								}
+							}
+							currentFold = parentFold;
+						}
+					}
+
+					else if (isLeftBracket(t)) {
+						if (currentFold==null) {
+							currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+							folds.add(currentFold);
+						}
+						else {
+							currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+						}
+						blocks.push(ARRAY_BLOCK);
+					}
+
+					else if (isRightBracket(t) && popOffTop(blocks, ARRAY_BLOCK)) {
+						if (currentFold!=null) {
+							currentFold.setEndOffset(t.offset);
+							Fold parentFold = currentFold.getParent();
+							//System.out.println("... Adding regular fold at " + t.offset + ", parent==" + parentFold);
+							// Don't add fold markers for single-line blocks
+							if (currentFold.isOnSingleLine()) {
+								if (!currentFold.removeFromParent()) {
+									folds.remove(folds.size()-1);
+								}
+							}
+							currentFold = parentFold;
+						}
+					}
+
+					t = t.getNextToken();
+
+				}
+
+			}
+
+		} catch (BadLocationException ble) { // Should never happen
+			ble.printStackTrace();
+		}
+
+		return folds;
+
+	}
+
+
+	/**
+	 * Returns whether a token is the left bracket token.
+	 * 
+	 * @param t The token.
+	 * @return Whether the token is the left bracket token.
+	 * @see #isRightBracket(Token)
+	 */
+	private static final boolean isLeftBracket(Token t) {
+		return t.type==TokenTypes.SEPARATOR && t.isSingleChar('[');
+	}
+
+
+	/**
+	 * Returns whether a token is the right bracket token.
+	 * 
+	 * @param t The token.
+	 * @return Whether the token is the right bracket token.
+	 * @see #isLeftBracket(Token)
+	 */
+	private static final boolean isRightBracket(Token t) {
+		return t.type==TokenTypes.SEPARATOR && t.isSingleChar(']');
+	}
+
+
+	/**
+	 * If the specified value is on top of the stack, pop it off and return
+	 * <code>true</code>.  Otherwise, return <code>false</code>.
+	 *
+	 * @param stack The stack.
+	 * @param value The value to check for.
+	 * @return Whether the value was found on top of the stack.
+	 */
+	private static final boolean popOffTop(Stack stack, Object value) {
+		if (stack.size()>0 && stack.peek()==value) {
+			stack.pop();
+			return true;
+		}
+		return false;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/LatexFoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/LatexFoldParser.java
new file mode 100644
index 0000000..65b327b
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/LatexFoldParser.java
@@ -0,0 +1,108 @@
+/*
+ * 04/24/2012
+ *
+ * LatexFoldParser.java - Fold parser for LaTeX.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * A fold parser for LaTeX documents.  This is likely incomplete and/or not
+ * quite right; feedback is appreciated.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class LatexFoldParser implements FoldParser {
+
+	private static final char[] BEGIN = "\\begin".toCharArray();
+	private static final char[] END = "\\end".toCharArray();
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public List getFolds(RSyntaxTextArea textArea) {
+
+		List folds = new ArrayList();
+		Stack expectedStack = new Stack();
+
+		Fold currentFold = null;
+		int lineCount = textArea.getLineCount();
+
+		try {
+
+			for (int line=0; line<lineCount; line++) {
+
+				Token t = textArea.getTokenListForLine(line);
+				while (t!=null && t.isPaintable()) {
+
+					if (t.is(Token.RESERVED_WORD, BEGIN)) {
+						Token temp = t.getNextToken();
+						if (temp!=null && temp.isLeftCurly()) {
+							temp = temp.getNextToken();
+							if (temp!=null && temp.type==Token.RESERVED_WORD) {
+								if (currentFold==null) {
+									currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+									folds.add(currentFold);
+								}
+								else {
+									currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+								}
+								expectedStack.push(temp.getLexeme());
+								t = temp;
+							}
+						}
+					}
+
+					else if (t.is(Token.RESERVED_WORD, END) &&
+							currentFold!=null && !expectedStack.isEmpty()) {
+						Token temp = t.getNextToken();
+						if (temp!=null && temp.isLeftCurly()) {
+							temp = temp.getNextToken();
+							if (temp!=null && temp.type==Token.RESERVED_WORD) {
+								String value = temp.getLexeme();
+								if (expectedStack.peek().equals(value)) {
+									expectedStack.pop();
+									currentFold.setEndOffset(t.offset);
+									Fold parentFold = currentFold.getParent();
+									// Don't add fold markers for single-line blocks
+									if (currentFold.isOnSingleLine()) {
+										if (!currentFold.removeFromParent()) {
+											folds.remove(folds.size()-1);
+										}
+									}
+									t = temp;
+									currentFold = parentFold;
+								}
+							}
+						}
+					}
+
+					t = t.getNextToken();
+
+				}
+
+			}
+
+		} catch (BadLocationException ble) {
+			ble.printStackTrace(); // Never happens
+		}
+
+		return folds;
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/LispFoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/LispFoldParser.java
new file mode 100644
index 0000000..92a2d08
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/LispFoldParser.java
@@ -0,0 +1,33 @@
+/*
+ * 08/08/2012
+ *
+ * LispFoldParser.java - Fold parser for Lisp and related languages.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * Fold parser for Lisp and related languages.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class LispFoldParser extends CurlyFoldParser {
+
+
+	public boolean isLeftCurly(Token t) {
+		return t.isSingleChar(Token.SEPARATOR, '(');
+	}
+
+
+	public boolean isRightCurly(Token t) {
+		return t.isSingleChar(Token.SEPARATOR, ')');
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/NsisFoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/NsisFoldParser.java
new file mode 100644
index 0000000..0cd9a1e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/NsisFoldParser.java
@@ -0,0 +1,156 @@
+/*
+ * 10/07/2012
+ *
+ * NsisFoldParser.java - Fold parser for NSIS.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * A fold parser NSIS.<p>
+ *
+ * Note that this class may impose somewhat of a performance penalty on large
+ * source files, since it re-parses the entire document each time folds are
+ * reevaluated.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class NsisFoldParser implements FoldParser {
+
+	private static final char[] KEYWORD_FUNCTION		= "Function".toCharArray();
+	private static final char[] KEYWORD_FUNCTION_END	= "FunctionEnd".toCharArray();
+	private static final char[] KEYWORD_SECTION			= "Section".toCharArray();
+	private static final char[] KEYWORD_SECTION_END		= "SectionEnd".toCharArray();
+
+	protected static final char[] C_MLC_END = "*/".toCharArray();
+
+
+	private static final boolean foundEndKeyword(char[] keyword, Token t,
+			Stack endWordStack) {
+		return t.is(Token.RESERVED_WORD, keyword) && !endWordStack.isEmpty() &&
+			keyword==endWordStack.peek();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public List getFolds(RSyntaxTextArea textArea) {
+
+		List folds = new ArrayList();
+
+		Fold currentFold = null;
+		int lineCount = textArea.getLineCount();
+		boolean inMLC = false;
+		int mlcStart = 0;
+		Stack endWordStack = new Stack();
+
+		try {
+
+			for (int line=0; line<lineCount; line++) {
+
+				Token t = textArea.getTokenListForLine(line);
+				while (t!=null && t.isPaintable()) {
+
+					if (t.isComment()) {
+
+						if (inMLC) {
+							// If we found the end of an MLC that started
+							// on a previous line...
+							if (t.endsWith(C_MLC_END)) {
+								int mlcEnd = t.offset + t.textCount - 1;
+								if (currentFold==null) {
+									currentFold = new Fold(FoldType.COMMENT, textArea, mlcStart);
+									currentFold.setEndOffset(mlcEnd);
+									folds.add(currentFold);
+									currentFold = null;
+								}
+								else {
+									currentFold = currentFold.createChild(FoldType.COMMENT, mlcStart);
+									currentFold.setEndOffset(mlcEnd);
+									currentFold = currentFold.getParent();
+								}
+								//System.out.println("Ending MLC at: " + mlcEnd + ", parent==" + currentFold);
+								inMLC = false;
+								mlcStart = 0;
+							}
+							// Otherwise, this MLC is continuing on to yet
+							// another line.
+						}
+						else {
+							// If we're an MLC that ends on a later line...
+							if (t.type!=Token.COMMENT_EOL && !t.endsWith(C_MLC_END)) {
+								//System.out.println("Starting MLC at: " + t.offset);
+								inMLC = true;
+								mlcStart = t.offset;
+							}
+						}
+
+					}
+
+					else if (t.is(Token.RESERVED_WORD, KEYWORD_SECTION)) {
+						if (currentFold==null) {
+							currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+							folds.add(currentFold);
+						}
+						else {
+							currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+						}
+						endWordStack.push(KEYWORD_SECTION_END);
+					}
+
+					else if (t.is(Token.RESERVED_WORD, KEYWORD_FUNCTION)) {
+						if (currentFold==null) {
+							currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+							folds.add(currentFold);
+						}
+						else {
+							currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+						}
+						endWordStack.push(KEYWORD_FUNCTION_END);
+					}
+
+					else if (foundEndKeyword(KEYWORD_SECTION_END, t, endWordStack) ||
+							foundEndKeyword(KEYWORD_FUNCTION_END, t, endWordStack)) {
+						if (currentFold!=null) {
+							currentFold.setEndOffset(t.offset);
+							Fold parentFold = currentFold.getParent();
+							endWordStack.pop();
+							// Don't add fold markers for single-line blocks
+							if (currentFold.isOnSingleLine()) {
+								if (!currentFold.removeFromParent()) {
+									folds.remove(folds.size()-1);
+								}
+							}
+							currentFold = parentFold;
+						}
+					}
+
+					t = t.getNextToken();
+
+				}
+
+			}
+
+		} catch (BadLocationException ble) { // Should never happen
+			ble.printStackTrace();
+		}
+
+		return folds;
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/XmlFoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/XmlFoldParser.java
new file mode 100644
index 0000000..382e31b
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/XmlFoldParser.java
@@ -0,0 +1,148 @@
+/*
+ * 10/23/2011
+ *
+ * XmlFoldParser.java - Fold parser for XML.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * Fold parser for XML.  Any tags that span more than one line, as well as
+ * comment regions spanning more than one line, are identified as foldable
+ * regions.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class XmlFoldParser implements FoldParser {
+
+	private static final char[] MARKUP_CLOSING_TAG_START = { '<', '/' };
+	private static final char[] MARKUP_SHORT_TAG_END = { '/', '>' };
+	private static final char[] MLC_END = { '-', '-', '>' };
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public List getFolds(RSyntaxTextArea textArea) {
+
+		List folds = new ArrayList();
+
+		Fold currentFold = null;
+		int lineCount = textArea.getLineCount();
+		boolean inMLC = false;
+		int mlcStart = 0;
+
+		try {
+
+			for (int line=0; line<lineCount; line++) {
+
+				Token t = textArea.getTokenListForLine(line);
+				while (t!=null && t.isPaintable()) {
+
+					if (t.isComment()) {
+
+						// Continuing an MLC from a previous line
+						if (inMLC) {
+							// Found the end of the MLC starting on a previous line...
+							if (t.endsWith(MLC_END)) {
+								int mlcEnd = t.offset + t.textCount - 1;
+								if (currentFold==null) {
+									currentFold = new Fold(FoldType.COMMENT, textArea, mlcStart);
+									currentFold.setEndOffset(mlcEnd);
+									folds.add(currentFold);
+									currentFold = null;
+								}
+								else {
+									currentFold = currentFold.createChild(FoldType.COMMENT, mlcStart);
+									currentFold.setEndOffset(mlcEnd);
+									currentFold = currentFold.getParent();
+								}
+								inMLC = false;
+								mlcStart = 0;
+							}
+							// Otherwise, this MLC is continuing on to yet
+							// another line.
+						}
+
+						else {
+							// If we're an MLC that ends on a later line...
+							if (t.type==Token.COMMENT_MULTILINE && !t.endsWith(MLC_END)) {
+								inMLC = true;
+								mlcStart = t.offset;
+							}
+						}
+
+					}
+
+					else if (t.isSingleChar(Token.MARKUP_TAG_DELIMITER, '<')) {
+						if (currentFold==null) {
+							currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+							folds.add(currentFold);
+						}
+						else {
+							currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+						}
+					}
+
+					else if (t.is(Token.MARKUP_TAG_DELIMITER, MARKUP_SHORT_TAG_END)) {
+						if (currentFold!=null) {
+							Fold parentFold = currentFold.getParent();
+							removeFold(currentFold, folds);
+							currentFold = parentFold;
+						}
+					}
+
+					else if (t.is(Token.MARKUP_TAG_DELIMITER, MARKUP_CLOSING_TAG_START)) {
+						if (currentFold!=null) {
+							currentFold.setEndOffset(t.offset);
+							Fold parentFold = currentFold.getParent();
+							// Don't add fold markers for single-line blocks
+							if (currentFold.isOnSingleLine()) {
+								removeFold(currentFold, folds);
+							}
+							currentFold = parentFold;
+						}
+					}
+
+					t = t.getNextToken();
+
+				}
+
+			}
+
+		} catch (BadLocationException ble) { // Should never happen
+			ble.printStackTrace();
+		}
+
+		return folds;
+	
+	}
+
+
+	/**
+	 * If this fold has a parent fold, this method removes it from its parent.
+	 * Otherwise, it's assumed to be the most recent (top-level) fold in the
+	 * <code>folds</code> list, and is removed from that.
+	 *
+	 * @param fold The fold to remove.
+	 * @param folds The list of top-level folds.
+	 */
+	private static final void removeFold(Fold fold, List folds) {
+		if (!fold.removeFromParent()) {
+			folds.remove(folds.size()-1);
+		}
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/package.html b/src/org/fife/ui/rsyntaxtextarea/folding/package.html
new file mode 100644
index 0000000..f0f700d
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/package.html
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	Code folding functionality.
+	</body>
+</html>
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/AbstractMarkupTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/AbstractMarkupTokenMaker.java
new file mode 100644
index 0000000..6266f96
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/AbstractMarkupTokenMaker.java
@@ -0,0 +1,54 @@
+/*
+ * 10/03/2009
+ *
+ * AbstractMarkupTokenMaker.java - Base class for token makers for markup
+ * languages.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
+
+
+/**
+ * Base class for token makers for markup languages.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class AbstractMarkupTokenMaker extends AbstractJFlexTokenMaker {
+
+
+	/**
+	 * Returns whether markup close tags should be completed.
+	 *
+	 * @return Whether closing markup tags are to be completed.
+	 */
+	public abstract boolean getCompleteCloseTags();
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "<!--", "-->" };
+	}
+
+
+	/**
+	 * Overridden to return <code>true</code>.
+	 *
+	 * @return <code>true</code> always.
+	 */
+	public final boolean isMarkupLanguage() {
+		return true;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.flex
new file mode 100644
index 0000000..38effe7
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.flex
@@ -0,0 +1,498 @@
+/*
+ * 04/27/2010
+ *
+ * ActionScriptTokenMaker.java - Scanner for ActionScript.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the ActionScript.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated ActionScriptTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class ActionScriptTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public ActionScriptTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.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}[\"])
+
+MLCBegin					= ("/*")
+MLCEnd						= ("*/")
+LineCommentBegin			= ("//")
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral				= ({IntegerHelper1}[lL]?)
+HexLiteral				= ({IntegerHelper2}[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})
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier			= ({NonSeparator}+)
+
+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 EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"add" |
+	"and" |
+	"break" |
+	"case" |
+	"catch" |
+	"class" |
+	"const" |
+	"continue" |
+	"default" |
+	"delete" |
+	"do" |
+	"dynamic" |
+	"else" |
+	"eq" |
+	"extends" |
+	"final" |
+	"finally" |
+	"for" |
+	"for each" |
+	"function" |
+	"ge" |
+	"get" |
+	"gt" |
+	"if" |
+	"ifFrameLoaded" |
+	"implements" |
+	"import" |
+	"in" |
+	"include" |
+	"interface" |
+	"internal" |
+	"label" |
+	"le" |
+	"lt" |
+	"namespace" |
+	"native" |
+	"ne" |
+	"new" |
+	"not" |
+	"on" |
+	"onClipEvent" |
+	"or" |
+	"override" |
+	"package" |
+	"private" |
+	"protected" |
+	"public" |
+	"return" |
+	"set" |
+	"static" |
+	"super" |
+	"switch" |
+	"tellTarget" |
+	"this" |
+	"throw" |
+	"try" |
+	"typeof" |
+	"use" |
+	"var" |
+	"void" |
+	"while" |
+	"with" |
+
+	"null" |
+	"undefined"				{ addToken(Token.RESERVED_WORD); }
+
+	/* Built-in objects (good idea not to use these names!) */
+	"Array" |
+	"Boolean" |
+	"Color" |
+	"Date" |
+	"Function" |
+	"int" |
+	"Key" |
+	"MovieClip" |
+	"Math" |
+	"Mouse" |
+	"Null" |
+	"Number" |
+	"Object" |
+	"Selection" |
+	"Sound" |
+	"String" |
+	"uint" |
+	"Vector" |
+	"void" |
+	"XML" |
+	"XMLNode" |
+	"XMLSocket"			{ addToken(Token.DATA_TYPE); }
+
+	/* Global functions */
+	"call" |
+	"escape" |
+	"eval" |
+	"fscommand" |
+	"getProperty" |
+	"getTimer" |
+	"getURL" |
+	"getVersion" |
+	"gotoAndPlay" |
+	"gotoAndStop" |
+	"#include" |
+	"int" |
+	"isFinite" |
+	"isNaN" |
+	"loadMovie" |
+	"loadMovieNum" |
+	"loadVariables" |
+	"loadVariablesNum" |
+	"maxscroll" |
+	"newline" |
+	"nextFrame" |
+	"nextScene" |
+	"Number" |
+	"parseFloat" |
+	"parseInt" |
+	"play" |
+	"prevFrame" |
+	"prevScene" |
+	"print" |
+	"printAsBitmap" |
+	"printAsBitmapNum" |
+	"printNum" |
+	"random" |
+	"removeMovieClip" |
+	"scroll" |
+	"setProperty" |
+	"startDrag" |
+	"stop" |
+	"stopAllSounds" |
+	"stopDrag" |
+	"String" |
+	"targetPath" |
+	"tellTarget" |
+	"toggleHighQuality" |
+	"trace" |
+	"unescape" |
+	"unloadMovie" |
+	"unloadMovieNum" |
+	"updateAfterEvent"			{ addToken(Token.FUNCTION); }
+
+	/* Booleans. */
+	{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. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+	{LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+	/* Separators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{Operator}					{ 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); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<MLC> {
+
+	[^hwf\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<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; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.java
new file mode 100644
index 0000000..7460040
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.java
@@ -0,0 +1,2071 @@
+/* The following code was generated by JFlex 1.4.1 on 5/12/10 4:49 PM */
+
+/*
+ * 04/27/2010
+ *
+ * ActionScriptTokenMaker.java - Scanner for ActionScript.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the ActionScript.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated ActionScriptTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class ActionScriptTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int EOL_COMMENT = 2;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 1;
+
+  /** 
+   * 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\72\1\50\1\15"+
+    "\1\20\1\1\1\50\1\52\1\7\2\55\1\23\1\43\1\42\1\31"+
+    "\1\32\1\22\1\4\3\16\4\6\2\3\1\53\1\42\1\44\1\45"+
+    "\1\47\1\51\1\54\1\100\1\5\1\76\1\26\1\30\1\74\1\1"+
+    "\1\114\1\113\1\1\1\101\1\25\1\102\1\103\1\104\1\110\1\115"+
+    "\1\112\1\106\1\77\1\111\1\107\1\1\1\24\2\1\1\55\1\11"+
+    "\1\55\1\46\1\2\1\0\1\36\1\14\1\64\1\62\1\35\1\27"+
+    "\1\73\1\56\1\60\1\105\1\63\1\37\1\67\1\13\1\65\1\57"+
+    "\1\70\1\34\1\40\1\33\1\12\1\75\1\61\1\71\1\66\1\1"+
+    "\1\41\1\46\1\41\1\51\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 =
+    "\3\0\1\1\1\2\2\3\1\2\1\4\1\5\3\2"+
+    "\1\6\2\1\1\7\2\10\3\2\1\10\7\2\1\11"+
+    "\1\2\5\10\22\2\1\12\1\13\5\12\1\14\3\12"+
+    "\1\1\1\15\1\3\1\16\1\15\1\16\1\15\1\17"+
+    "\1\15\1\2\1\4\1\20\1\0\1\4\5\2\1\21"+
+    "\3\2\2\6\1\22\1\1\1\23\1\24\21\2\1\21"+
+    "\12\2\1\0\1\10\4\2\2\21\11\2\1\21\2\2"+
+    "\1\21\17\2\1\25\10\0\1\1\1\16\1\0\2\17"+
+    "\1\2\1\4\1\26\2\4\1\20\1\4\6\2\1\21"+
+    "\4\2\1\6\1\27\1\6\1\1\1\0\1\30\5\2"+
+    "\1\21\23\2\1\21\11\2\1\30\20\2\1\21\4\2"+
+    "\1\30\12\2\10\0\1\1\1\2\1\4\10\2\1\6"+
+    "\1\1\1\31\5\2\1\0\1\32\13\2\1\33\3\2"+
+    "\1\33\40\2\2\0\1\34\2\0\1\35\1\1\1\2"+
+    "\1\4\7\2\1\6\1\1\4\2\1\21\1\0\17\2"+
+    "\1\33\23\2\4\0\1\1\1\2\1\4\6\2\1\6"+
+    "\1\1\4\2\1\0\35\2\1\1\2\2\1\0\24\2"+
+    "\1\33\1\2\1\21\25\2\1\33\40\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[531];
+    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\116\0\234\0\352\0\u0138\0\u0186\0\u01d4\0\u0222"+
+    "\0\u0270\0\u02be\0\u030c\0\u035a\0\u03a8\0\u03f6\0\u02be\0\u0444"+
+    "\0\u0492\0\u04e0\0\u052e\0\u057c\0\u05ca\0\u0618\0\u0666\0\u06b4"+
+    "\0\u0702\0\u0750\0\u079e\0\u07ec\0\u083a\0\u0888\0\u02be\0\u02be"+
+    "\0\u08d6\0\u0924\0\u0972\0\u02be\0\u09c0\0\u0a0e\0\u0a5c\0\u0aaa"+
+    "\0\u0af8\0\u0b46\0\u0b94\0\u0be2\0\u0c30\0\u0c7e\0\u0ccc\0\u0d1a"+
+    "\0\u0d68\0\u0db6\0\u0e04\0\u0e52\0\u0ea0\0\u0eee\0\u0f3c\0\u0f8a"+
+    "\0\u02be\0\u0fd8\0\u1026\0\u1074\0\u10c2\0\u1110\0\u02be\0\u115e"+
+    "\0\u11ac\0\u11fa\0\u1248\0\u1296\0\u1296\0\u1296\0\u12e4\0\u1332"+
+    "\0\u1380\0\u13ce\0\u141c\0\u146a\0\u14b8\0\u02be\0\u1506\0\u1554"+
+    "\0\u15a2\0\u15f0\0\u163e\0\u168c\0\u16da\0\u1728\0\u1776\0\u17c4"+
+    "\0\u1812\0\u1860\0\u18ae\0\u02be\0\u18fc\0\u02be\0\u194a\0\u1998"+
+    "\0\u19e6\0\u1a34\0\u1a82\0\u1ad0\0\u1b1e\0\u1b6c\0\u1bba\0\u1c08"+
+    "\0\u1c56\0\u1ca4\0\u1cf2\0\u1d40\0\u1d8e\0\u1ddc\0\u1e2a\0\u1e78"+
+    "\0\u0138\0\u1ec6\0\u1f14\0\u1f62\0\u1fb0\0\u1ffe\0\u204c\0\u209a"+
+    "\0\u20e8\0\u2136\0\u2184\0\u052e\0\u21d2\0\u2220\0\u226e\0\u22bc"+
+    "\0\u230a\0\u2358\0\u23a6\0\u23f4\0\u2442\0\u2490\0\u24de\0\u252c"+
+    "\0\u257a\0\u25c8\0\u2616\0\u2664\0\u26b2\0\u2700\0\u274e\0\u279c"+
+    "\0\u27ea\0\u2838\0\u2886\0\u28d4\0\u2922\0\u2970\0\u29be\0\u2a0c"+
+    "\0\u2a5a\0\u2aa8\0\u2af6\0\u2b44\0\u2b92\0\u2be0\0\u2c2e\0\u02be"+
+    "\0\u2c7c\0\u2cca\0\u2d18\0\u2d66\0\u2db4\0\u2e02\0\u2e50\0\u2e9e"+
+    "\0\u2eec\0\u2f3a\0\u2f88\0\u1296\0\u2fd6\0\u3024\0\u3072\0\u02be"+
+    "\0\u30c0\0\u310e\0\u1506\0\u315c\0\u31aa\0\u31f8\0\u3246\0\u3294"+
+    "\0\u32e2\0\u3330\0\u337e\0\u33cc\0\u341a\0\u3468\0\u34b6\0\u3504"+
+    "\0\u02be\0\u3552\0\u35a0\0\u35ee\0\u363c\0\u368a\0\u36d8\0\u3726"+
+    "\0\u3774\0\u37c2\0\u3810\0\u385e\0\u38ac\0\u38fa\0\u3948\0\u3996"+
+    "\0\u39e4\0\u3a32\0\u3a80\0\u3ace\0\u3b1c\0\u3b6a\0\u3bb8\0\u3c06"+
+    "\0\u3c54\0\u3ca2\0\u3cf0\0\u3d3e\0\u3d8c\0\u3dda\0\u3e28\0\u3e76"+
+    "\0\u3ec4\0\u3f12\0\u3f60\0\u3fae\0\u3ffc\0\u404a\0\u4098\0\u40e6"+
+    "\0\u4134\0\u4182\0\u41d0\0\u421e\0\u426c\0\u42ba\0\u4308\0\u4356"+
+    "\0\u43a4\0\u43f2\0\u4440\0\u448e\0\u44dc\0\u452a\0\u4578\0\u45c6"+
+    "\0\u4614\0\u4662\0\u46b0\0\u46fe\0\u474c\0\u479a\0\u0138\0\u47e8"+
+    "\0\u4836\0\u4884\0\u48d2\0\u4920\0\u496e\0\u49bc\0\u4a0a\0\u4a58"+
+    "\0\u4aa6\0\u4af4\0\u4b42\0\u4b90\0\u4bde\0\u4c2c\0\u4c7a\0\u4cc8"+
+    "\0\u4d16\0\u4d64\0\u4db2\0\u4e00\0\u4e4e\0\u4e9c\0\u4eea\0\u4f38"+
+    "\0\u4f86\0\u4fd4\0\u5022\0\u5070\0\u50be\0\u510c\0\u02be\0\u515a"+
+    "\0\u51a8\0\u51f6\0\u5244\0\u5292\0\u52e0\0\u0138\0\u532e\0\u537c"+
+    "\0\u53ca\0\u5418\0\u5466\0\u54b4\0\u5502\0\u5550\0\u559e\0\u55ec"+
+    "\0\u563a\0\u0138\0\u5688\0\u56d6\0\u5724\0\u5772\0\u57c0\0\u580e"+
+    "\0\u585c\0\u58aa\0\u58f8\0\u5946\0\u5994\0\u59e2\0\u5a30\0\u5a7e"+
+    "\0\u5acc\0\u5b1a\0\u5b68\0\u5bb6\0\u5c04\0\u5c52\0\u5ca0\0\u5cee"+
+    "\0\u5d3c\0\u5d8a\0\u5dd8\0\u5e26\0\u5e74\0\u5ec2\0\u5f10\0\u5f5e"+
+    "\0\u5fac\0\u5ffa\0\u6048\0\u6096\0\u60e4\0\u6132\0\u6180\0\u61ce"+
+    "\0\u621c\0\u626a\0\u62b8\0\u6306\0\u6354\0\u63a2\0\u63f0\0\u643e"+
+    "\0\u648c\0\u64da\0\u6528\0\u6576\0\u65c4\0\u6612\0\u6660\0\u66ae"+
+    "\0\u66fc\0\u674a\0\u6798\0\u67e6\0\u6834\0\u6882\0\u68d0\0\u691e"+
+    "\0\u696c\0\u69ba\0\u6a08\0\u6a56\0\u6aa4\0\u6af2\0\u6b40\0\u6b8e"+
+    "\0\u6bdc\0\u6c2a\0\u6c78\0\u6cc6\0\u6d14\0\u6d62\0\u6db0\0\u6dfe"+
+    "\0\u6e4c\0\u6e9a\0\u6ee8\0\u6f36\0\u6f84\0\u6fd2\0\u7020\0\u706e"+
+    "\0\u70bc\0\u710a\0\u7158\0\u71a6\0\u71f4\0\u7242\0\u7290\0\u72de"+
+    "\0\u732c\0\u737a\0\u621c\0\u73c8\0\u6306\0\u7416\0\u7464\0\u74b2"+
+    "\0\u7500\0\u754e\0\u759c\0\u75ea\0\u7638\0\u7686\0\u76d4\0\u7722"+
+    "\0\u7770\0\u77be\0\u780c\0\u785a\0\u78a8\0\u78f6\0\u7944\0\u7992"+
+    "\0\u79e0\0\u7a2e\0\u7a7c\0\u7aca\0\u7b18\0\u7b66\0\u7bb4\0\u7c02"+
+    "\0\u7c50\0\u7c9e\0\u7cec\0\u7d3a\0\u7d88\0\u7dd6\0\u7e24\0\u7e72"+
+    "\0\u7ec0\0\u7f0e\0\u7f5c\0\u7faa\0\u7ff8\0\u8046\0\u8094\0\u80e2"+
+    "\0\u8130\0\u817e\0\u81cc\0\u821a\0\u8268\0\u82b6\0\u8304\0\u8352"+
+    "\0\u83a0\0\u83ee\0\u843c\0\u848a\0\u84d8\0\u8526\0\u8574\0\u85c2"+
+    "\0\u8610\0\u865e\0\u86ac\0\u86fa\0\u8748\0\u8796\0\u87e4\0\u8832"+
+    "\0\u8880\0\u88ce\0\352\0\u891c\0\u02be\0\u896a\0\u89b8\0\u8a06"+
+    "\0\u8a54\0\u8aa2\0\u8af0\0\u8b3e\0\u8b8c\0\u8bda\0\u8c28\0\u8c76"+
+    "\0\u8cc4\0\u8d12\0\u8d60\0\u8dae\0\u8dfc\0\u8e4a\0\u8e98\0\u8ee6"+
+    "\0\u8f34\0\u8f82\0\u8fd0\0\u901e\0\u906c\0\u90ba\0\u9108\0\u9156"+
+    "\0\u91a4\0\u91f2\0\u9240\0\u928e\0\u92dc\0\u932a\0\u9378\0\u93c6"+
+    "\0\u9414\0\u9462\0\u94b0\0\u94fe\0\u954c\0\u959a\0\u95e8\0\u9636"+
+    "\0\u9684\0\u96d2\0\u9720\0\u976e\0\u97bc\0\u980a\0\u9858\0\u98a6"+
+    "\0\u98f4\0\u9942\0\u9990";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[531];
+    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\4\2\5\1\6\1\7\1\10\1\6\1\11\1\12"+
+    "\1\4\1\13\1\14\1\15\1\16\1\6\1\17\1\20"+
+    "\1\21\1\22\1\23\1\24\1\5\1\25\1\26\1\5"+
+    "\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36"+
+    "\1\37\1\40\1\41\1\42\2\23\1\43\1\23\1\44"+
+    "\1\45\1\44\1\4\1\37\1\5\1\46\1\47\1\50"+
+    "\1\51\1\5\1\52\1\53\1\5\1\54\2\5\1\21"+
+    "\1\55\1\56\1\57\1\60\1\5\1\61\1\62\1\63"+
+    "\1\64\1\65\1\5\1\66\1\67\6\5\10\70\1\71"+
+    "\12\70\1\72\3\70\1\73\26\70\1\74\2\70\1\75"+
+    "\34\70\10\76\1\77\16\76\1\100\26\76\1\101\2\76"+
+    "\1\102\34\76\7\4\2\0\4\4\1\0\1\4\1\0"+
+    "\1\4\3\0\5\4\2\0\6\4\13\0\1\4\1\0"+
+    "\14\4\1\0\24\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\3\104\2\6\1\104"+
+    "\1\6\2\0\4\104\1\0\1\6\1\0\1\104\3\0"+
+    "\1\104\1\105\2\106\1\107\1\0\1\110\2\104\1\107"+
+    "\1\104\1\105\1\104\13\0\1\104\1\0\4\104\1\106"+
+    "\7\104\1\0\1\104\1\106\24\104\1\111\1\112\1\104"+
+    "\1\112\2\0\4\104\1\0\1\112\1\0\1\104\3\0"+
+    "\1\113\1\105\2\106\1\107\1\0\1\110\2\104\1\107"+
+    "\1\104\1\105\1\104\13\0\1\104\1\0\4\104\1\106"+
+    "\6\104\1\113\1\0\1\104\1\106\21\104\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\114"+
+    "\4\5\1\0\23\5\7\115\1\116\1\117\1\120\104\115"+
+    "\116\0\1\4\6\5\2\0\1\103\1\5\1\121\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\5\5"+
+    "\1\122\13\0\1\4\1\0\1\5\1\123\1\124\11\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\1\125\2\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\126\1\127\2\5\13\0\1\4\1\0\7\5\1\130"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+    "\1\131\4\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\10\16\1\132\1\133\3\16\1\134\100\16\7\4\2\0"+
+    "\4\4\1\0\1\4\1\0\1\4\3\0\5\4\2\0"+
+    "\6\4\13\0\1\4\1\0\2\4\1\135\11\4\1\0"+
+    "\23\4\21\0\1\21\50\0\1\21\45\0\1\136\1\137"+
+    "\21\0\1\44\115\0\1\44\50\0\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\7\5"+
+    "\1\140\13\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\141"+
+    "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\1\142\2\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\3\5\1\143\1\5\1\144"+
+    "\13\0\1\4\1\0\2\5\1\145\4\5\1\146\4\5"+
+    "\1\0\23\5\31\0\1\44\13\0\1\44\53\0\2\110"+
+    "\1\0\1\110\7\0\1\110\77\0\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\5\1\147\1\150\1\151\2\5\13\0\1\4"+
+    "\1\0\1\152\6\5\1\153\1\154\3\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\155\1\156\2\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\4\5\1\157\1\160\13\0\1\4\1\0"+
+    "\12\5\1\161\1\162\1\0\2\5\1\163\20\5\1\4"+
+    "\6\5\2\0\1\103\1\5\1\164\1\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\4\5\1\164\7\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\161\1\5\1\161\1\165\2\5\13\0"+
+    "\1\4\1\0\7\5\1\166\4\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\1\167\2\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\170\1\5\1\171\3\5"+
+    "\13\0\1\4\1\0\3\5\1\172\2\5\1\173\5\5"+
+    "\1\0\23\5\43\0\1\44\1\0\1\44\114\0\1\174"+
+    "\1\44\115\0\1\44\1\0\1\175\113\0\1\44\4\0"+
+    "\1\44\43\0\1\4\6\5\2\0\1\103\1\176\2\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+    "\1\177\1\5\1\200\1\201\1\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\1\5"+
+    "\1\202\1\5\1\0\1\5\1\0\1\4\3\0\3\5"+
+    "\1\203\1\5\2\0\5\5\1\204\13\0\1\4\1\0"+
+    "\11\5\1\205\2\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\1\206\1\5\1\207"+
+    "\11\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\210\3\5\13\0\1\4\1\0\7\5\1\161\1\211"+
+    "\3\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+    "\1\212\1\213\1\5\13\0\1\4\1\0\7\5\1\214"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\1\5"+
+    "\1\215\1\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\5\1\161\4\5\13\0\1\4\1\0\14\5"+
+    "\1\0\2\5\1\216\20\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\3\5\1\217\2\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\161\1\5\1\220"+
+    "\3\5\13\0\1\4\1\0\7\5\1\221\4\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\222\2\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\223\2\5\13\0\1\4\1\0\7\5"+
+    "\1\224\4\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\7\5\1\225\4\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\5\1\226\4\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\227\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+    "\1\230\2\5\13\0\1\4\1\0\7\5\1\231\4\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\1\232\2\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\2\5\1\233\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\234\1\5"+
+    "\1\235\3\5\13\0\1\4\1\0\7\5\1\236\4\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\237"+
+    "\3\5\13\0\1\4\1\0\14\5\1\0\23\5\10\70"+
+    "\1\0\12\70\1\0\3\70\1\0\26\70\1\0\2\70"+
+    "\1\0\34\70\22\0\1\240\126\0\1\241\24\0\1\242"+
+    "\70\0\1\243\143\0\1\244\34\0\10\76\1\0\16\76"+
+    "\1\0\26\76\1\0\2\76\1\0\34\76\33\0\1\245"+
+    "\24\0\1\246\70\0\1\247\143\0\1\250\34\0\7\4"+
+    "\2\0\1\4\1\251\2\4\1\0\1\4\1\0\1\4"+
+    "\3\0\5\4\2\0\6\4\13\0\1\4\1\0\14\4"+
+    "\1\0\23\4\7\104\2\0\4\104\1\0\1\104\1\0"+
+    "\1\104\3\0\5\104\2\0\6\104\13\0\1\104\1\0"+
+    "\14\104\1\0\26\104\2\252\1\104\1\252\2\0\4\104"+
+    "\1\0\1\252\1\0\1\104\3\0\5\104\1\253\1\0"+
+    "\6\104\2\0\1\253\10\0\1\104\1\0\14\104\1\0"+
+    "\26\104\2\110\1\104\1\110\2\0\4\104\1\0\1\110"+
+    "\1\0\1\104\3\0\2\104\2\106\1\107\2\0\2\104"+
+    "\1\107\3\104\13\0\1\104\1\0\4\104\1\106\7\104"+
+    "\1\0\1\104\1\106\24\104\2\111\1\104\1\111\2\0"+
+    "\4\104\1\0\1\111\1\0\1\104\3\0\2\104\2\106"+
+    "\1\107\1\0\1\110\2\104\1\107\3\104\13\0\1\104"+
+    "\1\0\4\104\1\106\7\104\1\0\1\104\1\106\24\104"+
+    "\1\111\1\112\1\104\1\112\2\0\4\104\1\0\1\112"+
+    "\1\0\1\104\3\0\1\104\1\254\2\106\1\107\1\0"+
+    "\1\110\2\104\1\107\1\104\1\254\1\104\13\0\1\104"+
+    "\1\0\4\104\1\106\7\104\1\0\1\104\1\106\24\104"+
+    "\4\255\2\0\3\104\1\255\1\0\1\255\1\0\1\104"+
+    "\3\0\2\104\3\255\2\0\2\104\2\255\2\104\13\0"+
+    "\1\104\1\0\4\104\1\255\1\104\1\255\5\104\1\0"+
+    "\1\104\1\255\1\104\1\255\1\104\1\255\15\104\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\7\5"+
+    "\1\256\4\5\1\0\23\5\7\257\1\260\1\0\105\257"+
+    "\7\0\1\260\106\0\4\257\1\261\1\257\1\262\1\263"+
+    "\1\0\1\115\1\264\3\115\1\261\10\257\1\115\3\257"+
+    "\2\115\61\257\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\265"+
+    "\1\5\1\266\1\5\13\0\1\4\1\0\4\5\1\267"+
+    "\7\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\161\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\4\5\1\270\7\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\1\5\1\271\1\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\272"+
+    "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\3\5"+
+    "\1\273\7\5\1\274\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\275\5\5\13\0\1\4\1\0\11\5\1\276"+
+    "\2\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\161"+
+    "\5\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\2\5\1\277\3\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\11\132\1\300\3\132\1\301"+
+    "\104\132\1\16\1\132\2\16\1\0\1\16\1\302\4\16"+
+    "\10\132\1\16\3\132\2\16\61\132\7\4\2\0\2\4"+
+    "\1\303\1\4\1\0\1\4\1\0\1\4\3\0\5\4"+
+    "\2\0\6\4\13\0\1\4\1\0\14\4\1\0\23\4"+
+    "\23\0\1\304\72\0\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\1\5\1\305\3\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\306\5\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\1\5\1\307\1\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\4\5\1\310\1\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\6\5\1\311"+
+    "\5\5\1\0\23\5\1\4\6\5\2\0\1\103\1\5"+
+    "\1\312\1\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\5\1\313\4\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\1\314\2\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\3\5\1\315\2\5\13\0\1\4\1\0"+
+    "\10\5\1\161\3\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\4\5\1\316\1\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\5\1\317"+
+    "\4\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\5\1\320\4\5\13\0\1\4"+
+    "\1\0\2\5\1\321\11\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\1\322\22\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\1\5\1\323\12\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\324\5\5\13\0\1\4\1\0"+
+    "\11\5\1\325\2\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\1\5\1\326\1\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\5\5\1\122"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\6\5\1\327"+
+    "\5\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\330"+
+    "\5\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\3\5\1\331\2\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\4\5\1\161\7\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\2\5\1\332\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\333\2\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\1\5\1\334\12\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\3\5\1\335\2\5\13\0\1\4"+
+    "\1\0\7\5\1\336\4\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\337\5\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\2\5\1\340\11\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\5\1\341\4\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\45\0\1\44\1\0\1\23"+
+    "\46\0\1\4\6\5\2\0\1\103\2\5\1\342\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\2\5\1\343\3\5\13\0\1\4\1\0\2\5"+
+    "\1\344\4\5\1\345\4\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\5\1\346\4\5\13\0\1\4\1\0"+
+    "\6\5\1\347\5\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\350\2\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\351\5\5"+
+    "\13\0\1\4\1\0\6\5\1\352\5\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\0\1\5\1\353\21\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\1\5"+
+    "\1\354\6\5\1\355\12\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\1\5\1\356\12\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\2\5\1\357\11\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\360\5\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\3\5\1\361\1\5\2\0"+
+    "\4\5\1\362\1\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\5\1\363\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\364\3\5\1\331\1\122\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\3\5\1\365\2\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\5\1\366\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\3\5\1\367\17\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\370\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\13\5\1\371\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\1\372\5\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\373\5\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\1\5\1\374\1\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\5\1\161\4\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\2\5\1\164"+
+    "\11\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\4\5"+
+    "\1\375\1\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\5\1\376\4\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\10\5\1\377\3\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\u0100\5\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\1\u0101\2\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\2\5\1\u0102\20\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\4\5\1\u0103\1\5\13\0\1\4\1\0\11\5\1\u0104"+
+    "\2\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\12\5\1\u0105\10\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\5\1\u0106\4\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\4\5\1\u0107\1\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\1\u0108\2\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\6\5\1\u0109"+
+    "\5\5\1\0\23\5\57\0\1\u010a\75\0\1\u010b\111\0"+
+    "\1\u010c\143\0\1\u010d\113\0\1\u010e\75\0\1\u010f\111\0"+
+    "\1\u0110\143\0\1\u0111\34\0\3\4\4\u0112\2\0\3\4"+
+    "\1\u0112\1\0\1\u0112\1\0\1\4\3\0\2\4\3\u0112"+
+    "\2\0\2\4\2\u0112\2\4\13\0\1\4\1\0\4\4"+
+    "\1\u0112\1\4\1\u0112\5\4\1\0\1\4\1\u0112\1\4"+
+    "\1\u0112\1\4\1\u0112\15\4\3\104\2\252\1\104\1\252"+
+    "\2\0\4\104\1\0\1\252\1\0\1\104\3\0\2\104"+
+    "\2\106\1\104\2\0\6\104\13\0\1\104\1\0\4\104"+
+    "\1\106\7\104\1\0\1\104\1\106\21\104\3\0\2\252"+
+    "\1\0\1\252\7\0\1\252\77\0\3\104\4\255\2\0"+
+    "\3\104\1\255\1\0\1\255\1\0\1\104\3\0\1\104"+
+    "\1\254\3\255\2\0\2\104\2\255\1\254\1\104\13\0"+
+    "\1\104\1\0\4\104\1\255\1\104\1\255\5\104\1\0"+
+    "\1\104\1\255\1\104\1\255\1\104\1\255\15\104\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\4\5\1\u0113\1\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\7\257\1\116\1\0\111\257"+
+    "\1\262\1\257\1\262\1\260\1\0\5\257\1\262\103\257"+
+    "\1\115\1\257\1\115\1\260\1\0\5\257\1\115\102\257"+
+    "\4\u0114\1\116\1\0\3\257\1\u0114\1\257\1\u0114\7\257"+
+    "\3\u0114\4\257\2\u0114\23\257\1\u0114\1\257\1\u0114\7\257"+
+    "\1\u0114\1\257\1\u0114\1\257\1\u0114\15\257\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\5\5\1\160\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\7\5\1\u0115\4\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\2\5\1\u0116\3\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\3\5\1\u0117\2\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\377\5\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\4\5\1\161\1\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\u0118"+
+    "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\u0119\5\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\2\5\1\u011a\11\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\u011b\3\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\u011c\2\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\10\132\1\0\110\132\4\u011d\2\132\1\300"+
+    "\2\132\1\u011d\1\301\1\u011d\7\132\3\u011d\4\132\2\u011d"+
+    "\23\132\1\u011d\1\132\1\u011d\7\132\1\u011d\1\132\1\u011d"+
+    "\1\132\1\u011d\15\132\7\4\2\0\4\4\1\0\1\4"+
+    "\1\0\1\4\3\0\5\4\2\0\6\4\13\0\1\4"+
+    "\1\0\6\4\1\u011e\5\4\1\0\23\4\22\0\1\u011f"+
+    "\73\0\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\10\5\1\u0120\2\5\1\u0121\7\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\377\3\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\6\5\1\u0122\5\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\5\5\1\314"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u0123"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+    "\1\u0124\2\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\u0125\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u0126\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\6\5\1\u0127\5\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\4\5\1\u0128\1\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\1\u0129\22\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u012a"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\5\5"+
+    "\1\161\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\1\u012b\22\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u012c\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\1\u012d\2\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\7\5\1\u012e\4\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\4\5\1\u012f\7\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\3\5\1\u0130\2\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u0131\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\4\5\1\u0132\1\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\2\5\1\272\3\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\4\5\1\u0133\7\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\2\5\1\223\3\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\1\u0134\1\u0135\4\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\1\5\1\u0136\12\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\15\5\1\u0137\5\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\364"+
+    "\5\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\7\5"+
+    "\1\u0138\4\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\4\5\1\u0134\1\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\2\5\1\u0119\20\5\1\4\6\5"+
+    "\2\0\1\103\1\5\1\u0139\1\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\0\2\5\1\u013a\20\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\u013b\5\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\5\5\1\u013c\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\5\5\1\u013d\6\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\10\5\1\u0132\3\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\2\5\1\u013e\3\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\4\5\1\u013f\1\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\5\1\u0140\4\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\2\5\1\u0141"+
+    "\11\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+    "\1\u0142\2\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\4\5\1\u0143\1\5\13\0"+
+    "\1\4\1\0\7\5\1\u0144\4\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\4\5\1\122\1\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\1\161\13\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\3\5\1\u0145\2\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\2\5\1\u0146\3\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\u0147"+
+    "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\6\5"+
+    "\1\360\5\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\5\5\1\321\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\u0148\4\5\1\130\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\4\5\1\u0149\1\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\5\1\u014a"+
+    "\4\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\5\5\1\u014b\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\4\5\1\u014c\7\5"+
+    "\1\u014d\1\u0137\1\u014e\4\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\7\5\1\u014f\4\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\6\5\1\u0150\5\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u0151"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+    "\1\227\2\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\1\377\13\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\5\5\1\306\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\2\5\1\u0152\11\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\4\5\1\377\1\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\2\5\1\u0153"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\u0154\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\2\5\1\u0155\11\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\374\3\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\1\5\1\u0156\1\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\375\5\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\53\0\1\u0157"+
+    "\77\0\1\u010a\137\0\1\u0158\70\0\1\u0159\136\0\1\u015a"+
+    "\77\0\1\u010e\137\0\1\u015b\70\0\1\u015c\63\0\3\4"+
+    "\4\u015d\2\0\3\4\1\u015d\1\0\1\u015d\1\0\1\4"+
+    "\3\0\2\4\3\u015d\2\0\2\4\2\u015d\2\4\13\0"+
+    "\1\4\1\0\4\4\1\u015d\1\4\1\u015d\5\4\1\0"+
+    "\1\4\1\u015d\1\4\1\u015d\1\4\1\u015d\16\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\u015e\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\3\257\4\u015f\1\116\1\0\3\257"+
+    "\1\u015f\1\257\1\u015f\7\257\3\u015f\4\257\2\u015f\23\257"+
+    "\1\u015f\1\257\1\u015f\7\257\1\u015f\1\257\1\u015f\1\257"+
+    "\1\u015f\15\257\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\u0160"+
+    "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\3\5\1\u0161\1\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\1\u0162\5\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\2\5\1\u0163\11\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\1\5"+
+    "\1\u0164\11\5\1\u0165\7\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\14\5\1\0\2\5\1\122"+
+    "\20\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\5\5\1\u0166\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\5\5\1\161\6\5"+
+    "\1\0\23\5\3\132\4\u0167\2\132\1\300\2\132\1\u0167"+
+    "\1\301\1\u0167\7\132\3\u0167\4\132\2\u0167\23\132\1\u0167"+
+    "\1\132\1\u0167\7\132\1\u0167\1\132\1\u0167\1\132\1\u0167"+
+    "\15\132\7\4\2\0\4\4\1\0\1\4\1\0\1\4"+
+    "\3\0\5\4\2\0\4\4\1\u0168\1\4\13\0\1\4"+
+    "\1\0\14\4\1\0\24\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\7\5\1\u0169\4\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\7\5\1\u016a\4\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\u016b\5\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\11\5\1\u016c\2\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\4\5\1\u016d\1\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\35\0\1\u016e\60\0\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\u0132\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\4\5\1\u016f\16\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\u0170\3\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\3\5\1\161\10\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\u0171"+
+    "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\7\5"+
+    "\1\u0172\4\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\1\5\1\u0173\4\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\2\5\1\u0174\20\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u0175"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\1\5\1\u0127\12\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\1\5\1\u0176\1\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\7\5"+
+    "\1\u0177\4\5\1\u0178\6\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\2\5\1\u0179\11\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\u017a\5\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\2\5"+
+    "\1\u017b\2\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\5\5\1\u017c\15\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\1\5\1\u017d\4\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\4\5\1\331\1\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\u017e\5\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\u0146"+
+    "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\2\5\1\u017f\3\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\2\5\1\u0180\3\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\3\5\1\u0181\2\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\5\1\u0182\4\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\1\u0183"+
+    "\2\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\3\5\1\u0184\2\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\1\5\1\u0185\1\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\10\5\1\u0132\12\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\u0186\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+    "\1\130\4\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\1\u0187\2\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\1\122\5\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\11\5\1\u0134\2\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\2\5\1\u0188\11\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\2\5\1\u0189\11\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\5\1\u018a\4\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\6\5\1\173\5\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\2\5\1\u018b\11\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\u018c\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\17\5\1\u018d\3\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\0\5\5\1\u018e\15\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\u018f\5\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\5\1\377\4\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\u0190\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u0151\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\6\5\1\271\5\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\1\5\1\u0191\1\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\4\5\1\377\7\5\1\0\23\5\22\0"+
+    "\1\u0192\133\0\1\u010a\12\0\1\u0157\43\0\1\u0159\1\u0193"+
+    "\4\u0159\1\u0193\2\0\3\u0159\1\0\1\u0159\1\0\1\u0193"+
+    "\1\0\1\u0159\1\u0193\5\u0159\2\u0193\6\u0159\1\0\2\u0193"+
+    "\1\0\1\u0193\2\0\6\u0193\14\u0159\1\0\23\u0159\22\0"+
+    "\1\u0194\133\0\1\u010e\12\0\1\u015a\43\0\1\u015c\1\u0195"+
+    "\4\u015c\1\u0195\2\0\3\u015c\1\0\1\u015c\1\0\1\u0195"+
+    "\1\0\1\u015c\1\u0195\5\u015c\2\u0195\6\u015c\1\0\2\u0195"+
+    "\1\0\1\u0195\2\0\6\u0195\14\u015c\1\0\23\u015c\3\4"+
+    "\4\u0196\2\0\3\4\1\u0196\1\0\1\u0196\1\0\1\4"+
+    "\3\0\2\4\3\u0196\2\0\2\4\2\u0196\2\4\13\0"+
+    "\1\4\1\0\4\4\1\u0196\1\4\1\u0196\5\4\1\0"+
+    "\1\4\1\u0196\1\4\1\u0196\1\4\1\u0196\16\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\3\5\1\u0197\2\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\3\257\4\u0198\1\116\1\0\3\257"+
+    "\1\u0198\1\257\1\u0198\7\257\3\u0198\4\257\2\u0198\23\257"+
+    "\1\u0198\1\257\1\u0198\7\257\1\u0198\1\257\1\u0198\1\257"+
+    "\1\u0198\15\257\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\4\5\1\u0199\7\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\2\5"+
+    "\1\u019a\11\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\2\5\1\u019b\3\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\5\1\u0127\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\5\1\u019c\4\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\6\5\1\u019d\5\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\1\5\1\u019e\12\5\1\0\23\5\3\132\4\u019f\2\132"+
+    "\1\300\2\132\1\u019f\1\301\1\u019f\7\132\3\u019f\4\132"+
+    "\2\u019f\23\132\1\u019f\1\132\1\u019f\7\132\1\u019f\1\132"+
+    "\1\u019f\1\132\1\u019f\15\132\7\4\2\0\1\4\1\u01a0"+
+    "\2\4\1\0\1\4\1\0\1\4\3\0\5\4\2\0"+
+    "\6\4\13\0\1\4\1\0\14\4\1\0\24\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\4\5\1\306"+
+    "\7\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\6\5\1\u01a1\5\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\2\5\1\u01a2\11\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\11\5\1\u01a3\2\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\u01a4"+
+    "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\36\0"+
+    "\1\u01a5\57\0\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\u01a6"+
+    "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\u01a7\5\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u01a8\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\3\5\1\161\1\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\1\5\1\161\1\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\u01a9"+
+    "\3\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\11\5"+
+    "\1\u0132\2\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\4\5\1\321\7\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\7\5\1\u01aa\4\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\3\5\1\u01ab\2\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\6\5\1\161\5\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\2\5\1\u017b\2\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\5\1\u01ac\4\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\u01ad"+
+    "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\7\5"+
+    "\1\u01ae\4\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\14\5\1\0\5\5\1\u01af"+
+    "\2\5\1\u01b0\12\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\6\5\1\u01b1\5\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\0\1\5\1\u01b2\16\5\1\u01b3\2\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\1\122\22\5\1\4\6\5\2\0\1\103\1\5"+
+    "\1\u01b4\1\5\1\0\1\5\1\0\1\4\3\0\3\5"+
+    "\1\u019e\1\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\4\5\1\122\7\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\11\5"+
+    "\1\u01b5\2\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\2\5\1\u01b6\11\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\11\5\1\u01b7\2\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\4\5\1\130\1\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\1\5"+
+    "\1\u01b8\1\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\1\5\1\u01b9\12\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\2\5\1\u0183\11\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\11\5\1\u01ba\2\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\5\1\u01bb\4\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\1\5\1\u0132"+
+    "\3\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\5\1\u01bc\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\2\5\1\u01bd"+
+    "\11\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\3\5\1\u01be\17\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\0\1\377\22\5\22\0\1\u0159\115\0\1\u015c"+
+    "\73\0\3\4\4\5\2\0\3\4\1\5\1\0\1\5"+
+    "\1\0\1\4\3\0\2\4\3\5\2\0\2\4\2\5"+
+    "\2\4\13\0\1\4\1\0\4\4\1\5\1\4\1\5"+
+    "\5\4\1\0\1\4\1\5\1\4\1\5\1\4\1\5"+
+    "\16\4\6\5\2\0\1\103\1\5\1\377\1\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\3\257\4\115\1\116"+
+    "\1\0\3\257\1\115\1\257\1\115\7\257\3\115\4\257"+
+    "\2\115\23\257\1\115\1\257\1\115\7\257\1\115\1\257"+
+    "\1\115\1\257\1\115\15\257\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\14\5\1\0\7\5\1\u0177"+
+    "\13\5\1\4\6\5\2\0\1\103\1\5\1\u01bf\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\5\5\1\u01c0\15\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+    "\1\u01c1\2\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\u0163\3\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\u01c2\2\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\3\132\4\16\2\132\1\300\2\132\1\16"+
+    "\1\301\1\16\7\132\3\16\4\132\2\16\23\132\1\16"+
+    "\1\132\1\16\7\132\1\16\1\132\1\16\1\132\1\16"+
+    "\15\132\7\4\2\0\4\4\1\0\1\4\1\0\1\4"+
+    "\3\0\5\4\2\0\6\4\13\0\1\4\1\0\4\4"+
+    "\1\u01c3\7\4\1\0\24\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\5\5\1\u01c4\6\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\7\5\1\u0173\4\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\u01c5\2\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\10\5\1\161\3\5\1\0\23\5\64\0"+
+    "\1\u01c6\31\0\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\5\1\u01c7"+
+    "\4\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\15\5\1\u01c8\5\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\14\5\1\0\21\5\1\u01c9"+
+    "\1\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\7\5\1\u01ca\13\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\2\5\1\u01cb\20\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+    "\1\u01cc\4\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\3\5\1\u01cd\2\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\4\5\1\u01ce\1\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\1\5\1\u01cf\12\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\5\5\1\u01d0\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\1\u0175"+
+    "\2\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\u01bf\5\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\4\5"+
+    "\1\u01d1\1\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\1\5\1\u01d2\1\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\272\2\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\u01d3"+
+    "\3\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\u0127\5\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u01d4\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\1\122\2\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\4\5\1\u01d5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\u01d6\3\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\5\5\1\u01d7\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\4\5\1\u01d8\7\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u0197"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\4\5"+
+    "\1\u01d9\1\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\164\3\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\3\5"+
+    "\1\u01da\1\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\11\5\1\u0127\2\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\6\5"+
+    "\1\122\5\5\1\0\23\5\7\4\2\0\4\4\1\0"+
+    "\1\4\1\0\1\4\3\0\5\4\2\0\2\4\1\u01db"+
+    "\3\4\13\0\1\4\1\0\14\4\1\0\24\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\271\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\1\5"+
+    "\1\u01dc\1\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\56\0\1\u01dd\37\0\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\1\u01de\22\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\3\5\1\u01df\2\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\2\5\1\u01e0\11\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\7\5\1\u01e1\4\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\2\5\1\u01e2"+
+    "\11\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\2\5\1\u01e3\11\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\0\1\u0132\22\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\14\5\1\0\13\5\1\u01e4"+
+    "\7\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\2\5\1\u01e5\3\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\4\5"+
+    "\1\u01e6\1\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\7\5\1\u01e7\4\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\u0132\5\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\1\5\1\u01e8"+
+    "\3\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\5\1\u01e9\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\2\5\1\u01ea\20\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+    "\1\u0132\4\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\2\5\1\u01eb\11\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\13\5"+
+    "\1\u01ec\1\5\1\u01ed\5\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\2\5\1\u01ee\11\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\u01ef\5\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\4\5\1\u0132\7\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\130"+
+    "\3\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\u01f0\5\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\1\u01f1\22\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\2\5\1\u01f2\20\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\2\5\1\u01f3\3\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\3\5\1\u01f4\2\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u01f5"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+    "\1\u01f6\4\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\2\5\1\u01f7\11\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\u01d2\2\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\7\5\1\u01f8\4\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\321\5\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u01f9\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\7\5\1\u01fa\4\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\u01fb\5\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\4\5\1\201\1\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\1\5\1\377"+
+    "\12\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u01fc\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\1\u0132\13\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\1\u01fd\13\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\2\5\1\u01fe\11\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\10\5"+
+    "\1\u01b0\12\5\1\4\6\5\2\0\1\103\2\5\1\u01ff"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\1\u0200\2\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\350\5\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\u0201\5\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\u0202"+
+    "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\1\5\1\130\1\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\1\5\1\u0132\1\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\7\5\1\u0203\4\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\5\1\u0204\4\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\22\5\1\u0205\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\2\5\1\u0206\3\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\4\5\1\u0207\1\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\5\1\u0208\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\11\5\1\u0209"+
+    "\2\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\4\5\1\u01bf\7\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\1\5\1\u0132\12\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\4\5"+
+    "\1\u020a\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\u020b\2\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\3\5"+
+    "\1\u020c\17\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\u020d"+
+    "\3\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\4\5"+
+    "\1\u020e\7\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\3\5\1\u020f\2\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\2\5\1\u0210\20\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\3\5\1\u0211\2\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\4\5"+
+    "\1\u0212\1\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\5\5\1\u01f3\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\5\5\1\u0132\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\1\5\1\u01f3\12\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\2\5\1\u01b3\3\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\u0213"+
+    "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\2\5"+
+    "\1\u0203\11\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\2\5\1\u01f6\11\5\1\0"+
+    "\23\5";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[39390];
+    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 =
+    "\3\0\6\1\1\11\4\1\1\11\17\1\2\11\3\1"+
+    "\1\11\24\1\1\11\5\1\1\11\16\1\1\11\1\0"+
+    "\14\1\1\11\1\1\1\11\35\1\1\0\43\1\1\11"+
+    "\10\0\2\1\1\0\4\1\1\11\20\1\1\11\2\1"+
+    "\1\0\105\1\10\0\15\1\1\11\5\1\1\0\61\1"+
+    "\2\0\1\1\2\0\22\1\1\0\43\1\4\0\17\1"+
+    "\1\0\40\1\1\0\26\1\1\11\66\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[531];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public ActionScriptTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 ActionScriptTokenMaker(java.io.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 ActionScriptTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 190) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 30: break;
+        case 22: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 31: break;
+        case 21: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 32: break;
+        case 25: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 33: break;
+        case 20: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 34: break;
+        case 7: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 35: break;
+        case 15: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 36: break;
+        case 23: 
+          { addToken(Token.ERROR_STRING_DOUBLE);
+          }
+        case 37: break;
+        case 14: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 38: break;
+        case 17: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 39: break;
+        case 9: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 40: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 41: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 42: break;
+        case 19: 
+          { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+          }
+        case 43: break;
+        case 27: 
+          { addToken(Token.FUNCTION);
+          }
+        case 44: break;
+        case 4: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 45: break;
+        case 6: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 46: break;
+        case 24: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 47: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 48: break;
+        case 16: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 49: break;
+        case 26: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 50: break;
+        case 18: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 51: break;
+        case 29: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 52: break;
+        case 28: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 53: break;
+        case 13: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 54: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 55: break;
+        case 8: 
+          { addToken(Token.OPERATOR);
+          }
+        case 56: break;
+        case 10: 
+          { 
+          }
+        case 57: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 58: 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 532: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 533: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 534: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.flex
new file mode 100644
index 0000000..d1efafe
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.flex
@@ -0,0 +1,1035 @@
+/*
+ * 12/06/2004
+ *
+ * AssemblerX86TokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing X86 assembler.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class takes plain text and returns tokens representing x86
+ * assembler.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated AssemblerX86TokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ *
+ */
+%%
+
+%public
+%class AssemblerX86TokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  We must have this here as JFLex does not generate a
+	 * no parameter constructor.
+	 */
+	public AssemblerX86TokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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_])
+Digit				= ([0-9])
+Number				= ({Digit}+)
+
+Identifier			= (({Letter}|{Digit})[^ \t\f\n\,\.\+\-\*\/\%\[\]]+)
+
+UnclosedStringLiteral	= ([\"][^\"]*)
+StringLiteral			= ({UnclosedStringLiteral}[\"])
+UnclosedCharLiteral		= ([\'][^\']*)
+CharLiteral			= ({UnclosedCharLiteral}[\'])
+
+CommentBegin			= ([;])
+
+LineTerminator			= (\n)
+WhiteSpace			= ([ \t\f])
+
+Label				= (({Letter}|{Digit})+[\:])
+
+Operator				= ("+"|"-"|"*"|"/"|"%"|"^"|"|"|"&"|"~"|"!"|"="|"<"|">")
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	".186" |
+	".286" |
+	".286P" |
+	".287" |
+	".386" |
+	".386P" |
+	".387" |
+	".486" |
+	".486P" |
+	".586" |
+	".586P" |
+	".686" |
+	".686P" |
+	".8086" |
+	".8087" |
+	".ALPHA" |
+	".BREAK" |
+	".BSS" |
+	".CODE" |
+	".CONST" |
+	".CONTINUE" |
+	".CREF" |
+	".DATA" |
+	".DATA?" |
+	".DOSSEG" |
+	".ELSE" |
+	".ELSEIF" |
+	".ENDIF" |
+	".ENDW" |
+	".ERR" |
+	".ERR1" |
+	".ERR2" |
+	".ERRB" |
+	".ERRDEF" |
+	".ERRDIF" |
+	".ERRDIFI" |
+	".ERRE" |
+	".ERRIDN" |
+	".ERRIDNI" |
+	".ERRNB" |
+	".ERRNDEF" |
+	".ERRNZ" |
+	".EXIT" |
+	".FARDATA" |
+	".FARDATA?" |
+	".IF" |
+	".K3D" |
+	".LALL" |
+	".LFCOND" |
+	".LIST" |
+	".LISTALL" |
+	".LISTIF" |
+	".LISTMACRO" |
+	".LISTMACROALL" |
+	".MMX" |
+	".MODEL" |
+	".MSFLOAT" |
+	".NO87" |
+	".NOCREF" |
+	".NOLIST" |
+	".NOLISTIF" |
+	".NOLISTMACRO" |
+	".RADIX" |
+	".REPEAT" |
+	".SALL" |
+	".SEQ" |
+	".SFCOND" |
+	".STACK" |
+	".STARTUP" |
+	".TEXT" |
+	".TFCOND" |
+	".UNTIL" |
+	".UNTILCXZ" |
+	".WHILE" |
+	".XALL" |
+	".XCREF" |
+	".XLIST" |
+	".XMM" |
+	"__FILE__" |
+	"__LINE__" |
+	"A16" |
+	"A32" |
+	"ADDR" |
+	"ALIGN" |
+	"ALIGNB" |
+	"ASSUME" |
+	"BITS" |
+	"CARRY?" |
+	"CATSTR" |
+	"CODESEG" |
+	"COMM" |
+	"COMMENT" |
+	"COMMON" |
+	"DATASEG" |
+	"DOSSEG" |
+	"ECHO" |
+	"ELSE" |
+	"ELSEIF" |
+	"ELSEIF1" |
+	"ELSEIF2" |
+	"ELSEIFB" |
+	"ELSEIFDEF" |
+	"ELSEIFE" |
+	"ELSEIFIDN" |
+	"ELSEIFNB" |
+	"ELSEIFNDEF" |
+	"END" |
+	"ENDIF" |
+	"ENDM" |
+	"ENDP" |
+	"ENDS" |
+	"ENDSTRUC" |
+	"EVEN" |
+	"EXITM" |
+	"EXPORT" |
+	"EXTERN" |
+	"EXTERNDEF" |
+	"EXTRN" |
+	"FAR" |
+	"FOR" |
+	"FORC" |
+	"GLOBAL" |
+	"GOTO" |
+	"GROUP" |
+	"HIGH" |
+	"HIGHWORD" |
+	"IEND" |
+	"IF" |
+	"IF1" |
+	"IF2" |
+	"IFB" |
+	"IFDEF" |
+	"IFDIF" |
+	"IFDIFI" |
+	"IFE" |
+	"IFIDN" |
+	"IFIDNI" |
+	"IFNB" |
+	"IFNDEF" |
+	"IMPORT" |
+	"INCBIN" |
+	"INCLUDE" |
+	"INCLUDELIB" |
+	"INSTR" |
+	"INVOKE" |
+	"IRP" |
+	"IRPC" |
+	"ISTRUC" |
+	"LABEL" |
+	"LENGTH" |
+	"LENGTHOF" |
+	"LOCAL" |
+	"LOW" |
+	"LOWWORD" |
+	"LROFFSET" |
+	"MACRO" |
+	"NAME" |
+	"NEAR" |
+	"NOSPLIT" |
+	"O16" |
+	"O32" |
+	"OFFSET" |
+	"OPATTR" |
+	"OPTION" |
+	"ORG" |
+	"OVERFLOW?" |
+	"PAGE" |
+	"PARITY?" |
+	"POPCONTEXT" |
+	"PRIVATE" |
+	"PROC" |
+	"PROTO" |
+	"PTR" |
+	"PUBLIC" |
+	"PURGE" |
+	"PUSHCONTEXT" |
+	"RECORD" |
+	"REPEAT" |
+	"REPT" |
+	"SECTION" |
+	"SEG" |
+	"SEGMENT" |
+	"SHORT" |
+	"SIGN?" |
+	"SIZE" |
+	"SIZEOF" |
+	"SIZESTR" |
+	"STACK" |
+	"STRUC" |
+	"STRUCT" |
+	"SUBSTR" |
+	"SUBTITLE" |
+	"SUBTTL" |
+	"THIS" |
+	"TITLE" |
+	"TYPE" |
+	"TYPEDEF" |
+	"UNION" |
+	"USE16" |
+	"USE32" |
+	"USES" |
+	"WHILE" |
+	"WRT" |
+	"ZERO?"		{ addToken(Token.PREPROCESSOR); }
+
+	"DB" |
+	"DW" |
+	"DD" |
+	"DF" |
+	"DQ" |
+	"DT" |
+	"RESB" |
+	"RESW" |
+	"RESD" |
+	"RESQ" |
+	"REST" |
+	"EQU" |
+	"TEXTEQU" |
+	"TIMES" |
+	"DUP"		{ addToken(Token.FUNCTION); }
+
+	"BYTE" |
+	"WORD" |
+	"DWORD" |
+	"FWORD" |
+	"QWORD" |
+	"TBYTE" |
+	"SBYTE" |
+	"TWORD" |
+	"SWORD" |
+	"SDWORD" |
+	"REAL4" |
+	"REAL8" |
+	"REAL10"		{ addToken(Token.DATA_TYPE); }
+
+	/* Registers */
+	"AL" |
+	"BL" |
+	"CL" |
+	"DL" |
+	"AH" |
+	"BH" |
+	"CH" |
+	"DH" |
+	"AX" |
+	"BX" |
+	"CX" |
+	"DX" |
+	"SI" |
+	"DI" |
+	"SP" |
+	"BP" |
+	"EAX" |
+	"EBX" |
+	"ECX" |
+	"EDX" |
+	"ESI" |
+	"EDI" |
+	"ESP" |
+	"EBP" |
+	"CS" |
+	"DS" |
+	"SS" |
+	"ES" |
+	"FS" |
+	"GS" |
+	"ST" |
+	"ST0" |
+	"ST1" |
+	"ST2" |
+	"ST3" |
+	"ST4" |
+	"ST5" |
+	"ST6" |
+	"ST7" |
+	"MM0" |
+	"MM1" |
+	"MM2" |
+	"MM3" |
+	"MM4" |
+	"MM5" |
+	"MM6" |
+	"MM7" |
+	"XMM0" |
+	"XMM1" |
+	"XMM2" |
+	"XMM3" |
+	"XMM4" |
+	"XMM5" |
+	"XMM6" |
+	"XMM7" |
+	"CR0" |
+	"CR2" |
+	"CR3" |
+	"CR4" |
+	"DR0" |
+	"DR1" |
+	"DR2" |
+	"DR3" |
+	"DR4" |
+	"DR5" |
+	"DR6" |
+	"DR7" |
+	"TR3" |
+	"TR4" |
+	"TR5" |
+	"TR6" |
+	"TR7"		{ addToken(Token.VARIABLE); }
+
+	/* Pentium III Instructions. */
+	"AAA" |
+	"AAD" |
+	"AAM" |
+	"AAS" |
+	"ADC" |
+	"ADD" |
+	"ADDPS" |
+	"ADDSS" |
+	"AND" |
+	"ANDNPS" |
+	"ANDPS" |
+	"ARPL" |
+	"BOUND" |
+	"BSF" |
+	"BSR" |
+	"BSWAP" |
+	"BT" |
+	"BTC" |
+	"BTR" |
+	"BTS" |
+	"CALL" |
+	"CBW" |
+	"CDQ" |
+	"CLC" |
+	"CLD" |
+	"CLI" |
+	"CLTS" |
+	"CMC" |
+	"CMOVA" |
+	"CMOVAE" |
+	"CMOVB" |
+	"CMOVBE" |
+	"CMOVC" |
+	"CMOVE" |
+	"CMOVG" |
+	"CMOVGE" |
+	"CMOVL" |
+	"CMOVLE" |
+	"CMOVNA" |
+	"CMOVNAE" |
+	"CMOVNB" |
+	"CMOVNBE" |
+	"CMOVNC" |
+	"CMOVNE" |
+	"CMOVNG" |
+	"CMOVNGE" |
+	"CMOVNL" |
+	"CMOVNLE" |
+	"CMOVNO" |
+	"CMOVNP" |
+	"CMOVNS" |
+	"CMOVNZ" |
+	"CMOVO" |
+	"CMOVP" |
+	"CMOVPE" |
+	"CMOVPO" |
+	"CMOVS" |
+	"CMOVZ" |
+	"CMP" |
+	"CMPPS" |
+	"CMPS" |
+	"CMPSB" |
+	"CMPSD" |
+	"CMPSS" |
+	"CMPSW" |
+	"CMPXCHG" |
+	"CMPXCHGB" |
+	"COMISS" |
+	"CPUID" |
+	"CWD" |
+	"CWDE" |
+	"CVTPI2PS" |
+	"CVTPS2PI" |
+	"CVTSI2SS" |
+	"CVTSS2SI" |
+	"CVTTPS2PI" |
+	"CVTTSS2SI" |
+	"DAA" |
+	"DAS" |
+	"DEC" |
+	"DIV" |
+	"DIVPS" |
+	"DIVSS" |
+	"EMMS" |
+	"ENTER" |
+	"F2XM1" |
+	"FABS" |
+	"FADD" |
+	"FADDP" |
+	"FBLD" |
+	"FBSTP" |
+	"FCHS" |
+	"FCLEX" |
+	"FCMOVB" |
+	"FCMOVBE" |
+	"FCMOVE" |
+	"FCMOVNB" |
+	"FCMOVNBE" |
+	"FCMOVNE" |
+	"FCMOVNU" |
+	"FCMOVU" |
+	"FCOM" |
+	"FCOMI" |
+	"FCOMIP" |
+	"FCOMP" |
+	"FCOMPP" |
+	"FCOS" |
+	"FDECSTP" |
+	"FDIV" |
+	"FDIVP" |
+	"FDIVR" |
+	"FDIVRP" |
+	"FFREE" |
+	"FIADD" |
+	"FICOM" |
+	"FICOMP" |
+	"FIDIV" |
+	"FIDIVR" |
+	"FILD" |
+	"FIMUL" |
+	"FINCSTP" |
+	"FINIT" |
+	"FIST" |
+	"FISTP" |
+	"FISUB" |
+	"FISUBR" |
+	"FLD1" |
+	"FLDCW" |
+	"FLDENV" |
+	"FLDL2E" |
+	"FLDL2T" |
+	"FLDLG2" |
+	"FLDLN2" |
+	"FLDPI" |
+	"FLDZ" |
+	"FMUL" |
+	"FMULP" |
+	"FNCLEX" |
+	"FNINIT" |
+	"FNOP" |
+	"FNSAVE" |
+	"FNSTCW" |
+	"FNSTENV" |
+	"FNSTSW" |
+	"FPATAN" |
+	"FPREM" |
+	"FPREMI" |
+	"FPTAN" |
+	"FRNDINT" |
+	"FRSTOR" |
+	"FSAVE" |
+	"FSCALE" |
+	"FSIN" |
+	"FSINCOS" |
+	"FSQRT" |
+	"FST" |
+	"FSTCW" |
+	"FSTENV" |
+	"FSTP" |
+	"FSTSW" |
+	"FSUB" |
+	"FSUBP" |
+	"FSUBR" |
+	"FSUBRP" |
+	"FTST" |
+	"FUCOM" |
+	"FUCOMI" |
+	"FUCOMIP" |
+	"FUCOMP" |
+	"FUCOMPP" |
+	"FWAIT" |
+	"FXAM" |
+	"FXCH" |
+	"FXRSTOR" |
+	"FXSAVE" |
+	"FXTRACT" |
+	"FYL2X" |
+	"FYL2XP1" |
+	"HLT" |
+	"IDIV" |
+	"IMUL" |
+	"IN" |
+	"INC" |
+	"INS" |
+	"INSB" |
+	"INSD" |
+	"INSW" |
+	"INT" |
+	"INTO" |
+	"INVD" |
+	"INVLPG" |
+	"IRET" |
+	"JA" |
+	"JAE" |
+	"JB" |
+	"JBE" |
+	"JC" |
+	"JCXZ" |
+	"JE" |
+	"JECXZ" |
+	"JG" |
+	"JGE" |
+	"JL" |
+	"JLE" |
+	"JMP" |
+	"JNA" |
+	"JNAE" |
+	"JNB" |
+	"JNBE" |
+	"JNC" |
+	"JNE" |
+	"JNG" |
+	"JNGE" |
+	"JNL" |
+	"JNLE" |
+	"JNO" |
+	"JNP" |
+	"JNS" |
+	"JNZ" |
+	"JO" |
+	"JP" |
+	"JPE" |
+	"JPO" |
+	"JS" |
+	"JZ" |
+	"LAHF" |
+	"LAR" |
+	"LDMXCSR" |
+	"LDS" |
+	"LEA" |
+	"LEAVE" |
+	"LES" |
+	"LFS" |
+	"LGDT" |
+	"LGS" |
+	"LIDT" |
+	"LLDT" |
+	"LMSW" |
+	"LOCK" |
+	"LODS" |
+	"LODSB" |
+	"LODSD" |
+	"LODSW" |
+	"LOOP" |
+	"LOOPE" |
+	"LOOPNE" |
+	"LOOPNZ" |
+	"LOOPZ" |
+	"LSL" |
+	"LSS" |
+	"LTR" |
+	"MASKMOVQ" |
+	"MAXPS" |
+	"MAXSS" |
+	"MINPS" |
+	"MINSS" |
+	"MOV" |
+	"MOVAPS" |
+	"MOVD" |
+	"MOVHLPS" |
+	"MOVHPS" |
+	"MOVLHPS" |
+	"MOVLPS" |
+	"MOVMSKPS" |
+	"MOVNTPS" |
+	"MOVNTQ" |
+	"MOVQ" |
+	"MOVS" |
+	"MOVSB" |
+	"MOVSD" |
+	"MOVSS" |
+	"MOVSW" |
+	"MOVSX" |
+	"MOVUPS" |
+	"MOVZX" |
+	"MUL" |
+	"MULPS" |
+	"MULSS" |
+	"NEG" |
+	"NOP" |
+	"NOT" |
+	"OR" |
+	"ORPS" |
+	"OUT" |
+	"OUTS" |
+	"OUTSB" |
+	"OUTSD" |
+	"OUTSW" |
+	"PACKSSDW" |
+	"PACKSSWB" |
+	"PACKUSWB" |
+	"PADDB" |
+	"PADDD" |
+	"PADDSB" |
+	"PADDSW" |
+	"PADDUSB" |
+	"PADDUSW" |
+	"PADDW" |
+	"PAND" |
+	"PANDN" |
+	"PAVGB" |
+	"PAVGW" |
+	"PCMPEQB" |
+	"PCMPEQD" |
+	"PCMPEQW" |
+	"PCMPGTB" |
+	"PCMPGTD" |
+	"PCMPGTW" |
+	"PEXTRW" |
+	"PINSRW" |
+	"PMADDWD" |
+	"PMAXSW" |
+	"PMAXUB" |
+	"PMINSW" |
+	"PMINUB" |
+	"PMOVMSKB" |
+	"PMULHUW" |
+	"PMULHW" |
+	"PMULLW" |
+	"POP" |
+	"POPA" |
+	"POPAD" |
+	"POPAW" |
+	"POPF" |
+	"POPFD" |
+	"POPFW" |
+	"POR" |
+	"PREFETCH" |
+	"PSADBW" |
+	"PSHUFW" |
+	"PSLLD" |
+	"PSLLQ" |
+	"PSLLW" |
+	"PSRAD" |
+	"PSRAW" |
+	"PSRLD" |
+	"PSRLQ" |
+	"PSRLW" |
+	"PSUBB" |
+	"PSUBD" |
+	"PSUBSB" |
+	"PSUBSW" |
+	"PSUBUSB" |
+	"PSUBUSW" |
+	"PSUBW" |
+	"PUNPCKHBW" |
+	"PUNPCKHDQ" |
+	"PUNPCKHWD" |
+	"PUNPCKLBW" |
+	"PUNPCKLDQ" |
+	"PUNPCKLWD" |
+	"PUSH" |
+	"PUSHA" |
+	"PUSHAD" |
+	"PUSHAW" |
+	"PUSHF" |
+	"PUSHFD" |
+	"PUSHFW" |
+	"PXOR" |
+	"RCL" |
+	"RCR" |
+	"RDMSR" |
+	"RDPMC" |
+	"RDTSC" |
+	"REP" |
+	"REPE" |
+	"REPNE" |
+	"REPNZ" |
+	"REPZ" |
+	"RET" |
+	"RETF" |
+	"RETN" |
+	"ROL" |
+	"ROR" |
+	"RSM" |
+	"SAHF" |
+	"SAL" |
+	"SAR" |
+	"SBB" |
+	"SCAS" |
+	"SCASB" |
+	"SCASD" |
+	"SCASW" |
+	"SETA" |
+	"SETAE" |
+	"SETB" |
+	"SETBE" |
+	"SETC" |
+	"SETE" |
+	"SETG" |
+	"SETGE" |
+	"SETL" |
+	"SETLE" |
+	"SETNA" |
+	"SETNAE" |
+	"SETNB" |
+	"SETNBE" |
+	"SETNC" |
+	"SETNE" |
+	"SETNG" |
+	"SETNGE" |
+	"SETNL" |
+	"SETNLE" |
+	"SETNO" |
+	"SETNP" |
+	"SETNS" |
+	"SETNZ" |
+	"SETO" |
+	"SETP" |
+	"SETPE" |
+	"SETPO" |
+	"SETS" |
+	"SETZ" |
+	"SFENCE" |
+	"SGDT" |
+	"SHL" |
+	"SHLD" |
+	"SHR" |
+	"SHRD" |
+	"SHUFPS" |
+	"SIDT" |
+	"SLDT" |
+	"SMSW" |
+	"SQRTPS" |
+	"SQRTSS" |
+	"STC" |
+	"STD" |
+	"STI" |
+	"STMXCSR" |
+	"STOS" |
+	"STOSB" |
+	"STOSD" |
+	"STOSW" |
+	"STR" |
+	"SUB" |
+	"SUBPS" |
+	"SUBSS" |
+	"SYSENTER" |
+	"SYSEXIT" |
+	"TEST" |
+	"UB2" |
+	"UCOMISS" |
+	"UNPCKHPS" |
+	"UNPCKLPS" |
+	"WAIT" |
+	"WBINVD" |
+	"VERR" |
+	"VERW" |
+	"WRMSR" |
+	"XADD" |
+	"XCHG" |
+	"XLAT" |
+	"XLATB" |
+	"XOR" |
+	"XORPS"		{ addToken(Token.RESERVED_WORD); }
+
+}
+
+<YYINITIAL> {
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character Literals. */
+	{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+
+	/* Labels. */
+	{Label}						{ addToken(Token.PREPROCESSOR); }
+
+	^%({Letter}|{Digit})*			{ addToken(Token.FUNCTION); }
+
+	/* Comment Literals. */
+	{CommentBegin}.*				{ addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{Number}						{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters. */
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.java
new file mode 100644
index 0000000..0d8b37d
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.java
@@ -0,0 +1,1867 @@
+/* The following code was generated by JFlex 1.4.1 on 2/1/08 1:33 PM */
+
+/*
+ * 12/06/2004
+ *
+ * AssemblerX86TokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing X86 assembler.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class takes plain text and returns tokens representing x86
+ * assembler.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated AssemblerX86TokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ *
+ */
+
+public class AssemblerX86TokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int YYINITIAL = 0;
+
+  /**
+   * 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, 1
+  };
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\10\1\7\1\0\1\10\23\0\1\10\1\14\1\4\2\0"+
+    "\1\13\1\14\1\5\2\0\1\12\1\12\1\3\1\12\1\15\1\12"+
+    "\1\27\1\16\1\21\1\24\1\25\1\26\1\20\1\23\1\17\1\2"+
+    "\1\11\1\6\1\14\1\14\1\14\1\50\1\0\1\30\1\33\1\40"+
+    "\1\42\1\35\1\47\1\51\1\32\1\45\1\1\1\36\1\31\1\55"+
+    "\1\43\1\41\1\22\1\56\1\34\1\37\1\44\1\46\1\61\1\52"+
+    "\1\54\1\60\1\53\1\3\1\0\1\3\1\14\1\57\1\0\1\30"+
+    "\1\33\1\40\1\42\1\35\1\47\1\51\1\32\1\45\1\1\1\36"+
+    "\1\31\1\55\1\43\1\41\1\22\1\56\1\34\1\37\1\44\1\46"+
+    "\1\61\1\52\1\54\1\60\1\53\1\0\1\14\1\0\1\14\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\1\2\1\3\1\4\1\5\1\6\1\7"+
+    "\1\10\32\1\1\11\1\1\1\12\5\13\2\1\1\14"+
+    "\1\15\25\0\16\1\2\16\23\1\1\13\11\1\1\16"+
+    "\14\1\2\16\7\1\1\16\10\1\1\13\4\1\1\11"+
+    "\3\1\1\16\1\1\1\11\15\1\1\13\1\12\13\1"+
+    "\1\16\42\1\31\0\1\12\11\0\20\1\1\13\1\12"+
+    "\14\1\2\13\3\1\1\13\4\1\1\12\6\1\1\13"+
+    "\3\1\1\13\5\1\1\12\5\1\1\13\4\1\1\12"+
+    "\1\1\1\13\2\1\1\13\10\1\1\13\4\1\1\13"+
+    "\4\1\1\13\5\1\1\12\3\1\3\13\24\1\1\13"+
+    "\37\1\1\13\3\1\1\13\3\1\1\0\1\12\10\0"+
+    "\1\12\17\0\3\1\1\13\11\1\1\13\14\1\2\13"+
+    "\1\1\1\17\1\13\3\1\2\12\10\1\1\12\7\1"+
+    "\1\12\1\13\12\1\1\12\15\1\1\13\5\1\2\13"+
+    "\1\1\1\13\14\1\1\13\3\1\1\13\4\1\1\0"+
+    "\1\12\3\0\1\12\5\0\1\12\5\0\16\1\1\12"+
+    "\5\1\1\12\16\1\1\12\1\1\1\13\4\1\1\13"+
+    "\1\1\1\13\4\1\7\0\1\12\7\1\2\12\10\1"+
+    "\1\0\1\12\2\0\1\12\1\0\4\1\1\12\1\1"+
+    "\3\0\2\1\2\0\1\1\1\12\2\0";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[668];
+    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\62\0\144\0\226\0\310\0\372\0\u012c\0\u015e"+
+    "\0\144\0\u0190\0\144\0\u01c2\0\u01f4\0\u0226\0\u0258\0\u028a"+
+    "\0\u02bc\0\u02ee\0\u0320\0\u0352\0\u0384\0\u03b6\0\u03e8\0\u041a"+
+    "\0\u044c\0\u047e\0\u04b0\0\u04e2\0\u0514\0\u0546\0\u0578\0\u05aa"+
+    "\0\u05dc\0\u060e\0\u0640\0\u0672\0\u06a4\0\u06d6\0\u0708\0\u0708"+
+    "\0\u073a\0\u076c\0\u079e\0\u0352\0\u07d0\0\u0802\0\u0834\0\144"+
+    "\0\144\0\u0866\0\u0898\0\u08ca\0\u08fc\0\u092e\0\u0960\0\u0992"+
+    "\0\u09c4\0\u09f6\0\u0a28\0\u0a5a\0\u0a8c\0\u0abe\0\u0af0\0\u0b22"+
+    "\0\u0b54\0\u0b86\0\u0bb8\0\u0bea\0\u0c1c\0\u0c4e\0\u0c80\0\u0cb2"+
+    "\0\u0ce4\0\u0d16\0\u0d48\0\u0d7a\0\u0dac\0\u0dde\0\u0e10\0\u0e42"+
+    "\0\u0e74\0\u0ea6\0\u0ed8\0\u0f0a\0\u0f3c\0\u0352\0\u0f6e\0\u0fa0"+
+    "\0\u0fd2\0\u1004\0\u1036\0\u1068\0\u109a\0\u10cc\0\u10fe\0\u1130"+
+    "\0\u1162\0\u1194\0\u11c6\0\u11f8\0\u122a\0\u125c\0\u128e\0\u12c0"+
+    "\0\u12f2\0\u1324\0\u1356\0\u1388\0\u13ba\0\u13ec\0\u141e\0\u1450"+
+    "\0\u1482\0\u14b4\0\u14e6\0\u1518\0\u154a\0\u157c\0\u15ae\0\u15e0"+
+    "\0\u1612\0\u1644\0\u1676\0\u16a8\0\u16da\0\u170c\0\u173e\0\u1770"+
+    "\0\u17a2\0\u17d4\0\u1806\0\u1838\0\u186a\0\u189c\0\u18ce\0\u1900"+
+    "\0\u1932\0\u1964\0\u1996\0\u19c8\0\u19fa\0\u1a2c\0\u1a5e\0\u1a90"+
+    "\0\u1ac2\0\u1af4\0\u1b26\0\u1b58\0\u1b8a\0\u1bbc\0\u1bee\0\u0352"+
+    "\0\u1c20\0\u1c52\0\u1c84\0\u1cb6\0\u1ce8\0\u186a\0\u1d1a\0\u1d4c"+
+    "\0\u1d7e\0\u1db0\0\u1de2\0\u1e14\0\u1e46\0\u1e78\0\u1eaa\0\u1edc"+
+    "\0\u1f0e\0\u1f40\0\u1f72\0\u1fa4\0\u1fd6\0\u2008\0\u203a\0\u206c"+
+    "\0\u209e\0\u20d0\0\u2102\0\u2134\0\u2166\0\u2198\0\u21ca\0\u21fc"+
+    "\0\u222e\0\u2260\0\u2292\0\u22c4\0\u22f6\0\u2328\0\u235a\0\u238c"+
+    "\0\u23be\0\u23f0\0\u2422\0\u2454\0\u2486\0\u24b8\0\u24ea\0\u251c"+
+    "\0\u254e\0\u2580\0\u25b2\0\u25e4\0\u2616\0\u2648\0\u267a\0\u26ac"+
+    "\0\u26de\0\u2710\0\u2742\0\u2774\0\u27a6\0\u27d8\0\u280a\0\u283c"+
+    "\0\u286e\0\u07d0\0\u28a0\0\u28d2\0\u2904\0\u2936\0\u2968\0\u299a"+
+    "\0\u29cc\0\u29fe\0\u2a30\0\u2a62\0\u2a94\0\u2ac6\0\u2af8\0\u2b2a"+
+    "\0\u2b5c\0\u2b8e\0\u2bc0\0\u2bf2\0\u2c24\0\u2c56\0\u2c88\0\u2cba"+
+    "\0\u2cec\0\u2d1e\0\u2d50\0\u2d82\0\144\0\u2db4\0\u2de6\0\u2e18"+
+    "\0\u2e4a\0\u2e7c\0\u2eae\0\u2ee0\0\u2f12\0\u2f44\0\u2f76\0\u2fa8"+
+    "\0\u2fda\0\u300c\0\u303e\0\u3070\0\u30a2\0\u30d4\0\u3106\0\u3138"+
+    "\0\u316a\0\u319c\0\u31ce\0\u3200\0\u3232\0\u3264\0\u3296\0\u0352"+
+    "\0\u32c8\0\u32fa\0\u332c\0\u335e\0\u3390\0\u33c2\0\u33f4\0\u3426"+
+    "\0\u3458\0\u348a\0\u34bc\0\u34ee\0\u3520\0\u3552\0\u3584\0\u35b6"+
+    "\0\u35e8\0\u361a\0\u364c\0\u367e\0\u36b0\0\u36e2\0\u3714\0\u3746"+
+    "\0\u3778\0\u37aa\0\u37dc\0\u380e\0\u3840\0\u3872\0\u38a4\0\u38d6"+
+    "\0\u3908\0\u393a\0\u396c\0\u399e\0\u39d0\0\u3a02\0\u3a34\0\u3a66"+
+    "\0\u3a98\0\u3aca\0\u3afc\0\u3b2e\0\u3b60\0\u3b92\0\u3bc4\0\u3bf6"+
+    "\0\u3c28\0\u3c5a\0\u3c8c\0\u3cbe\0\u3cf0\0\u3d22\0\u3d54\0\u3d86"+
+    "\0\u3db8\0\u3dea\0\u3e1c\0\u3e4e\0\u3e80\0\u3eb2\0\u3ee4\0\u3f16"+
+    "\0\u3f48\0\u3f7a\0\u3fac\0\u3fde\0\u4010\0\u36e2\0\u4042\0\u4074"+
+    "\0\u40a6\0\u40d8\0\u410a\0\u413c\0\u416e\0\u41a0\0\u41d2\0\u4204"+
+    "\0\u4236\0\u4268\0\u429a\0\u42cc\0\u42fe\0\u4330\0\u4362\0\u4394"+
+    "\0\u43c6\0\u43f8\0\u442a\0\u445c\0\u448e\0\u44c0\0\u44f2\0\u4524"+
+    "\0\u4556\0\u4588\0\u45ba\0\u45ec\0\u461e\0\u3b92\0\u4650\0\u4682"+
+    "\0\u46b4\0\u361a\0\u46e6\0\u4718\0\u474a\0\u477c\0\u47ae\0\u47e0"+
+    "\0\u4812\0\u4844\0\u4876\0\u48a8\0\u48da\0\u490c\0\u493e\0\u4970"+
+    "\0\u49a2\0\u49d4\0\u4a06\0\u4a38\0\u4a6a\0\u4a9c\0\u4ace\0\u4b00"+
+    "\0\u4b32\0\u4b64\0\u4b96\0\u4bc8\0\u4bfa\0\u4c2c\0\u4c5e\0\u4c90"+
+    "\0\u4cc2\0\u4cf4\0\u4d26\0\u4d58\0\u4d8a\0\u4dbc\0\u410a\0\u4dee"+
+    "\0\u4e20\0\u4e52\0\u4e84\0\u4eb6\0\u4ee8\0\u4f1a\0\u4f4c\0\u4f7e"+
+    "\0\u4fb0\0\u4fe2\0\u5014\0\u5046\0\u5078\0\u50aa\0\u50dc\0\u510e"+
+    "\0\u5140\0\u5172\0\u51a4\0\u51d6\0\u5208\0\u523a\0\u526c\0\u529e"+
+    "\0\u52d0\0\u5302\0\u5334\0\u5366\0\u5398\0\u53ca\0\u53fc\0\u542e"+
+    "\0\u5460\0\u5492\0\u54c4\0\u54f6\0\u5528\0\u555a\0\u558c\0\u55be"+
+    "\0\u55f0\0\u5622\0\u55f0\0\u5654\0\u5686\0\u56b8\0\u56ea\0\u571c"+
+    "\0\u574e\0\u5780\0\u57b2\0\u4d58\0\u57e4\0\u076c\0\u5816\0\u5848"+
+    "\0\u587a\0\u58ac\0\u0352\0\u58de\0\u5910\0\u5942\0\u5974\0\u59a6"+
+    "\0\u1f40\0\u59d8\0\u5a0a\0\u5a3c\0\u5a6e\0\u5aa0\0\u5ad2\0\u5b04"+
+    "\0\u5b36\0\u5b68\0\u5b9a\0\u5bcc\0\u5bfe\0\u5c30\0\u5c62\0\u5c94"+
+    "\0\u5cc6\0\u5cf8\0\u5d2a\0\u5d5c\0\u5d8e\0\u5dc0\0\u5df2\0\u5e24"+
+    "\0\u5e56\0\u5e88\0\u5eba\0\u5eec\0\u5f1e\0\u5f50\0\u5f82\0\u5fb4"+
+    "\0\u5fe6\0\u6018\0\u604a\0\u607c\0\u60ae\0\u60e0\0\u6112\0\u6144"+
+    "\0\u6176\0\u61a8\0\u5460\0\u0834\0\u61da\0\u620c\0\u623e\0\u6270"+
+    "\0\u62a2\0\u62d4\0\u6306\0\u6338\0\u636a\0\u639c\0\u63ce\0\u6400"+
+    "\0\u6432\0\u6464\0\u6496\0\u64c8\0\u64fa\0\u652c\0\u655e\0\u6590"+
+    "\0\u65c2\0\u65f4\0\u6626\0\u6658\0\u668a\0\u66bc\0\u66ee\0\u6720"+
+    "\0\u6752\0\u6784\0\u67b6\0\u67e8\0\u681a\0\u684c\0\u687e\0\u68b0"+
+    "\0\u68e2\0\u6914\0\u6946\0\u6978\0\u69aa\0\u69dc\0\u6a0e\0\u6a40"+
+    "\0\u6a72\0\u6aa4\0\u6ad6\0\u6b08\0\u6b3a\0\u6b6c\0\u6b9e\0\u6bd0"+
+    "\0\u6c02\0\u6c34\0\u6c66\0\u4236\0\u6c98\0\u6cca\0\u65f4\0\u6cfc"+
+    "\0\u6d2e\0\u6d60\0\u6d92\0\u6dc4\0\u6df6\0\u6e28\0\u6e5a\0\u5a6e"+
+    "\0\u6e8c\0\u6ebe\0\u6ef0\0\u6f22\0\u6f54\0\u6f86\0\u6fb8\0\u6fea"+
+    "\0\u701c\0\u704e\0\u7080\0\u70b2\0\u70e4\0\u7116\0\u7148\0\u717a"+
+    "\0\u61da\0\u71ac\0\u71de\0\u7210\0\u7242\0\u1194\0\u7274\0\u72a6"+
+    "\0\u72d8\0\u730a\0\u733c\0\u736e\0\u73a0\0\u73d2\0\u7404\0\u7436"+
+    "\0\u7468\0\u749a\0\u74cc\0\u74fe\0\u7530\0\u7562\0\u7594\0\u587a"+
+    "\0\u75c6\0\u75f8\0\u762a\0\u765c\0\u768e\0\u76c0\0\u76f2\0\u7724"+
+    "\0\u7756\0\u7788\0\u77ba\0\u77ec\0\u781e\0\u7850\0\u7882\0\u4ee8"+
+    "\0\u78b4\0\u78e6\0\u7918\0\u794a\0\u797c\0\u79ae\0\u79e0\0\u7a12"+
+    "\0\u7a44\0\u7a76\0\u7aa8\0\u7ada\0\u7b0c\0\u7b3e\0\u7b70\0\u7ba2"+
+    "\0\u6d60\0\u7bd4\0\u7c06\0\u7c38";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[668];
+    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\1\4\1\5\1\3\1\6\1\7\1\10\1\11"+
+    "\1\12\1\3\3\13\1\14\4\5\1\15\5\5\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\32\1\33\1\34\1\35\1\3"+
+    "\1\36\1\37\1\40\1\41\1\42\1\43\1\44\1\24"+
+    "\1\45\1\3\1\4\1\5\1\3\1\6\1\7\1\10"+
+    "\1\11\1\12\1\3\1\13\1\46\1\13\1\14\4\5"+
+    "\1\15\5\5\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\32\1\33"+
+    "\1\34\1\35\1\3\1\36\1\37\1\40\1\41\1\42"+
+    "\1\43\1\44\1\24\1\45\62\0\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\4\24\1\51"+
+    "\5\24\2\52\1\24\1\52\1\24\1\53\1\24\1\54"+
+    "\1\55\1\54\1\24\1\56\4\24\1\47\1\52\1\24"+
+    "\1\54\1\24\1\57\4\24\1\47\1\24\1\5\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\4\5\1\24"+
+    "\5\5\20\24\1\47\11\24\4\6\1\60\55\6\5\7"+
+    "\1\61\54\7\7\10\1\0\52\10\10\0\1\12\67\0"+
+    "\1\62\1\63\1\64\1\65\2\0\1\65\2\64\1\0"+
+    "\1\66\1\67\1\0\1\70\1\71\1\72\1\73\1\74"+
+    "\1\75\1\0\1\76\1\77\1\100\1\101\1\102\1\103"+
+    "\2\0\1\104\1\0\1\105\1\106\4\0\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+    "\1\107\3\24\1\110\1\111\1\24\1\112\1\113\1\114"+
+    "\2\24\1\115\1\116\1\117\1\24\1\47\3\24\1\120"+
+    "\1\121\4\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\1\122\5\24\1\123\3\24\1\124"+
+    "\1\125\1\126\1\24\1\127\2\24\1\130\2\24\1\131"+
+    "\1\132\4\24\1\47\3\24\1\126\5\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+    "\1\133\1\134\2\24\1\135\1\136\1\24\1\137\1\24"+
+    "\1\140\1\141\1\24\1\142\1\134\1\24\1\143\1\47"+
+    "\1\144\3\24\1\145\4\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\13\24\1\146\13\24"+
+    "\1\147\2\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\4\24\1\126\6\24"+
+    "\2\126\4\24\1\150\1\24\1\151\2\24\1\152\1\153"+
+    "\2\24\1\47\3\24\1\126\3\24\1\154\1\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\155\1\24\1\156\2\157\1\160\5\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\12\24\1\161\1\162\1\24\1\163\3\24"+
+    "\1\164\1\165\1\24\1\166\1\167\4\24\1\47\3\24"+
+    "\1\170\1\171\1\172\2\24\1\173\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\4\24\1\126\5\24\1\174\1\134\1\175"+
+    "\1\176\1\24\1\177\1\24\1\126\1\200\1\24\1\43"+
+    "\1\24\1\201\1\202\1\203\1\204\1\47\1\134\1\205"+
+    "\2\24\1\145\1\206\1\24\1\207\1\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\210\5\24\1\211\1\212\1\126\1\213\1\214\2\24"+
+    "\1\126\1\24\1\215\1\216\5\24\1\47\1\24\1\217"+
+    "\1\24\1\126\1\220\3\24\1\221\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\1\122\3\24"+
+    "\1\222\1\24\1\123\7\24\1\223\11\24\1\224\1\225"+
+    "\1\47\10\24\1\226\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\12\24\1\227\2\126\1\230"+
+    "\1\231\1\232\1\24\1\126\1\24\1\233\1\230\1\24"+
+    "\1\230\1\234\1\235\1\230\1\47\1\24\1\236\1\24"+
+    "\1\126\1\24\1\230\3\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\12\24\1\237\4\24"+
+    "\1\240\3\24\1\241\6\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\14\24"+
+    "\1\242\1\243\1\244\1\245\7\24\1\246\2\24\1\47"+
+    "\1\24\1\205\5\24\1\247\1\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\16\24\1\250"+
+    "\1\251\1\24\1\252\2\24\1\253\1\254\3\24\1\255"+
+    "\1\47\4\24\1\256\4\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\15\24\1\257\3\24"+
+    "\1\260\1\261\2\24\1\262\4\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\3\24\1\263\1\264\5\24\1\265\1\266\1\24\1\267"+
+    "\1\270\2\24\1\271\1\272\1\273\1\274\1\275\1\276"+
+    "\1\277\1\300\1\301\1\47\1\24\1\302\1\24\1\303"+
+    "\1\304\2\24\1\305\1\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\13\24\1\306\2\24"+
+    "\1\307\2\24\1\126\1\24\1\310\6\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\12\24\1\311\1\24\1\312\1\313\1\314\4\24"+
+    "\1\315\6\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\316\12\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\12\24\1\317\1\320\6\24\1\321"+
+    "\1\322\6\24\1\47\4\24\1\323\4\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+    "\1\324\10\24\1\325\3\24\1\326\1\327\1\24\1\47"+
+    "\4\24\1\231\4\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\1\24\1\205"+
+    "\7\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\6\24\1\330\2\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\331\12\24\1\47\11\24\1\0\2\46\13\0"+
+    "\32\46\1\0\11\46\3\47\1\0\3\47\2\0\1\47"+
+    "\2\0\1\47\1\0\45\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\17\24\1\54\3\24\1\54"+
+    "\6\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\17\24\1\54\12\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\22\24\1\332\7\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\3\24\1\333\5\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\4\24\1\54"+
+    "\5\24\2\52\1\24\1\52\1\24\1\54\1\24\3\54"+
+    "\6\24\1\47\1\52\1\24\1\54\6\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\54\25\24\1\47\11\24\17\0\1\334\71\0\1\335"+
+    "\51\0\1\336\61\0\1\337\73\0\1\340\60\0\1\341"+
+    "\14\0\1\342\1\0\1\343\46\0\1\344\2\0\1\345"+
+    "\52\0\1\346\4\0\1\347\55\0\1\350\2\0\1\351"+
+    "\6\0\1\352\10\0\1\353\31\0\1\354\65\0\1\341"+
+    "\4\0\1\355\6\0\1\356\2\0\1\343\46\0\1\357"+
+    "\4\0\1\360\50\0\1\361\10\0\1\362\61\0\1\363"+
+    "\55\0\1\364\11\0\1\343\61\0\1\365\55\0\1\366"+
+    "\46\0\1\367\63\0\1\370\57\0\1\341\1\371\6\0"+
+    "\1\372\14\0\1\373\43\0\1\374\1\0\1\375\13\0"+
+    "\1\376\4\0\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\16\24\1\377\3\24\1\u0100\1\24"+
+    "\1\u0101\1\u0102\4\24\1\47\1\u0103\7\24\1\u0104\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\u0105\3\24\1\u0106\3\24\1\u0107\2\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\3\24\1\u0108\5\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\12\24\1\u0109\1\u010a\1\u010b\1\24\1\u010c\11\24\1\u010d"+
+    "\1\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\4\24\1\u010e"+
+    "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\4\24\1\u010f\11\24\1\54\13\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\16\24\1\u0110\13\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\25\24\1\u0111\4\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\15\24\1\u0112"+
+    "\1\u0113\2\24\1\u0114\3\24\1\u0115\4\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\23\24\1\142\6\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+    "\1\u0116\10\24\1\u0117\3\24\1\u0118\1\u0119\1\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\2\24\1\u0110\27\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\3\24\1\u0110\26\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\12\24\1\54"+
+    "\6\24\1\54\2\24\1\54\5\24\1\47\4\24\1\54"+
+    "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\27\24\1\u011a\2\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\4\24\1\u011b\25\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\u011c"+
+    "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\22\24\1\54\1\24\1\u011d"+
+    "\5\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\24\24\1\u011e\5\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\14\24\1\u011f\1\u0120\1\54\13\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\24\24\1\146\5\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\23\24\1\u0121\6\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\12\24\1\u0122"+
+    "\6\24\1\54\3\24\1\u0123\4\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\13\24\1\54\5\24\1\54\10\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\22\24\1\u0124\1\u0125\1\u0126\5\24\1\47\1\24\1\u0127"+
+    "\7\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\21\24\1\54\10\24\1\47\4\24\1\u0128"+
+    "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\16\24\1\54\13\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\54\10\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\54"+
+    "\2\24\1\146\5\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\213"+
+    "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\26\24\1\54\3\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\1\u0129\10\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\16\24"+
+    "\1\54\12\24\1\54\1\47\1\24\1\u012a\7\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\30\24\1\u012b\1\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\16\24\1\54"+
+    "\2\24\2\54\7\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\26\24\1\u012c"+
+    "\3\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\26\24\1\u012d\3\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\4\24\1\u012e\5\24\1\u012f\6\24\1\u0130"+
+    "\1\u0131\3\24\1\u0132\3\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\32\24"+
+    "\1\47\4\24\1\54\4\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\13\24\1\54\2\24"+
+    "\1\54\13\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\4\24\1\u0133\21\24"+
+    "\1\u0134\3\24\1\47\4\24\1\u0135\4\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\32\24"+
+    "\1\47\3\24\1\126\5\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\21\24\1\u0136\10\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\4\24\1\126\25\24\1\47\3\24"+
+    "\1\126\5\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\4\24\1\126\22\24\1\126\2\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\14\24\1\u0137\15\24\1\47\3\24"+
+    "\1\126\5\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\27\24\1\126\2\24\1\47\3\24"+
+    "\1\126\5\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\24\24\1\u0138\1\24\1\u0139\3\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\4\24\1\u013a\21\24\1\u013b\1\u013c"+
+    "\2\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\4\24\1\143"+
+    "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\30\24\1\230\1\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\u013d\12\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\54"+
+    "\1\u011f\1\24\1\54\13\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\13\24"+
+    "\1\u013e\2\24\1\u013e\4\24\1\u013f\4\24\1\u0140\1\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\15\24\1\54\14\24\1\47\7\24"+
+    "\1\154\1\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\22\24\1\u0141\3\24\1\u0142\3\24"+
+    "\1\47\1\u0143\10\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\12\24\1\u0126\17\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\1\126\1\24\2\126\1\24\5\126\1\u0144"+
+    "\3\24\1\u0145\3\24\1\54\1\u0126\1\54\2\24\1\54"+
+    "\2\24\1\47\4\24\1\u0128\4\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\24\24\1\146"+
+    "\5\24\1\47\1\u0146\1\24\1\u0147\6\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\15\24"+
+    "\1\u0148\14\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\u0149\12\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\23\24\1\315\6\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\16\24\1\u014a\13\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\u014b\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\30\24\1\u014c\1\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\13\24\1\u011b\2\24\1\u014d\7\24"+
+    "\1\u014e\3\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\22\24\1\54\1\24"+
+    "\1\54\1\24\1\143\1\54\2\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\1\24\1\54\7\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\3\24\1\126"+
+    "\2\24\2\126\1\24\1\126\20\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\24\24\1\u014f\5\24\1\47\4\24\1\u0150\4\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\5\24\1\54\3\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\24\24\1\52"+
+    "\5\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\4\24\1\u0151\15\24\1\54"+
+    "\1\u0152\6\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\26\24\1\u0153\3\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\12\24\1\u0154\13\24\1\u0155\3\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\4\24\1\143\25\24\1\47\1\u0110"+
+    "\10\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\u0156\3\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\31\24\1\u0157\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\u0158\12\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\12\24\1\54\6\24\1\54\4\24"+
+    "\1\u0159\3\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\1\126\1\24\2\126"+
+    "\1\24\5\126\20\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\22\24\1\54"+
+    "\7\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\21\24\1\u015a\10\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\10\24\1\u015b\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\230\25\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\4\24"+
+    "\1\u0103\4\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\12\24\1\115\17\24\1\47\1\54"+
+    "\10\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\4\24\1\54\14\24\1\u015c\4\24\1\54"+
+    "\3\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\27\24\1\u012c\2\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\7\24\1\154\1\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\2\24\1\126\2\24\4\126\21\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\146\10\24\1\47\3\24\1\u015d\5\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\26\24\1\u015e\3\24\1\47\4\24\1\u015f\4\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\4\24\1\u0160\25\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\4\24\1\u0161"+
+    "\12\24\1\146\12\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\25\24\1\u0162"+
+    "\4\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\26\24\1\u0163\3\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\27\24\1\u0164\2\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\u0165\1\u0166\3\24\1\u0167\3\24\1\47\10\24"+
+    "\1\u0168\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\1\u0110\2\24\1\u0110\11\24\1\u0110\1\24"+
+    "\1\u0110\4\24\1\u0169\1\u016a\1\24\1\u016b\2\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\4\24\1\u013a\23\24\1\u011b\1\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\3\24\1\54\26\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\u016c\12\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\23\24\1\u016d"+
+    "\6\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\4\24\1\u016e\22\24\1\u016f"+
+    "\2\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\3\24\1\u0170"+
+    "\5\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\12\24\1\u0171\3\24\1\u0172\7\24\1\u0173"+
+    "\3\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\15\24\1\143\1\u0110\5\24"+
+    "\1\u0174\5\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\24\24\1\u0175\5\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\13\24\1\u0176\5\24\1\u0177\10\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\21\24\1\u0178\3\24\1\u0179\4\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\12\24\1\u017a\7\24\1\u017b\3\24"+
+    "\1\u017c\1\u017d\1\u017e\1\24\1\47\5\24\1\u017f\3\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\13\24\1\u0180\1\143\6\24\1\u0181\6\24\1\47"+
+    "\4\24\1\u0182\4\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\16\24\1\u0161\13\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\17\24\1\u0183\7\24\1\u0184\2\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\21\24\1\u0185\1\u0186\1\57\3\24\1\u0187"+
+    "\2\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\21\24\1\146\10\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\12\24\1\317\1\u0176\5\24\1\u0188\1\u0189"+
+    "\1\24\1\u018a\1\u018b\4\24\1\47\4\24\1\u018c\4\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\22\24\1\u018d\7\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\16\24"+
+    "\1\u018e\13\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\12\24\1\311\10\24"+
+    "\1\315\6\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\12\24\1\156\3\24"+
+    "\1\u018f\2\24\1\u0190\1\u0191\3\24\1\u0192\3\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\30\24\1\u0193\1\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\13\24\1\u0194\16\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\23\24\1\u0195"+
+    "\6\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\23\24\1\u0196\6\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\u0137\3\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\27\24\1\146\2\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\27\24\1\u015e"+
+    "\2\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\27\24\1\u0197\2\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\u0110\3\24\1\47\4\24\1\u0135"+
+    "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\16\24\1\u0198\13\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\16\24\1\u0199\13\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\24\24\1\u0176"+
+    "\5\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\12\24\1\u019a\17\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\14\24\1\u019b\15\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\16\24\1\u019c\13\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\4\24\1\231\4\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\21\24\1\u019d\1\u019e\7\24"+
+    "\1\47\3\24\1\u019f\5\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\10\24"+
+    "\1\u01a0\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\25\24\1\u019f\4\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\13\24\1\u015b\16\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\u01a1"+
+    "\15\24\1\u01a2\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\16\24\1\u01a3\13\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\47\2\24\1\54\6\24"+
+    "\20\0\1\365\60\0\1\u01a4\62\0\1\u01a5\61\0\1\u01a5"+
+    "\2\0\1\365\60\0\1\u01a6\70\0\1\u01a7\67\0\1\u01a8"+
+    "\62\0\1\u01a9\56\0\1\u01aa\63\0\1\365\64\0\1\u01ab"+
+    "\41\0\1\u01ac\76\0\1\u01ad\56\0\1\u01ae\67\0\1\u01af"+
+    "\64\0\1\u01b0\56\0\1\365\75\0\1\365\33\0\1\u01b1"+
+    "\66\0\1\101\66\0\1\u01b2\1\u01b3\62\0\1\u01b4\54\0"+
+    "\1\u01b5\41\0\1\u01b6\11\0\1\u01b7\6\0\1\372\75\0"+
+    "\1\u01b0\51\0\1\u01b8\51\0\1\u01b9\72\0\1\u01ba\61\0"+
+    "\1\u01bb\50\0\1\357\102\0\1\365\53\0\1\u01bc\54\0"+
+    "\1\u01bd\73\0\1\365\5\0\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\27\24\1\u01be\2\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\20\24\1\u01bf\11\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\24\24\1\u01c0\5\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\24\24"+
+    "\1\u01c1\5\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\u0110\12\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\47\1\u01c2\10\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\31\24\1\u01c3\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\22\24\1\u0110\3\24"+
+    "\1\u0137\3\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\10\24"+
+    "\1\u01c4\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\u01c5\3\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\24\24\1\u01c6\5\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\u01c7"+
+    "\16\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\30\24\1\u01c8\1\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\12\24\1\u01c9\1\u01c7\16\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\15\24\1\u01c0\14\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\u01ca\25\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\12\24\1\u01cb\7\24"+
+    "\1\u01cc\6\24\1\u01cb\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\u01c5"+
+    "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\13\24\1\u01cd\16\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\1\u0103\10\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\14\24"+
+    "\1\u010f\15\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\4\24\1\u01ce\25\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\24\24\1\u01cf\5\24\1\47\3\24"+
+    "\1\u01d0\5\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\47\10\24\1\u01d1\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\25\24\1\u01d0\4\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\u01d2"+
+    "\16\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\1\u01d3\10\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\13\24\1\54\16\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\30\24"+
+    "\1\237\1\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\4\24\1\143\11\24"+
+    "\1\u0110\2\24\1\143\10\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\143\20\24\1\u01d4\4\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\31\24"+
+    "\1\54\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\17\24\1\u01d5\12\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\31\24\1\225\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\32\24"+
+    "\1\47\10\24\1\u01d6\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\1\u01d7\10\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\12\24\1\u01d5\5\24\1\54\11\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\4\24\1\u01d8\25\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\u01d9\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\1\24"+
+    "\1\u0131\7\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\47\3\24\1\u01da\5\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\14\24\1\u0127\15\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+    "\1\57\17\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\25\24\1\u0176\4\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\21\24\1\u0110\10\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\17\24\1\u01db\12\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\17\24"+
+    "\1\u01dc\5\24\1\u01dd\1\u0110\3\24\1\47\2\24\1\54"+
+    "\6\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\13\24\1\u01de\16\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\15\24\1\230\6\24\1\230\1\24\1\230\3\24\1\47"+
+    "\1\24\1\230\3\24\1\230\3\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\23\24\1\u01df"+
+    "\6\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\25\24\1\54\3\24\1\54"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\47\4\24\1\232\4\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\21\24\1\232\10\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\142\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\u01e0\12\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\23\24\1\u0110\6\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\4\24\1\u0110\14\24\1\u01e1\5\24\1\u01e2\2\24"+
+    "\1\47\4\24\1\u0110\4\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\142\12\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\23\24\1\u013f\6\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\16\24\1\u013d\1\u01e3\12\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\26\24\1\u01e4\3\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\25\24\1\u0110"+
+    "\4\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\24\24\1\54\5\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\16\24\1\u01e5\13\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\31\24\1\u01d4\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\26\24\1\u0155\3\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\4\24\1\51\5\24\2\52\1\24"+
+    "\1\52\1\24\1\54\1\24\3\54\1\24\1\56\4\24"+
+    "\1\47\1\52\1\24\1\54\6\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\4\24\1\u01e6\4\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\22\24\1\u01e7\7\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\30\24\1\u01e8\1\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\25\24\1\u01e9\4\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\u01ea"+
+    "\12\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\4\24\1\143\14\24\1\u01eb"+
+    "\4\24\1\u01ec\3\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\25\24\1\u01ed"+
+    "\4\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\26\24\1\u019f\3\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\17\24\1\u01ee\12\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\27\24\1\u0176\2\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\16\24\1\u01ef"+
+    "\13\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\21\24\1\u01f0\10\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\17\24\1\u015a\12\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\27\24\1\u01f1\2\24\1\47\4\24\1\u01f2\4\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\4\24\1\143\14\24\1\u01f3\10\24\1\47\3\24\1\u01f4"+
+    "\5\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\10\24\1\u0142\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\u01f5\14\24\1\u01f6\4\24\1\u01f7\3\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\26\24\1\u01f0\3\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\27\24"+
+    "\1\u016f\2\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\21\24\1\u01f8\10\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\16\24\1\u01f9\13\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\12\24\1\u015a\17\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\u01fa\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\4\24\1\143\14\24"+
+    "\1\143\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\4\24\1\u01fb\25\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\26\24\1\u01fc\3\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\13\24\1\u0103\16\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\17\24"+
+    "\1\u01fd\12\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\u01fe\12\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\22\24\1\u0110\7\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\24\24\1\u0110\5\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\16\24"+
+    "\1\u01ff\13\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\10\24"+
+    "\1\54\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\15\24\1\54\6\24\1\54\1\24\1\115"+
+    "\3\24\1\47\1\24\1\54\7\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\u0200"+
+    "\1\24\1\u0201\14\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\23\24\1\54"+
+    "\6\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\13\24\1\u0202\7\24\1\u0203"+
+    "\1\54\5\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\u01e2\7\24"+
+    "\1\u0204\2\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\15\24\1\u0110\6\24"+
+    "\1\u0205\5\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\24\24\1\u0206\5\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\1\122\5\24\1\123\12\24\1\u0110"+
+    "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\4\24\1\u0207"+
+    "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\22\24\1\u0208\7\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\23\24\1\u013d\6\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\4\24\1\u0209\4\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\26\24\1\u0173\3\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\17\24\1\u020a\12\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\12\24\1\u020b\17\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\24\24\1\u020c"+
+    "\5\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\1\54\3\24\1\u020d\6\24"+
+    "\1\u020e\3\24\1\u020f\2\24\1\213\7\24\1\47\2\24"+
+    "\1\54\6\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\26\24\1\57\3\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\26\24\1\120\3\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\24\24"+
+    "\1\u0210\5\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\12\24\1\u0211\17\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\4\24\1\54\12\24\1\u020f\1\24"+
+    "\2\213\7\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\25\24\1\u0212\4\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\15\24\1\u0213\14\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\16\24\1\146\13\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\17\24"+
+    "\1\u0214\12\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\21\24\1\54\10\24"+
+    "\1\47\4\24\1\u0215\4\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\23\24\1\u0216\6\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\22\24\1\u0217\7\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\32\24\1\47\10\24\1\u0213\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\12\24\1\u017a"+
+    "\13\24\1\u0218\3\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\u0180"+
+    "\16\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\25\24\1\311\4\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\u020c\1\24\1\u0219\1\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\23\24\1\u021a\6\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\27\24\1\u021b\2\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\22\24\1\u0217"+
+    "\4\24\1\146\2\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\30\24\1\u011b"+
+    "\1\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\23\24\1\u021c\6\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\17\24\1\u01d6\12\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\u0178\10\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\12\24\1\u017a"+
+    "\17\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\14\24\1\54\15\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\16\24\1\u021d\13\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\13\24\1\u020c\16\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\3\24\1\u021e"+
+    "\26\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\15\24\1\u021f\14\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\30\24\1\u0220\1\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\25\24\1\u0221\4\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\24\24\1\u01db"+
+    "\5\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\23\24\1\u01e9\6\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\u0222\3\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\1\54\10\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\4\24\1\143\25\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\20\24\1\u0223\11\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\16\24\1\u0137\13\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+    "\1\u01d4\1\u0224\1\u0225\4\24\1\u0226\2\24\1\54\1\u0227"+
+    "\2\24\1\u01d4\1\24\1\47\2\24\1\u0214\1\24\1\u0228"+
+    "\1\54\3\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\27\24\1\u0229\2\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\27\24\1\u022a\2\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\16\24"+
+    "\1\54\13\24\1\47\1\24\1\54\7\24\20\0\1\365"+
+    "\2\0\1\365\60\0\1\365\71\0\1\u022b\60\0\1\365"+
+    "\74\0\1\u022c\56\0\1\u022d\50\0\1\u022e\76\0\1\376"+
+    "\51\0\1\u022f\61\0\1\u0230\42\0\1\365\2\0\1\365"+
+    "\11\0\1\365\1\0\1\365\4\0\1\u0231\1\u0232\1\0"+
+    "\1\u0233\61\0\1\101\4\0\1\365\53\0\1\365\51\0"+
+    "\1\u0234\3\0\1\u022e\56\0\1\365\63\0\1\u01b0\4\0"+
+    "\1\u0235\45\0\1\u0236\70\0\1\u0237\45\0\1\365\103\0"+
+    "\1\u0238\61\0\1\u0239\56\0\1\u023a\50\0\1\u01b2\67\0"+
+    "\1\u01b0\53\0\1\u023b\65\0\1\u01a7\24\0\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\26\24"+
+    "\1\u01ef\3\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\21\24\1\u023c\6\24"+
+    "\1\u023d\1\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\15\24\1\54\3\24"+
+    "\1\u01c2\2\24\1\54\3\24\1\u023e\1\24\1\47\1\24"+
+    "\1\54\7\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\25\24\1\54\4\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\15\24\1\54\14\24\1\47\1\24\1\54\7\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\17\24\1\u023f\12\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+    "\1\u0240\17\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\16\24\1\213\13\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\15\24\1\213\14\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\24\24\1\54\5\24\1\47\1\24\1\54\3\24"+
+    "\1\54\3\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\31\24\1\213\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\24\24\1\54\5\24\1\47\1\24\1\54\7\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\u0241\12\24\1\47\1\u0242\10\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\23\24"+
+    "\1\u0243\6\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\27\24\1\u0244\2\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\22\24\1\u0245\7\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\24\24\1\u0246\5\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\213\6\24\1\u0247\1\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\32\24"+
+    "\1\47\4\24\1\u0248\4\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\13\24\1\213\1\u0249"+
+    "\15\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\25\24\1\u024a\4\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\13\24\1\u0110\16\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\26\24\1\u024b\3\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\54"+
+    "\5\24\1\u01dd\4\24\1\47\2\24\1\54\6\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\15\24\1\54\6\24\1\54\5\24\1\47\1\24\1\54"+
+    "\7\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\22\24\1\u0135\7\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\12\24\1\u01e5\17\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\54"+
+    "\12\24\1\47\2\24\1\54\6\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\1\u024c\1\u01db"+
+    "\5\24\1\u01db\22\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\16\24\1\u0162"+
+    "\13\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\27\24\1\u024d\2\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\31\24\1\u0110\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\16\24"+
+    "\1\u024e\13\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\4\24"+
+    "\1\u0110\4\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\26\24\1\u0110\3\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\17\24\1\u024f\12\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\20\24"+
+    "\1\u0110\11\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\22\24\1\u0250\7\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\50\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\u01f0\1\24\1\u01e2\6\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\54\4\24\1\115\3\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\26\24"+
+    "\1\u01d5\1\u0251\2\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\22\24\1\u01d6"+
+    "\7\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\25\24\1\u0252\4\24\1\47"+
+    "\3\24\1\311\5\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\7\24\1\u01e9"+
+    "\1\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\115\3\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\143\10\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\u024f"+
+    "\3\24\1\u013d\6\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\15\24\1\54"+
+    "\3\24\1\54\2\24\1\54\5\24\1\47\1\24\1\54"+
+    "\7\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\22\24\1\u0253\7\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\u0254\5\24\1\u0255\2\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\u0256\5\24\1\u0257\2\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\4\24\1\u0258\14\24\1\u0259\10\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\u01e5\12\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\31\24\1\u025a"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\17\24\1\u025b\12\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\13\24\1\u025c\16\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\17\24"+
+    "\1\u025d\12\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\21\24\1\230\10\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\24\24\1\u0205\5\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\30\24\1\u0244\1\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\30\24"+
+    "\1\u025e\1\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\27\24\1\u013d\2\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\4\24\1\u019b\25\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\20\24\1\u0103\11\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\31\24"+
+    "\1\u025f\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\17\24\1\u01e2\12\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\25\24\1\u025f\4\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\27\24\1\u01f1\2\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\20\24\1\u0260"+
+    "\11\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\1\54\31\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\32\24\1\47\4\24\1\u0261\4\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\27\24"+
+    "\1\54\2\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\3\24\1\u0262\21\24"+
+    "\1\257\4\24\1\47\1\257\10\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\25\24\1\u0164"+
+    "\4\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\27\24\1\u0263\2\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\13\24\1\u01d6\16\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\22\24\1\u0264\7\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\4\24\1\54"+
+    "\11\24\1\u020c\13\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\3\24\1\54\5\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\4\24\1\u020c\22\24\1\u020c"+
+    "\2\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\10\24\1\u0265"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\21\24\1\u0177\10\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\17\24"+
+    "\1\u020f\1\24\2\213\7\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\15\24"+
+    "\1\u0266\14\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\4\24"+
+    "\1\u020c\4\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\47\10\24\1\u0266\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\4\24\1\u0215\4\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\12\24\1\u0267"+
+    "\17\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\3\24\1\u0268"+
+    "\5\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\12\24\1\u01d5\17\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\4\24\1\u0110\25\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\10\24\1\u0176\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\15\24\1\54\14\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\32\24\1\47\4\24\1\u0269\4\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\143\7\24\1\u01d4\15\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\143\6\24\1\u01d4\16\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\15\24"+
+    "\1\54\3\24\1\54\2\24\1\54\5\24\1\47\1\24"+
+    "\1\54\1\24\1\54\5\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\26\24\1\u026a\3\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\21\24\1\u026b\10\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\25\24\1\u026c\4\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\13\24"+
+    "\1\u026c\16\24\1\47\11\24\30\0\1\365\61\0\1\341"+
+    "\14\0\1\101\7\0\1\u026d\47\0\1\354\54\0\1\365"+
+    "\53\0\1\u01b0\76\0\1\101\51\0\1\101\7\0\1\u026e"+
+    "\47\0\1\365\6\0\1\357\10\0\1\365\50\0\1\u026f"+
+    "\63\0\1\u0270\62\0\1\u0271\64\0\1\365\46\0\1\u0272"+
+    "\63\0\1\u0273\53\0\1\u0274\60\0\1\361\72\0\1\u022f"+
+    "\20\0\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\21\24\1\u0275\10\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\u0276\10\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\u01c2"+
+    "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\26\24\1\u0277\3\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\u0103\3\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\5\24\1\u0278\3\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\26\24\1\u0278"+
+    "\3\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\25\24\1\u0279\4\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\20\24\1\u027a\11\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\1\24\1\u0176\7\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\u027b"+
+    "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\30\24\1\213\1\24\1\47"+
+    "\1\24\1\54\7\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\15\24\1\u0110\14\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\14\24\1\u027c\15\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\11\24\1\u01db\20\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\31\24\1\u027d"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\25\24\1\u01fe\4\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\25\24\1\u01e5\4\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\26\24"+
+    "\1\u015e\3\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\26\24\1\u0139\3\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\14\24\1\u027e\15\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\3\24\1\u027f\26\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\3\24"+
+    "\1\u01d4\26\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\3\24\1\u0280\26\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\3\24\1\u01f1\26\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\21\24\1\u0254\10\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\u0256\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\13\24\1\u0281\16\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\47\1\u0110\10\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\27\24\1\u01e5\2\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\5\24\1\172\3\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\24\24\1\u0282\5\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\27\24\1\u0110\2\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\13\24\2\u01d4\15\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\54"+
+    "\6\24\1\54\3\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\25\24\1\146"+
+    "\4\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\23\24\1\143\6\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\15\24\1\52\1\24\1\54\5\24\1\u0283"+
+    "\2\24\1\54\1\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\22\24\1\146"+
+    "\7\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\4\24\1\u0209\25\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\23\24\1\u0284\6\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\4\24\1\143\25\24\1\47\5\24\1\54\3\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\20\24\1\u01d4\11\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\u0285"+
+    "\12\24\1\47\11\24\30\0\1\u0286\100\0\1\u0287\55\0"+
+    "\1\u0287\64\0\1\u0288\56\0\1\u0289\67\0\1\365\54\0"+
+    "\1\u028a\55\0\1\u028b\21\0\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\24\24\1\213\5\24"+
+    "\1\47\1\24\1\u0247\7\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\1\24"+
+    "\1\u0247\7\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\22\24\1\u0191\7\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\26\24\1\u028c\3\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\13\24"+
+    "\2\u028d\15\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\20\24\1\u0247\11\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\23\24\1\u01e2\6\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\1\u0110\2\24\1\u0110\11\24\1\u0110\1\24\1\u0110"+
+    "\4\24\1\u0205\1\u016a\1\24\1\u028e\2\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\32\24\1\47\1\u0222\10\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\4\24\1\u020d"+
+    "\25\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\21\24\1\u020d\10\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\23\24\1\u028f\6\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\u0290\12\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\15\24\1\52"+
+    "\1\24\1\54\10\24\1\54\1\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\10\24\1\216\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\6\24"+
+    "\1\u0291\2\24\40\0\1\u0292\66\0\1\365\62\0\1\u01b2"+
+    "\60\0\1\101\7\0\1\u0293\60\0\1\u0294\5\0\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\u0295\12\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\15\24\1\213"+
+    "\6\24\1\216\5\24\1\47\1\24\1\u0176\7\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\24\24\1\u013d\5\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\1\24\1\u01e9\7\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\13\24\1\u0296\16\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\6\24\1\u0110\2\24\34\0"+
+    "\1\u0297\55\0\1\u0298\104\0\1\365\6\0\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\32\24"+
+    "\1\47\3\24\1\u01e5\5\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\27\24\1\u0299\2\24"+
+    "\1\47\11\24\41\0\1\u029a\60\0\1\u029b\51\0\1\341"+
+    "\65\0\1\u029c\66\0\1\365\20\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[31850];
+    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\5\1\1\11\1\1\1\11\44\1\2\11"+
+    "\25\0\225\1\31\0\1\11\11\0\245\1\1\0\1\1"+
+    "\10\0\1\1\17\0\155\1\1\0\1\1\3\0\1\1"+
+    "\5\0\1\1\5\0\61\1\7\0\22\1\1\0\1\1"+
+    "\2\0\1\1\1\0\6\1\3\0\2\1\2\0\2\1"+
+    "\2\0";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[668];
+    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;
+
+  /** 
+   * 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.  We must have this here as JFLex does not generate a
+	 * no parameter constructor.
+	 */
+	public AssemblerX86TokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public AssemblerX86TokenMaker(java.io.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 AssemblerX86TokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 200) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      if (zzMarkedPosL > zzStartRead) {
+        switch (zzBufferL[zzMarkedPosL-1]) {
+        case '\n':
+        case '\u000B':
+        case '\u000C':
+        case '\u0085':
+        case '\u2028':
+        case '\u2029':
+          zzAtBOL = true;
+          break;
+        case '\r': 
+          if (zzMarkedPosL < zzEndReadL)
+            zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
+          else if (zzAtEOF)
+            zzAtBOL = false;
+          else {
+            boolean eof = zzRefill();
+            zzMarkedPosL = zzMarkedPos;
+            zzEndReadL = zzEndRead;
+            zzBufferL = zzBuffer;
+            if (eof) 
+              zzAtBOL = false;
+            else 
+              zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
+          }
+          break;
+        default:
+          zzAtBOL = false;
+        }
+      }
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      if (zzAtBOL)
+        zzState = ZZ_LEXSTATE[zzLexicalState+1];
+      else
+        zzState = ZZ_LEXSTATE[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 11: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 16: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 17: break;
+        case 12: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 18: break;
+        case 9: 
+          { addToken(Token.FUNCTION);
+          }
+        case 19: break;
+        case 5: 
+          { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 20: break;
+        case 14: 
+          { addToken(Token.VARIABLE);
+          }
+        case 21: break;
+        case 7: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 22: break;
+        case 10: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 23: break;
+        case 15: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 24: break;
+        case 4: 
+          { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/
+          }
+        case 25: break;
+        case 8: 
+          { addToken(Token.OPERATOR);
+          }
+        case 26: break;
+        case 2: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 27: break;
+        case 13: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 28: break;
+        case 3: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 29: break;
+        case 6: 
+          { addNullToken(); return firstToken;
+          }
+        case 30: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 669: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.flex
new file mode 100644
index 0000000..f23bdd1
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.flex
@@ -0,0 +1,270 @@
+/*
+ * 11/18/2009
+ *
+ * BBCodeTokenMaker.java - Generates tokens for BBCode syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for BBCode.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated BBCodeTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.7
+ *
+ */
+%%
+
+%public
+%class BBCodeTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Token type specific to BBCodeTokenMaker; this signals that the user has
+	 * ended a line with an unclosed tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -1;
+
+	/**
+	 * Whether closing markup tags are automatically completed for BBCode.
+	 */
+	private static boolean completeCloseTags = true;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public BBCodeTokenMaker() {
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  The default value
+	 * for BBCode is <code>true</code>.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Returns <code>null</code> since BBCode has no comments.
+	 *
+	 * @return <code>null</code> always.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return 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) {
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * 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(java.io.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;
+	}
+
+
+%}
+
+Whitespace			= ([ \t\f]+)
+LineTerminator		= ([\n])
+Identifier			= ([^ \t\f\n\[]+)
+InTagIdentifier		= ([^ \t\f\n\[\]\/\=]+)
+Tag					= ("b"|"i"|"u"|"s"|"size"|"color"|"center"|"quote"|"url"|"img"|"ul"|"li"|"ol"|"youtube"|"gvideo")
+
+%state INTAG
+
+%%
+
+<YYINITIAL> {
+	{Identifier}			{ addToken(Token.IDENTIFIER); }
+	{Whitespace}			{ addToken(Token.WHITESPACE); }
+	"["						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	"[/"					{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	{LineTerminator}		{ addNullToken(); return firstToken; }
+	<<EOF>>					{ addNullToken(); return firstToken; }
+}
+
+<INTAG> {
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); }
+	{Tag}					{ addToken(Token.MARKUP_TAG_NAME); }
+	{InTagIdentifier}		{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}			{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	"/]"					{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	"]"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	.						{ addToken(Token.IDENTIFIER); /* Unhandled chars, not likely */ }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.java
new file mode 100644
index 0000000..e53f0b9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.java
@@ -0,0 +1,725 @@
+/* The following code was generated by JFlex 1.4.1 on 11/18/09 4:41 PM */
+
+/*
+ * 11/18/2009
+ *
+ * BBCodeTokenMaker.java - Generates tokens for BBCode syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for BBCode.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated BBCodeTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.7
+ *
+ */
+
+public class BBCodeTokenMaker extends AbstractMarkupTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int INTAG = 1;
+  public static final int YYINITIAL = 0;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\1\1\2\1\0\1\1\23\0\1\1\16\0\1\27\15\0"+
+    "\1\30\35\0\1\3\1\0\1\4\4\0\1\5\1\13\1\26\1\12"+
+    "\1\0\1\23\1\0\1\6\2\0\1\15\1\22\1\17\1\14\1\0"+
+    "\1\21\1\16\1\10\1\20\1\7\1\25\2\0\1\24\1\11\uff85\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\1\1\1\2\1\3\1\4\1\5\1\6\1\7"+
+    "\4\10\6\5\1\11\1\12\1\4\23\5";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[41];
+    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\31\0\62\0\113\0\144\0\175\0\226\0\144"+
+    "\0\144\0\226\0\257\0\310\0\341\0\372\0\u0113\0\u012c"+
+    "\0\u0145\0\u015e\0\u0177\0\u0190\0\144\0\144\0\u01a9\0\u01c2"+
+    "\0\u01db\0\u01f4\0\u020d\0\u0226\0\u023f\0\u0258\0\u0271\0\u028a"+
+    "\0\u02a3\0\u02bc\0\u02d5\0\u02ee\0\u0307\0\u0320\0\u0339\0\u0352"+
+    "\0\u036b";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[41];
+    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\1\4\1\5\1\6\25\3\1\7\1\4\1\0"+
+    "\1\10\1\11\1\12\1\13\1\14\1\15\2\7\1\16"+
+    "\1\17\1\20\3\7\1\21\1\7\1\22\1\23\2\7"+
+    "\1\24\1\25\1\3\3\0\25\3\1\0\1\4\107\0"+
+    "\1\26\1\0\1\7\4\0\22\7\2\0\1\7\4\0"+
+    "\15\7\1\27\4\7\2\0\1\7\4\0\10\7\1\12"+
+    "\1\17\10\7\2\0\1\7\4\0\1\7\1\30\20\7"+
+    "\2\0\1\7\4\0\5\7\1\31\1\7\1\32\12\7"+
+    "\2\0\1\7\4\0\10\7\1\12\11\7\2\0\1\7"+
+    "\4\0\1\7\1\12\20\7\2\0\1\7\4\0\2\7"+
+    "\1\33\17\7\2\0\1\7\4\0\20\7\1\34\1\7"+
+    "\2\0\1\7\4\0\7\7\1\35\12\7\6\0\1\11"+
+    "\24\0\1\7\4\0\16\7\1\12\3\7\2\0\1\7"+
+    "\4\0\4\7\1\36\15\7\2\0\1\7\4\0\12\7"+
+    "\1\37\7\7\2\0\1\7\4\0\10\7\1\40\11\7"+
+    "\2\0\1\7\4\0\7\7\1\41\12\7\2\0\1\7"+
+    "\4\0\1\7\1\42\20\7\2\0\1\7\4\0\2\7"+
+    "\1\43\17\7\2\0\1\7\4\0\5\7\1\12\14\7"+
+    "\2\0\1\7\4\0\13\7\1\44\6\7\2\0\1\7"+
+    "\4\0\7\7\1\45\12\7\2\0\1\7\4\0\13\7"+
+    "\1\36\6\7\2\0\1\7\4\0\21\7\1\46\2\0"+
+    "\1\7\4\0\13\7\1\47\6\7\2\0\1\7\4\0"+
+    "\5\7\1\45\14\7\2\0\1\7\4\0\11\7\1\12"+
+    "\10\7\2\0\1\7\4\0\5\7\1\50\14\7\2\0"+
+    "\1\7\4\0\2\7\1\51\17\7\2\0\1\7\4\0"+
+    "\7\7\1\12\12\7\2\0\1\7\4\0\1\36\21\7"+
+    "\2\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[900];
+    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\2\1\1\11\2\1\2\11\13\1\2\11\23\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[41];
+    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;
+
+  /* user code: */
+
+	/**
+	 * Token type specific to BBCodeTokenMaker; this signals that the user has
+	 * ended a line with an unclosed tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -1;
+
+	/**
+	 * Whether closing markup tags are automatically completed for BBCode.
+	 */
+	private static boolean completeCloseTags = true;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public BBCodeTokenMaker() {
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  The default value
+	 * for BBCode is <code>true</code>.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Returns <code>null</code> since BBCode has no comments.
+	 *
+	 * @return <code>null</code> always.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return 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) {
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 BBCodeTokenMaker(java.io.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 BBCodeTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 80) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 11: break;
+        case 9: 
+          { addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 12: break;
+        case 2: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 13: break;
+        case 10: 
+          { addToken(Token.OPERATOR);
+          }
+        case 14: break;
+        case 8: 
+          { addToken(Token.MARKUP_TAG_NAME);
+          }
+        case 15: break;
+        case 4: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+          }
+        case 16: break;
+        case 6: 
+          { addToken(Token.IDENTIFIER); /* Unhandled chars, not likely */
+          }
+        case 17: break;
+        case 5: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 18: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 19: break;
+        case 7: 
+          { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 20: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case INTAG: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 42: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 43: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.flex
new file mode 100644
index 0000000..3fb16c9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.flex
@@ -0,0 +1,669 @@
+/*
+ * 11/19/2004
+ *
+ * CPlusPlusTokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing it in C++.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A parser for the C++ programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated CPlusPlusTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ *
+ */
+%%
+
+%public
+%class CPlusPlusTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CPlusPlusTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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}|"_")
+Digit				= [0-9]
+HexDigit			= {Digit}|[A-Fa-f]
+OctalDigit			= [0-7]
+Exponent			= [eE][+-]?{Digit}+
+
+PreprocessorWord	= define|elif|else|endif|error|if|ifdef|ifndef|include|line|pragma|undef
+
+Trigraph				= ("??="|"??("|"??)"|"??/"|"??'"|"??<"|"??>"|"??!"|"??-")
+
+OctEscape1			= ([\\]{OctalDigit})
+OctEscape2			= ([\\]{OctalDigit}{OctalDigit})
+OctEscape3			= ([\\][0-3]{OctalDigit}{OctalDigit})
+OctEscape				= ({OctEscape1}|{OctEscape2}|{OctEscape3})
+HexEscape				= ([\\][xX]{HexDigit}{HexDigit})
+
+AnyChrChr					= ([^\'\n\\])
+Escape					= ([\\]([abfnrtv\'\"\?\\0]))
+UnclosedCharLiteral			= ([\']({Escape}|{OctEscape}|{HexEscape}|{Trigraph}|{AnyChrChr}))
+CharLiteral				= ({UnclosedCharLiteral}[\'])
+ErrorUnclosedCharLiteral		= ([\'][^\'\n]*)
+ErrorCharLiteral			= (([\'][\'])|{ErrorUnclosedCharLiteral}[\'])
+AnyStrChr					= ([^\"\n\\])
+FalseTrigraph				= (("?"(("?")*)[^\=\(\)\/\'\<\>\!\-\\\?\"\n])|("?"[\=\(\)\/\'\<\>\!\-]))
+StringLiteral				= ([\"]((((("?")*)({Escape}|{OctEscape}|{HexEscape}|{Trigraph}))|{FalseTrigraph}|{AnyStrChr})*)(("?")*)[\"])
+UnclosedStringLiteral		= ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral			= ({UnclosedStringLiteral}[\"])
+
+
+LineTerminator		= \n
+WhiteSpace		= [ \t\f]
+
+MLCBegin			= "/*"
+MLCEnd			= "*/"
+LineCommentBegin	= "//"
+
+NonFloatSuffix		= (([uU][lL]?)|([lL][uU]?))
+IntegerLiteral		= ({Digit}+{Exponent}?{NonFloatSuffix}?)
+HexLiteral		= ("0"[xX]{HexDigit}+{NonFloatSuffix}?)
+FloatLiteral		= ((({Digit}*[\.]{Digit}+)|({Digit}+[\.]{Digit}*)){Exponent}?[fFlL]?)
+ErrorNumberFormat	= (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+
+NonSeparator		= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#")
+Identifier		= ({LetterOrUnderscore}({LetterOrUnderscore}|{Digit}|[$])*)
+ErrorIdentifier	= ({NonSeparator}+)
+
+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 EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"auto" |
+	"break" |
+	"case" |
+	"catch" |
+	"class" |
+	"const" |
+	"const_cast" |
+	"continue" |
+	"default" |
+	"delete" |
+	"do" |
+	"dynamic_cast" |
+	"else" |
+	"enum" |
+	"explicit" |
+	"extern" |
+	"for" |
+	"friend" |
+	"goto" |
+	"if" |
+	"inline" |
+	"mutable" |
+	"namespace" |
+	"new" |
+	"operator" |
+	"private" |
+	"protected" |
+	"public" |
+	"register" |
+	"reinterpret_cast" |
+	"return" |
+	"sizeof" |
+	"static" |
+	"static_cast" |
+	"struct" |
+	"switch" |
+	"template" |
+	"this" |
+	"throw" |
+	"try" |
+	"typedef" |
+	"typeid" |
+	"typename" |
+	"union" |
+	"using" |
+	"virtual" |
+	"volatile" |
+	"while"					{ addToken(Token.RESERVED_WORD); }
+
+	/* Boolean literals. */
+	"true" |
+	"false" |
+
+	/* Data types. */
+	"bool" |
+	"char" |
+	"double" |
+	"float" |
+	"int" |
+	"long" |
+	"short" |
+	"signed" |
+	"unsigned" |
+	"void" |
+	"wchar_t"				{ addToken(Token.DATA_TYPE); }
+
+	/* Standard functions */
+	"abort" |
+	"abs" |
+	"acos" |
+	"asctime" |
+	"asin" |
+	"assert" |
+	"atan2" |
+	"atan" |
+	"atexit" |
+	"atof" |
+	"atoi" |
+	"atol" |
+	"bsearch" |
+	"btowc" |
+	"calloc" |
+	"ceil" |
+	"clearerr" |
+	"clock" |
+	"cosh" |
+	"cos" |
+	"ctime" |
+	"difftime" |
+	"div" |
+	"errno" |
+	"exit" |
+	"exp" |
+	"fabs" |
+	"fclose" |
+	"feof" |
+	"ferror" |
+	"fflush" |
+	"fgetc" |
+	"fgetpos" |
+	"fgetwc" |
+	"fgets" |
+	"fgetws" |
+	"floor" |
+	"fmod" |
+	"fopen" |
+	"fprintf" |
+	"fputc" |
+	"fputs" |
+	"fputwc" |
+	"fputws" |
+	"fread" |
+	"free" |
+	"freopen" |
+	"frexp" |
+	"fscanf" |
+	"fseek" |
+	"fsetpos" |
+	"ftell" |
+	"fwprintf" |
+	"fwrite" |
+	"fwscanf" |
+	"getchar" |
+	"getc" |
+	"getenv" |
+	"gets" |
+	"getwc" |
+	"getwchar" |
+	"gmtime" |
+	"isalnum" |
+	"isalpha" |
+	"iscntrl" |
+	"isdigit" |
+	"isgraph" |
+	"islower" |
+	"isprint" |
+	"ispunct" |
+	"isspace" |
+	"isupper" |
+	"isxdigit" |
+	"labs" |
+	"ldexp" |
+	"ldiv" |
+	"localeconv" |
+	"localtime" |
+	"log10" |
+	"log" |
+	"longjmp" |
+	"malloc" |
+	"mblen" |
+	"mbrlen" |
+	"mbrtowc" |
+	"mbsinit" |
+	"mbsrtowcs" |
+	"mbstowcs" |
+	"mbtowc" |
+	"memchr" |
+	"memcmp" |
+	"memcpy" |
+	"memmove" |
+	"memset" |
+	"mktime" |
+	"modf" |
+	"offsetof" |
+	"perror" |
+	"pow" |
+	"printf" |
+	"putchar" |
+	"putc" |
+	"puts" |
+	"putwc" |
+	"putwchar" |
+	"qsort" |
+	"raise" |
+	"rand" |
+	"realloc" |
+	"remove" |
+	"rename" |
+	"rewind" |
+	"scanf" |
+	"setbuf" |
+	"setjmp" |
+	"setlocale" |
+	"setvbuf" |
+	"setvbuf" |
+	"signal" |
+	"sinh" |
+	"sin" |
+	"sprintf" |
+	"sqrt" |
+	"srand" |
+	"sscanf" |
+	"strcat" |
+	"strchr" |
+	"strcmp" |
+	"strcmp" |
+	"strcoll" |
+	"strcpy" |
+	"strcspn" |
+	"strerror" |
+	"strftime" |
+	"strlen" |
+	"strncat" |
+	"strncmp" |
+	"strncpy" |
+	"strpbrk" |
+	"strrchr" |
+	"strspn" |
+	"strstr" |
+	"strtod" |
+	"strtok" |
+	"strtol" |
+	"strtoul" |
+	"strxfrm" |
+	"swprintf" |
+	"swscanf" |
+	"system" |
+	"tanh" |
+	"tan" |
+	"time" |
+	"tmpfile" |
+	"tmpnam" |
+	"tolower" |
+	"toupper" |
+	"ungetc" |
+	"ungetwc" |
+	"va_arg" |
+	"va_end" |
+	"va_start" |
+	"vfprintf" |
+	"vfwprintf" |
+	"vprintf" |
+	"vsprintf" |
+	"vswprintf" |
+	"vwprintf" |
+	"wcrtomb" |
+	"wcscat" |
+	"wcschr" |
+	"wcscmp" |
+	"wcscoll" |
+	"wcscpy" |
+	"wcscspn" |
+	"wcsftime" |
+	"wcslen" |
+	"wcsncat" |
+	"wcsncmp" |
+	"wcsncpy" |
+	"wcspbrk" |
+	"wcsrchr" |
+	"wcsrtombs" |
+	"wcsspn" |
+	"wcsstr" |
+	"wcstod" |
+	"wcstok" |
+	"wcstol" |
+	"wcstombs" |
+	"wcstoul" |
+	"wcsxfrm" |
+	"wctob" |
+	"wctomb" |
+	"wmemchr" |
+	"wmemcmp" |
+	"wmemcpy" |
+	"wmemmove" |
+	"wmemset" |
+	"wprintf" |
+	"wscanf"				{ addToken(Token.FUNCTION); }
+
+	/* Standard-defined macros. */
+	"__DATE__" |
+	"__TIME__" |
+	"__FILE__" |
+	"__LINE__" |
+	"__STDC__"				{ addToken(Token.PREPROCESSOR); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* Preprocessor directives */
+	"#"{WhiteSpace}*{PreprocessorWord}	{ addToken(Token.PREPROCESSOR); }
+
+	/* String/Character Literals. */
+	{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
+	{ErrorUnclosedCharLiteral}		{ 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. */
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+	{LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+	/* Separators. */
+	"(" |
+	")" |
+	"[" |
+	"]" |
+	"{" |
+	"}"							{ addToken(Token.SEPARATOR); }
+
+	/* Operators. */
+	{Trigraph} |
+	"=" |
+	"+" |
+	"-" |
+	"*" |
+	"/" |
+	"%" |
+	"~" |
+	"<" |
+	">" |
+	"<<" |
+	">>" |
+	"==" |
+	"+=" |
+	"-=" |
+	"*=" |
+	"/=" |
+	"%=" |
+	">>=" |
+	"<<=" |
+	"^" |
+	"&" |
+	"&&" |
+	"|" |
+	"||" |
+	"?" |
+	":" |
+	"," |
+	"!" |
+	"++" |
+	"--" |
+	"." |
+	","							{ 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); }
+
+	/* Some lines will end in '\' to wrap an expression. */
+	"\\"							{ addToken(Token.IDENTIFIER); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Other punctuation, we'll highlight it as "identifiers." */
+	";"							{ addToken(Token.IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<MLC> {
+
+	[^hwf\n\*]+			{}
+	{URL}				{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]				{}
+
+	\n					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}			{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*					{}
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+<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; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.java
new file mode 100644
index 0000000..158e255
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.java
@@ -0,0 +1,2319 @@
+/* The following code was generated by JFlex 1.4.1 on 1/25/09 10:02 PM */
+
+/*
+ * 11/19/2004
+ *
+ * CPlusPlusTokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing it in C++.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A parser for the C++ programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated CPlusPlusTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ *
+ */
+
+public class CPlusPlusTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int EOL_COMMENT = 2;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\50\1\43\1\0\1\50\1\56\22\0\1\50\1\36\1\44"+
+    "\1\57\1\60\1\65\1\114\1\33\1\31\1\31\1\51\1\7\1\64"+
+    "\1\37\1\54\1\32\1\47\1\77\1\76\1\41\4\5\2\3\1\70"+
+    "\1\63\1\34\1\30\1\35\1\27\1\61\1\103\1\4\1\111\1\102"+
+    "\1\6\1\55\2\1\1\105\2\1\1\53\1\106\1\107\4\1\1\110"+
+    "\1\104\1\52\2\1\1\42\2\1\1\62\1\40\1\62\1\113\1\2"+
+    "\1\0\1\24\1\46\1\21\1\10\1\11\1\12\1\25\1\66\1\13"+
+    "\1\100\1\72\1\15\1\26\1\14\1\20\1\23\1\101\1\17\1\16"+
+    "\1\67\1\22\1\45\1\71\1\74\1\73\1\75\1\112\1\115\1\112"+
+    "\1\64\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 =
+    "\3\0\1\1\2\2\1\3\1\4\17\2\2\4\1\5"+
+    "\1\4\1\6\4\4\1\2\1\7\1\10\2\2\1\3"+
+    "\1\11\1\4\2\1\4\2\2\4\2\12\1\13\5\12"+
+    "\1\14\2\12\1\2\2\15\2\3\1\16\2\2\1\17"+
+    "\22\2\1\17\56\2\1\0\1\20\1\21\2\22\1\23"+
+    "\1\6\2\10\1\24\11\2\1\15\6\1\1\0\14\2"+
+    "\2\0\1\25\6\0\5\2\1\3\1\0\1\3\1\15"+
+    "\1\16\3\2\1\26\6\2\1\26\23\2\1\27\16\2"+
+    "\1\26\1\2\1\26\55\2\1\6\1\30\1\6\3\22"+
+    "\1\6\2\10\1\31\10\2\1\32\4\1\1\33\4\1"+
+    "\6\0\14\2\10\0\5\2\1\16\1\0\37\2\1\27"+
+    "\44\2\1\26\2\2\1\26\7\2\1\6\1\10\7\2"+
+    "\2\32\7\1\4\0\1\33\4\0\11\2\2\0\1\34"+
+    "\2\0\1\35\43\2\1\17\13\2\1\32\1\33\3\1"+
+    "\7\0\10\2\4\0\22\2\2\1\1\33\3\0\12\2"+
+    "\2\0\1\33\4\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[578];
+    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\116\0\234\0\352\0\u0138\0\u0186\0\u01d4\0\u0222"+
+    "\0\u0270\0\u02be\0\u030c\0\u035a\0\u03a8\0\u03f6\0\u0444\0\u0492"+
+    "\0\u04e0\0\u052e\0\u057c\0\u05ca\0\u0618\0\u0666\0\u06b4\0\u0702"+
+    "\0\u0750\0\u079e\0\u07ec\0\u083a\0\u0888\0\u08d6\0\u079e\0\u0924"+
+    "\0\352\0\u079e\0\u0972\0\u09c0\0\u0a0e\0\u0a5c\0\u0aaa\0\u0af8"+
+    "\0\u079e\0\u0b46\0\u079e\0\u0b94\0\u0be2\0\u0c30\0\u0c7e\0\u0ccc"+
+    "\0\u0d1a\0\u0d68\0\u079e\0\u0db6\0\u0e04\0\u0e52\0\u0ea0\0\u0eee"+
+    "\0\u079e\0\u0f3c\0\u0f8a\0\u0fd8\0\u1026\0\u1074\0\u10c2\0\u1110"+
+    "\0\u115e\0\u11ac\0\u11fa\0\u1248\0\u1296\0\u12e4\0\u1332\0\u1380"+
+    "\0\u13ce\0\u141c\0\u146a\0\u14b8\0\u1506\0\u1554\0\u15a2\0\u15f0"+
+    "\0\u163e\0\u168c\0\u16da\0\u1728\0\u1776\0\u17c4\0\u0138\0\u1812"+
+    "\0\u1860\0\u18ae\0\u18fc\0\u194a\0\u1998\0\u19e6\0\u1a34\0\u1a82"+
+    "\0\u1ad0\0\u1b1e\0\u1b6c\0\u1bba\0\u1c08\0\u1c56\0\u1ca4\0\u1cf2"+
+    "\0\u1d40\0\u1d8e\0\u1ddc\0\u1e2a\0\u1e78\0\u1ec6\0\u1f14\0\u1f62"+
+    "\0\u1fb0\0\u1ffe\0\u204c\0\u209a\0\u20e8\0\u2136\0\u2184\0\u21d2"+
+    "\0\u2220\0\u226e\0\u22bc\0\u230a\0\u2358\0\u23a6\0\u23f4\0\u2442"+
+    "\0\u2490\0\u24de\0\u252c\0\u257a\0\u25c8\0\u2616\0\u079e\0\u079e"+
+    "\0\u2664\0\u26b2\0\u079e\0\u2700\0\u274e\0\u279c\0\u079e\0\u27ea"+
+    "\0\u2838\0\u2886\0\u28d4\0\u2922\0\u2970\0\u29be\0\u2a0c\0\u2a5a"+
+    "\0\u2aa8\0\u2af6\0\u2b44\0\u2b92\0\u2be0\0\u2c2e\0\u2c7c\0\u2cca"+
+    "\0\u2d18\0\u2d66\0\u2db4\0\u2e02\0\u2e50\0\u2e9e\0\u2eec\0\u2f3a"+
+    "\0\u2f88\0\u2fd6\0\u3024\0\u3072\0\u30c0\0\u310e\0\u079e\0\u315c"+
+    "\0\u31aa\0\u31f8\0\u3246\0\u3294\0\u32e2\0\u3330\0\u337e\0\u33cc"+
+    "\0\u341a\0\u3468\0\u34b6\0\u3504\0\u1026\0\u3552\0\u1026\0\u35a0"+
+    "\0\u35ee\0\u363c\0\u0138\0\u368a\0\u36d8\0\u3726\0\u3774\0\u37c2"+
+    "\0\u3810\0\u385e\0\u38ac\0\u38fa\0\u3948\0\u3996\0\u39e4\0\u3a32"+
+    "\0\u3a80\0\u3ace\0\u3b1c\0\u3b6a\0\u3bb8\0\u3c06\0\u3c54\0\u3ca2"+
+    "\0\u3cf0\0\u3d3e\0\u3d8c\0\u3dda\0\u3e28\0\u0138\0\u3e76\0\u3ec4"+
+    "\0\u3f12\0\u3f60\0\u3fae\0\u3ffc\0\u404a\0\u4098\0\u40e6\0\u4134"+
+    "\0\u4182\0\u41d0\0\u421e\0\u426c\0\u42ba\0\u4308\0\u4356\0\u43a4"+
+    "\0\u43f2\0\u4440\0\u448e\0\u44dc\0\u452a\0\u4578\0\u45c6\0\u4614"+
+    "\0\u4662\0\u46b0\0\u46fe\0\u474c\0\u479a\0\u47e8\0\u4836\0\u4884"+
+    "\0\u48d2\0\u4920\0\u496e\0\u49bc\0\u4a0a\0\u4a58\0\u4aa6\0\u4af4"+
+    "\0\u4b42\0\u4b90\0\u4bde\0\u4c2c\0\u4c7a\0\u4cc8\0\u4d16\0\u4d64"+
+    "\0\u4db2\0\u4e00\0\u4e4e\0\u4e9c\0\u4eea\0\u4f38\0\u4f86\0\u4fd4"+
+    "\0\u5022\0\u5070\0\u50be\0\u510c\0\u515a\0\u079e\0\u51a8\0\u51f6"+
+    "\0\u5244\0\u5292\0\u52e0\0\u532e\0\u537c\0\u079e\0\u53ca\0\u5418"+
+    "\0\u5466\0\u54b4\0\u5502\0\u5550\0\u559e\0\u55ec\0\u563a\0\u5688"+
+    "\0\u56d6\0\u5724\0\u5772\0\u57c0\0\u580e\0\u585c\0\u58aa\0\u58f8"+
+    "\0\u5946\0\u5994\0\u59e2\0\u5a30\0\u5a7e\0\u5acc\0\u5b1a\0\u5b68"+
+    "\0\u5bb6\0\u5c04\0\u5c52\0\u5ca0\0\u5cee\0\u5d3c\0\u5d8a\0\u5dd8"+
+    "\0\u5e26\0\u5e74\0\u5ec2\0\u5f10\0\u5f5e\0\u5fac\0\u5ffa\0\u6048"+
+    "\0\u6096\0\u60e4\0\u6132\0\u6180\0\u61ce\0\u621c\0\u626a\0\u62b8"+
+    "\0\u6306\0\u6354\0\u63a2\0\u63f0\0\u643e\0\u648c\0\u64da\0\u6528"+
+    "\0\u6576\0\u65c4\0\u6612\0\u6660\0\u66ae\0\u66fc\0\u674a\0\u6798"+
+    "\0\u67e6\0\u6834\0\u6882\0\u68d0\0\u691e\0\u696c\0\u69ba\0\u6a08"+
+    "\0\u6a56\0\u6aa4\0\u6af2\0\u6b40\0\u6b8e\0\u6bdc\0\u6c2a\0\u6c78"+
+    "\0\u6cc6\0\u6d14\0\u6d62\0\u6db0\0\u6dfe\0\u6e4c\0\u6e9a\0\u6ee8"+
+    "\0\u6f36\0\u6f84\0\u6fd2\0\u7020\0\u706e\0\u70bc\0\u710a\0\u7158"+
+    "\0\u71a6\0\u71f4\0\u7242\0\u7290\0\u72de\0\u732c\0\u737a\0\u73c8"+
+    "\0\u7416\0\u7464\0\u74b2\0\u7500\0\u754e\0\u759c\0\u75ea\0\u7638"+
+    "\0\u7686\0\u76d4\0\u7722\0\u7770\0\u77be\0\u780c\0\u785a\0\u78a8"+
+    "\0\u78f6\0\u7944\0\u7992\0\u79e0\0\u7a2e\0\u7a7c\0\u7aca\0\u7b18"+
+    "\0\u7b66\0\u7bb4\0\u7c02\0\u7c50\0\u7c9e\0\u7cec\0\u7d3a\0\u7d88"+
+    "\0\u7dd6\0\u7e24\0\u7e72\0\u7ec0\0\u7f0e\0\u7f5c\0\u7faa\0\u7ff8"+
+    "\0\u8046\0\u8094\0\u80e2\0\u8130\0\u817e\0\u81cc\0\u821a\0\u8268"+
+    "\0\u82b6\0\u8304\0\u8352\0\u83a0\0\u83ee\0\u843c\0\u848a\0\u84d8"+
+    "\0\u8526\0\u8574\0\u85c2\0\u8610\0\u865e\0\u86ac\0\u86fa\0\u8748"+
+    "\0\u8796\0\u87e4\0\u8832\0\u8880\0\u88ce\0\u891c\0\u896a\0\u4356"+
+    "\0\u89b8\0\u8a06\0\u8a54\0\u8aa2\0\u8af0\0\u8b3e\0\u8b8c\0\u8bda"+
+    "\0\u8c28\0\u8c76\0\u8cc4\0\u8d12\0\u8d60\0\u8dae\0\u8dfc\0\u8e4a"+
+    "\0\u8e98\0\u8ee6\0\u8f34\0\u8f82\0\u8fd0\0\u901e\0\u906c\0\u90ba"+
+    "\0\u9108\0\u9156\0\u91a4\0\u91f2\0\u9240\0\u928e\0\u92dc\0\u932a"+
+    "\0\u9378\0\u93c6\0\u9414\0\u9462\0\u94b0\0\u94fe\0\u954c\0\u959a"+
+    "\0\u95e8\0\u1026\0\352\0\u9636\0\u9684\0\u96d2\0\u9720\0\u976e"+
+    "\0\u97bc\0\u980a\0\u9858\0\u98a6\0\u98f4\0\u9942\0\u9990\0\u99de"+
+    "\0\u9a2c\0\u9a7a\0\u9ac8\0\u9b16\0\u9b64\0\u9bb2\0\u86fa\0\u9c00"+
+    "\0\u87e4\0\u9c4e\0\u9c9c\0\u9cea\0\u9d38\0\u9d86\0\u9dd4\0\u9e22"+
+    "\0\u9e70\0\u9ebe\0\u9f0c\0\u9f5a\0\u9fa8\0\u9ff6\0\ua044\0\ua092"+
+    "\0\ua0e0\0\ua12e\0\ua17c\0\ua1ca\0\ua218\0\u079e\0\ua266\0\ua2b4"+
+    "\0\ua302\0\ua350\0\ua39e\0\ua3ec\0\u928e\0\ua43a\0\ua488\0\ua4d6"+
+    "\0\ua524\0\ua572\0\ua5c0\0\ua60e\0\ua65c\0\u0138\0\ua6aa\0\ua6f8"+
+    "\0\ua746\0\ua794";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[578];
+    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\4\1\5\1\6\1\7\1\5\1\7\1\5\1\10"+
+    "\1\11\1\12\1\13\1\14\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\32\1\33\1\34\1\35\1\36\1\37\1\40"+
+    "\1\41\1\7\1\5\1\42\1\43\1\44\1\45\1\46"+
+    "\1\47\1\31\2\5\1\50\1\5\1\51\1\52\2\4"+
+    "\1\32\1\53\1\37\1\31\1\5\1\54\1\37\1\55"+
+    "\4\5\2\7\1\5\1\56\10\5\1\32\1\37\1\57"+
+    "\1\60\12\61\1\62\30\61\1\63\5\61\1\64\14\61"+
+    "\1\65\2\61\1\66\24\61\12\67\1\70\30\67\1\71"+
+    "\22\67\1\72\2\67\1\73\24\67\7\4\1\0\17\4"+
+    "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+
+    "\1\0\3\4\4\0\2\4\1\0\21\4\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\1\5\1\74"+
+    "\4\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\3\75\1\7\1\75"+
+    "\1\7\1\76\1\0\1\75\1\76\3\75\1\77\4\75"+
+    "\1\100\4\75\11\0\1\75\1\7\1\75\2\0\2\75"+
+    "\1\7\2\0\1\100\1\77\1\101\1\75\1\0\3\75"+
+    "\4\0\2\75\1\0\5\75\2\7\12\75\13\0\1\37"+
+    "\20\0\1\37\65\0\1\4\6\5\1\0\1\5\1\102"+
+    "\1\5\1\103\4\5\1\104\6\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\2\5\1\105\16\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\106\1\107\1\5"+
+    "\1\110\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\3\5\1\111\15\5\4\0\1\4\6\5"+
+    "\1\0\1\5\1\112\1\113\2\5\1\114\1\115\1\116"+
+    "\1\117\1\120\1\5\1\121\1\122\1\123\1\124\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\125\1\0"+
+    "\1\126\20\5\4\0\1\4\6\5\1\0\2\5\1\127"+
+    "\1\5\1\130\1\5\1\131\10\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\132\12\5\1\133\2\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\134\7\5\1\135\3\5"+
+    "\1\136\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\137\1\5\1\140\2\5\1\141\1\142\1\5\1\143"+
+    "\1\5\1\144\3\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\145\1\146\1\0\1\147\1\5\1\150\5\5"+
+    "\1\151\10\5\4\0\1\4\6\5\1\0\1\5\1\152"+
+    "\12\5\1\153\2\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\2\5\1\154\10\5\1\155\3\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\156\3\5\1\157\2\5\1\160"+
+    "\3\5\1\161\2\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\162\1\163\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\4\5\1\164\1\5\1\165\10\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\166\5\5\1\167\1\170"+
+    "\1\5\1\171\4\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\172\2\5\1\173\1\174\4\5\11\0\1\4"+
+    "\2\5\2\0\1\5\1\175\1\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\176"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\177"+
+    "\6\5\1\174\5\5\1\200\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\1\5\1\201\6\5\1\202\1\5\1\203\1\5"+
+    "\1\204\2\5\11\0\1\4\2\5\2\0\1\5\1\205"+
+    "\1\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\1\5\1\200\17\5\33\0"+
+    "\1\206\116\0\1\37\233\0\1\37\1\0\1\207\16\0"+
+    "\1\210\44\0\27\211\1\212\3\211\1\213\4\211\1\214"+
+    "\2\211\1\0\52\211\34\0\1\31\116\0\1\31\110\0"+
+    "\1\37\6\0\1\37\56\0\40\43\1\215\2\43\1\216"+
+    "\1\217\51\43\1\4\6\5\1\0\2\5\1\220\1\221"+
+    "\2\5\1\220\1\5\1\222\2\5\1\144\1\223\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\1\224\20\5\4\0\1\4\6\5\1\0\6\5\1\225"+
+    "\1\226\1\227\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\230\1\0\21\5\4\0\3\75\1\7"+
+    "\1\75\1\7\1\76\1\0\1\75\1\76\3\75\1\77"+
+    "\4\75\1\100\4\75\11\0\1\75\1\7\1\231\2\0"+
+    "\2\75\1\7\2\0\1\100\1\77\1\101\1\75\1\0"+
+    "\3\75\4\0\2\75\1\0\3\75\1\231\1\75\2\7"+
+    "\12\75\54\0\1\47\50\0\1\101\1\0\1\101\33\0"+
+    "\1\101\5\0\1\101\26\0\2\101\16\0\7\4\1\0"+
+    "\1\232\1\233\1\4\1\234\1\4\1\235\4\4\1\236"+
+    "\1\237\3\4\11\0\3\4\2\0\3\4\1\240\1\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\1\4\6\5\1\0\1\5\1\241\1\5"+
+    "\1\242\3\5\1\243\1\244\3\5\1\245\1\5\1\246"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\247\1\5"+
+    "\1\0\2\5\1\250\16\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\141\2\5\1\251\1\5\1\144\2\5\1\252"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\253\1\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\254"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\120\0\1\37\116\0\1\37\12\61\1\0"+
+    "\30\61\1\0\5\61\1\0\14\61\1\0\2\61\1\0"+
+    "\24\61\13\0\1\255\53\0\1\256\60\0\1\257\152\0"+
+    "\1\260\117\0\1\261\24\0\12\67\1\0\30\67\1\0"+
+    "\22\67\1\0\2\67\1\0\24\67\13\0\1\262\53\0"+
+    "\1\263\115\0\1\264\117\0\1\265\24\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\1\5\1\266\1\0\1\267\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\11\5\1\270\1\5\1\271\3\5"+
+    "\1\272\1\5\4\0\7\75\1\0\17\75\11\0\3\75"+
+    "\2\0\3\75\2\0\2\75\1\0\1\75\1\0\3\75"+
+    "\4\0\2\75\1\0\21\75\4\0\3\75\1\273\1\75"+
+    "\1\273\1\75\1\274\17\75\10\0\1\274\1\75\1\273"+
+    "\1\75\2\0\2\75\1\273\2\0\2\75\1\0\1\75"+
+    "\1\0\3\75\4\0\2\75\1\0\5\75\2\273\12\75"+
+    "\4\0\7\75\1\0\12\75\1\275\4\75\11\0\3\75"+
+    "\2\0\3\75\2\0\1\275\1\75\1\0\1\75\1\0"+
+    "\3\75\4\0\2\75\1\0\21\75\4\0\7\75\1\0"+
+    "\5\75\1\275\11\75\11\0\3\75\2\0\3\75\2\0"+
+    "\1\75\1\275\1\0\1\75\1\0\3\75\4\0\2\75"+
+    "\1\0\21\75\4\0\3\75\1\101\1\75\1\101\1\276"+
+    "\1\0\1\75\1\276\1\277\2\75\1\277\11\75\11\0"+
+    "\1\75\1\101\1\75\2\0\2\75\1\101\2\0\1\75"+
+    "\1\277\1\0\1\277\1\0\3\75\4\0\2\75\1\0"+
+    "\5\75\2\101\12\75\4\0\1\4\6\5\1\0\2\5"+
+    "\1\300\2\5\1\301\11\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\2\5\1\302\14\5\11\0\1\4\2\5\2\0"+
+    "\1\303\2\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\12\5\1\304\4\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\4\5\1\305\12\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\12\5\1\306\4\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\6\5\1\307\10\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\7\5\1\310\7\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\3\5\1\311\7\5\1\312\3\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\313\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\7\5\1\314\1\315"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\5\5\1\316"+
+    "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\317"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\320"+
+    "\7\5\1\143\5\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\321\1\5\1\322\13\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\7\5\1\127\3\5\1\323\3\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\5\5\1\324\11\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\7\5\1\325\2\5\1\326"+
+    "\4\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\5\5\1\327"+
+    "\11\5\11\0\1\4\2\5\2\0\1\5\1\330\1\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\331\15\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\10\5\1\332\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\333\15\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\141\1\334\3\5\1\144\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\5\5\1\335\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\336\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\337\4\5\1\340\1\341"+
+    "\2\5\1\342\1\343\1\344\1\345\1\346\1\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\3\5"+
+    "\1\347\15\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\1\127"+
+    "\20\5\4\0\1\4\6\5\1\0\16\5\1\350\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\351\1\5\1\352"+
+    "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\4\5\1\353"+
+    "\4\5\1\354\3\5\1\355\1\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\1\5"+
+    "\1\330\1\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\356\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\4\5\1\357\10\5\1\360\1\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\4\5\1\361"+
+    "\14\5\4\0\1\4\6\5\1\0\11\5\1\143\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\14\5\1\362\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\14\5\1\363\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\7\5\1\325\7\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\10\5\1\364\6\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\7\5\1\365\4\5"+
+    "\1\366\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\367\2\5\1\141\4\5\1\144\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\370\10\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\311\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\3\5\1\371\1\372\7\5\1\204"+
+    "\1\373\1\374\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\375\1\0\1\376\20\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\377\1\332\12\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\2\5\1\u0100\14\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\u0101\15\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\3\5\1\u0102\13\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\u0103\6\5\1\u0104\3\5\1\u0105"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\4\5\1\u0106"+
+    "\1\5\1\357\10\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\5\5\1\u0107\1\307\10\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\u0108\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\14\5\1\u0109\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\3\5\1\242\13\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\3\5\1\u010a\2\5\1\u010b\6\5\1\u010c"+
+    "\1\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u010d"+
+    "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\7\5\1\314"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u010e"+
+    "\4\5\1\u010f\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\1\303\20\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\1\5\1\u0110\1\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u0111\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\3\5\1\u0112\2\5\1\u0113\2\5\1\200\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\10\5\1\330\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\u0114\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\303\1\5\1\151\6\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u0115\6\5"+
+    "\1\u0116\3\5\1\u0117\2\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u0118\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\163\1\0\21\5\4\0\1\4\6\5\1\0\16\5"+
+    "\1\u0119\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\315\16\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\u011a\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\5\5\1\u0107\11\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\5\5\1\323\1\u011b\1\u011c"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\230\1\0\21\5\34\0\10\37\56\0\33\u011d\1\u011e"+
+    "\7\u011d\1\0\101\u011d\1\u011f\3\u011d\1\u011e\7\u011d\1\0"+
+    "\57\u011d\1\u0120\4\u011d\1\211\1\u011d\1\211\2\u011d\1\211"+
+    "\4\u011d\1\211\2\u011d\1\211\3\u011d\1\u0121\4\u011d\1\211"+
+    "\1\u0122\1\u0123\1\0\3\211\1\u0122\17\u011d\1\211\4\u011d"+
+    "\1\u0123\1\u011d\2\u0122\16\u011d\5\216\1\43\4\216\1\43"+
+    "\1\216\1\43\2\216\1\43\4\216\1\43\2\216\1\43"+
+    "\3\216\1\43\4\216\2\43\1\u0124\1\0\4\43\17\216"+
+    "\1\43\4\216\1\u0124\1\216\2\43\56\216\1\u0125\3\216"+
+    "\1\u0126\51\216\1\4\6\5\1\0\13\5\1\144\3\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\1\224\20\5\4\0\1\4\6\5\1\0\7\5\1\u0127"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u0128"+
+    "\1\5\1\u0129\11\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\1\5\1\u012a"+
+    "\4\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\13\5\1\144\3\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\u012b\15\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\u012c\15\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\10\5\1\u012d\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\10\5\1\u012e\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\3\75\4\u012f\1\0"+
+    "\3\u012f\6\75\1\u012f\2\75\1\u012f\2\75\11\0\1\75"+
+    "\1\u012f\1\75\2\0\1\75\2\u012f\2\0\2\75\1\0"+
+    "\1\u012f\1\0\3\75\4\0\2\75\1\0\5\75\2\u012f"+
+    "\2\75\2\u012f\5\75\1\u012f\4\0\7\4\1\0\1\4"+
+    "\1\u0130\15\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\4\0\7\4\1\0\4\4\1\u0131\1\u0132\1\4\1\u0133"+
+    "\7\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+
+    "\1\4\1\0\3\4\4\0\2\4\1\0\21\4\4\0"+
+    "\7\4\1\0\2\4\1\u0134\1\4\1\u0135\12\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\3\4\1\u0136\13\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\4\4\1\u0137\12\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\7\4\1\u0138\7\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\14\0\1\u0139\1\u013a\1\0\1\u013b\1\0\1\u013c"+
+    "\4\0\1\u013d\1\u013e\24\0\1\240\45\0\1\4\6\5"+
+    "\1\0\16\5\1\u013f\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\16\5\1\u0140\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\12\5"+
+    "\1\u0141\4\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\2\5\1\127\16\5\4\0\1\4\6\5"+
+    "\1\0\5\5\1\340\4\5\1\343\4\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\4\5\1\357\12\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\u0142\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\3\5\1\u0143\3\5\1\u0144\7\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\13\5\1\u0145\3\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\6\5\1\u0146\1\u0147"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\u0148"+
+    "\1\u0149\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\201\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\u014a\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+    "\1\151\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\21\0\1\u014b\123\0\1\u014c\161\0"+
+    "\1\u014d\117\0\1\u014e\41\0\1\u014f\123\0\1\u0150\161\0"+
+    "\1\u0151\117\0\1\u0152\24\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\14\5\1\u0153\4\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\14\5\1\u0154\4\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\12\5\1\u0155\6\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\14\5\1\u0156\4\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\13\5\1\u0157\5\5\4\0\3\75\1\273\1\75\1\273"+
+    "\1\75\1\0\5\75\1\77\4\75\1\100\4\75\11\0"+
+    "\1\75\1\273\1\75\2\0\2\75\1\273\2\0\1\100"+
+    "\1\77\1\0\1\75\1\0\3\75\4\0\2\75\1\0"+
+    "\5\75\2\273\12\75\7\0\1\273\1\0\1\273\33\0"+
+    "\1\273\5\0\1\273\26\0\2\273\16\0\3\75\1\u0158"+
+    "\1\75\1\u0158\1\75\1\u0159\17\75\10\0\1\u0159\1\75"+
+    "\1\u0158\1\75\2\0\2\75\1\u0158\2\0\2\75\1\0"+
+    "\1\75\1\0\3\75\4\0\2\75\1\0\5\75\2\u0158"+
+    "\12\75\4\0\1\4\6\5\1\0\14\5\1\u015a\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u015b\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\2\5\1\200\14\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\1\5\1\u015c\1\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\14\5\1\u015d\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\16\5\1\127\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\127\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u015e\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\303\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\5\5\1\u015f\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\u0160\15\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u0161\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\2\5\1\303\14\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\12\5\1\u0162\4\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\u0163\3\5\1\u0164\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u0165\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0166"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\303"+
+    "\6\5\1\u0167\3\5\1\332\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\3\5\1\u0168\15\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u0169\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u0112\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\10\5\1\377\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\3\5\1\u016a\13\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\u016b\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\u0141\10\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\303\10\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\u016c\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\303\16\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\5\5\1\u0102\11\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\u016d\13\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\u016e\13\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\u016f\13\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\10\5\1\u0170\6\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\13\5\1\u0171\3\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\4\5\1\u0172\12\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\13\5\1\u0173\3\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\7\5\1\u0174\2\5\1\u0175\4\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\5\5\1\u0176\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u0177\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\337\16\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\u0178\15\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\3\5\1\u0168\15\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\1\303"+
+    "\2\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\15\5\1\u0179\1\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\14\5\1\u017a\2\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\6\5\1\u017b\12\5\4\0\1\4\6\5"+
+    "\1\0\5\5\1\u017c\11\5\11\0\1\4\2\5\2\0"+
+    "\1\u017d\1\u017e\1\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\7\5\1\u017f"+
+    "\11\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\303\1\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u0180\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u0181\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\332\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\315\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\7\5\1\u0164\7\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\166\1\200\1\5"+
+    "\1\u0182\1\323\1\u0183\1\u0184\1\5\1\u0185\1\u0186\1\u0187"+
+    "\3\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0188\1\0\3\5\1\u0189\15\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u018a\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0108\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u018b"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\4\5\1\u018c"+
+    "\12\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\242"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u018d"+
+    "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u018e"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\12\5\1\u0160"+
+    "\4\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\362"+
+    "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0140"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u018f"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\7\5\1\u0190"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\5\5\1\303"+
+    "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\u0191"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\u0165"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0143"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0192"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0193\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\u0194\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\u0195\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\336\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+    "\1\u0196\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\u0197\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\u0198\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\4\5"+
+    "\1\u0199\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\4\5"+
+    "\1\u019a\12\5\11\0\1\4\2\5\2\0\1\u019b\2\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u019c\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\u019d\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\6\5"+
+    "\1\303\2\5\1\u019e\5\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\1\u019f\20\5\4\0\1\4"+
+    "\6\5\1\0\4\5\1\303\12\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\151\15\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\10\5\1\127\6\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\3\5\1\u01a0\15\5\4\0\1\4"+
+    "\6\5\1\0\2\5\2\303\1\5\1\303\11\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u01a1\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u01a2\4\5\1\303"+
+    "\2\5\1\u019e\5\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\1\u019f\20\5\4\0\1\4\6\5"+
+    "\1\0\6\5\1\u01a3\2\5\1\u01a4\4\5\1\374\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\14\5\1\u01a5\2\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\3\5\1\u01a6\3\5\1\u01a7"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u01a8\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\323\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\230\1\0\21\5\4\0\33\u011d\1\213\7\u011d"+
+    "\1\0\102\u011d\3\211\1\u0121\4\211\3\u011d\1\0\57\u011d"+
+    "\1\211\25\u011d\1\u011e\5\u011d\1\211\1\u011d\1\0\3\u011d"+
+    "\1\211\26\u011d\2\211\16\u011d\33\0\1\u011e\62\0\5\u011d"+
+    "\1\u0120\25\u011d\1\u011e\5\u011d\1\u0120\1\u011d\1\0\3\u011d"+
+    "\1\u0120\26\u011d\2\u0120\21\u011d\4\u01a9\1\u011d\3\u01a9\6\u011d"+
+    "\1\u01a9\2\u011d\1\u01a9\6\u011d\1\213\5\u011d\1\u01a9\1\u011d"+
+    "\1\0\2\u011d\2\u01a9\5\u011d\1\u01a9\20\u011d\2\u01a9\2\u011d"+
+    "\2\u01a9\5\u011d\1\u01a9\4\u011d\3\216\4\u01aa\1\216\3\u01aa"+
+    "\6\216\1\u01aa\2\216\1\u01aa\13\216\1\u0125\1\u01aa\2\216"+
+    "\1\u0126\1\216\2\u01aa\5\216\1\u01aa\20\216\2\u01aa\2\216"+
+    "\2\u01aa\5\216\1\u01aa\47\216\1\0\52\216\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u01ab\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\336\16\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+    "\1\u01ac\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\362\4\5\1\u01ad\5\5\1\u01ae\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\14\5\1\u01af\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\14\5\1\u01b0\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\5\5\1\336\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\1\u01b1\20\5\4\0\3\75"+
+    "\4\u012f\1\0\3\u012f\2\75\1\u01b2\3\75\1\u012f\1\u01b3"+
+    "\1\75\1\u012f\2\75\11\0\1\75\1\u012f\1\75\2\0"+
+    "\1\75\2\u012f\2\0\1\u01b3\1\u01b2\1\0\1\u012f\1\0"+
+    "\3\75\4\0\2\75\1\0\5\75\2\u012f\2\75\2\u012f"+
+    "\5\75\1\u012f\4\0\7\4\1\0\2\4\1\235\14\4"+
+    "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+
+    "\1\0\3\4\4\0\2\4\1\0\21\4\4\0\7\4"+
+    "\1\0\1\u01b4\16\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\3\4\1\u01b5\2\4\1\u01b6"+
+    "\10\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+
+    "\1\4\1\0\3\4\4\0\2\4\1\0\21\4\4\0"+
+    "\7\4\1\0\7\4\1\u01b7\7\4\11\0\3\4\2\0"+
+    "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+
+    "\2\4\1\0\21\4\4\0\7\4\1\0\1\u01b8\3\4"+
+    "\1\u0137\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\4\0\7\4\1\0\11\4\1\u01b9\5\4\11\0\3\4"+
+    "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+    "\4\0\2\4\1\0\21\4\4\0\7\4\1\0\4\4"+
+    "\1\u01b6\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\4\0\7\4\1\0\1\u01b8\16\4\11\0\3\4\2\0"+
+    "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+
+    "\2\4\1\0\21\4\4\0\7\4\1\0\14\4\1\u01ba"+
+    "\2\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+
+    "\1\4\1\0\3\4\4\0\2\4\1\0\21\4\15\0"+
+    "\1\u01bb\120\0\1\u01bc\1\u01bd\1\0\1\u01be\110\0\1\u01bf"+
+    "\1\0\1\u01c0\114\0\1\u01c1\116\0\1\u01c2\120\0\1\u01c3"+
+    "\76\0\1\4\6\5\1\0\13\5\1\u01c4\3\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\303\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\336\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\2\5\1\u01c5\1\5\1\u01c6"+
+    "\12\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\127"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\132"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\u01c7"+
+    "\15\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\2\5\1\200"+
+    "\1\5\1\u0182\1\323\1\u0183\1\u01c8\1\5\1\u0185\1\5"+
+    "\1\u0187\3\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u01c9\1\0\3\5\1\u0189\15\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\u01ca\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\14\5\1\u01cb\2\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\10\5\1\u01cc\6\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\5\5\1\307\11\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\15\0\1\u014c\174\0"+
+    "\1\u01cd\50\0\1\u01ce\146\0\1\u01cf\52\0\1\u0150\174\0"+
+    "\1\u01d0\50\0\1\u01d1\146\0\1\u01d2\41\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\16\5\1\u01d3\2\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\1\5\1\u01d3\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\13\5\1\u01d3\5\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\15\5\1\u01d3\3\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\11\5\1\u01d4\7\5\4\0\3\75\1\u0158\1\75"+
+    "\1\u0158\1\75\1\0\2\75\1\277\2\75\1\277\11\75"+
+    "\11\0\1\75\1\u0158\1\75\2\0\2\75\1\u0158\2\0"+
+    "\1\75\1\277\1\0\1\277\1\0\3\75\4\0\2\75"+
+    "\1\0\5\75\2\u0158\12\75\7\0\1\u0158\1\0\1\u0158"+
+    "\33\0\1\u0158\5\0\1\u0158\26\0\2\u0158\16\0\1\4"+
+    "\6\5\1\0\12\5\1\u01d5\4\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\307\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\5\5\1\u0141\11\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\16\5\1\u01d6\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\10\5\1\303\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\3\5\1\u01d7\13\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\7\5\1\u0196\7\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\10\5\1\u0163\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\u01d8\10\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\7\5\1\303\7\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\336\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\1\5\1\303\17\5\4\0\1\4\6\5\1\0\13\5"+
+    "\1\173\3\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\13\5"+
+    "\1\323\3\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\13\5"+
+    "\1\303\3\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\4\5"+
+    "\1\u01d9\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\4\5"+
+    "\1\u019a\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\6\5"+
+    "\1\303\2\5\1\303\5\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\1\u01da\20\5\4\0\1\4"+
+    "\6\5\1\0\6\5\1\303\2\5\1\303\1\5\1\173"+
+    "\3\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\1\u01da\20\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0140"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\4\5\1\307"+
+    "\12\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\15\5\1\u01a0"+
+    "\1\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\1\u01db"+
+    "\20\5\4\0\1\4\6\5\1\0\14\5\1\u01dc\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\u01dd\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\13\5\1\u01db\3\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\3\5\1\u01de\13\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u01df\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u01e0\6\5\1\u01e1"+
+    "\3\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\u01e2"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u01e3"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\7\5"+
+    "\1\u017f\11\5\4\0\1\4\6\5\1\0\5\5\1\u01e4"+
+    "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\2\5\1\303\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\10\5\1\u01e5\6\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\1\5\1\u017e\1\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\12\5\1\315\4\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\16\5\1\u0168\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u0128\12\5\1\u0102"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u01e6"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\u01e7"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\13\5\1\u0112"+
+    "\3\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0163\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\u01e8\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\6\5"+
+    "\1\u01e9\1\5\1\333\2\5\1\u01ea\1\311\1\5\1\u0168"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\u0163\1\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\u01eb"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\1\5\1\u01ec\1\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u01ed"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\2\5\1\u01ee"+
+    "\14\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u01ef"+
+    "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\u01f0"+
+    "\15\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\u01f1\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\6\5\1\u01f2\10\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\1\u0140\2\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u01f3\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\14\5\1\u01f4\2\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\7\5\1\u01f5\7\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\u01f6\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\3\5\1\u01f7\13\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\u01b1\6\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\127\1\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\4\5\1\127\12\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\15\5\1\u01f8\1\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\u01f9\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\15\5\1\127\1\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\315\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\14\5\1\u015b\2\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\u01fa\15\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\3\5\1\u01fb\13\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\u01fc"+
+    "\1\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\u019e\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\311\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\5\5\1\303\13\5\4\0\1\4\6\5\1\0\4\5"+
+    "\1\352\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\311\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\13\5"+
+    "\1\u01ea\2\5\1\u0168\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\u0163\1\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\1\5\1\u014a"+
+    "\1\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\4\5\1\u01a0\12\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u01a8\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\10\5\1\u01fd\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\3\u011d\4\211\1\u011d"+
+    "\3\211\6\u011d\1\211\2\u011d\1\211\6\u011d\1\213\5\u011d"+
+    "\1\211\1\u011d\1\0\2\u011d\2\211\5\u011d\1\211\20\u011d"+
+    "\2\211\2\u011d\2\211\5\u011d\1\211\4\u011d\3\216\4\43"+
+    "\1\216\3\43\6\216\1\43\2\216\1\43\13\216\1\u0125"+
+    "\1\43\2\216\1\u0126\1\216\2\43\5\216\1\43\20\216"+
+    "\2\43\2\216\2\43\5\216\1\43\4\216\1\4\6\5"+
+    "\1\0\12\5\1\u01fe\4\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\253\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u01ff\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\u0200\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\u0201\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\1\5\1\127\17\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\303\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\7\75\1\0\12\75\1\u0202"+
+    "\4\75\11\0\3\75\2\0\3\75\2\0\1\u0202\1\75"+
+    "\1\0\1\75\1\0\3\75\4\0\2\75\1\0\21\75"+
+    "\4\0\7\75\1\0\5\75\1\u0202\11\75\11\0\3\75"+
+    "\2\0\3\75\2\0\1\75\1\u0202\1\0\1\75\1\0"+
+    "\3\75\4\0\2\75\1\0\21\75\4\0\7\4\1\0"+
+    "\3\4\1\u01b5\13\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\2\4\1\u0203\14\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\1\4\1\u0203\15\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\10\4\1\u0204\6\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\1\4\1\u01b5\15\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\5\4\1\u0205\11\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\15\4\1\u0206\1\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\16\0\1\u013c\113\0\1\u0207\120\0\1\u0208\2\0"+
+    "\1\u0209\116\0\1\u020a\106\0\1\u020b\3\0\1\u01c2\122\0"+
+    "\1\u020c\110\0\1\u0209\111\0\1\u020b\131\0\1\u020d\71\0"+
+    "\1\4\6\5\1\0\5\5\1\u019b\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\3\5\1\u020e\13\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\14\5\1\u01f0\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\u020f\2\5\1\u01d9\1\u0210\12\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\11\5\1\u01e8\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0211"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u0212"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u0213"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\7\5\1\u0214"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\16\5\1\u0215"+
+    "\11\0\1\4\2\5\2\0\1\5\1\303\1\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\36\0\1\u0216\101\0\1\u014c\51\0"+
+    "\1\u01cd\26\0\1\u01cf\1\u0217\4\u01cf\1\u0217\17\u01cf\3\u0217"+
+    "\1\u01cf\1\u0217\2\0\2\u0217\1\0\2\u01cf\2\0\3\u01cf"+
+    "\1\0\1\u0217\2\u01cf\1\u0217\1\u01cf\1\0\1\u0217\1\u01cf"+
+    "\5\u0217\2\u01cf\1\u0217\21\u01cf\2\0\1\u0217\33\0\1\u0218"+
+    "\101\0\1\u0150\51\0\1\u01d0\26\0\1\u01d2\1\u0219\4\u01d2"+
+    "\1\u0219\17\u01d2\3\u0219\1\u01d2\1\u0219\2\0\2\u0219\1\0"+
+    "\2\u01d2\2\0\3\u01d2\1\0\1\u0219\2\u01d2\1\u0219\1\u01d2"+
+    "\1\0\1\u0219\1\u01d2\5\u0219\2\u01d2\1\u0219\21\u01d2\2\0"+
+    "\1\u0219\1\0\1\4\5\5\1\u021a\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\20\5\1\u021a\4\0"+
+    "\1\4\6\5\1\0\5\5\1\u01eb\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\3\5\1\u021b\13\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\11\5\1\u021c\5\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\127\16\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\6\5\1\303\2\5\1\303\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u0163\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\11\5\1\u0140\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\7\5\1\u0102\7\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\311\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\11\5\1\311\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\12\5\1\u01f0\4\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\u021d\1\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\u01d8\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\u021e\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\u021f\15\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\163\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\11\5\1\u0220\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\2\5\1\127\14\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\13\5\1\u01ea\1\311\1\5"+
+    "\1\u0168\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\u0163\1\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\13\5\1\u0112\3\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\2\5\1\303"+
+    "\16\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\127\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\7\5\1\u0165\7\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\303\4\5\1\303\4\5"+
+    "\1\u0102\4\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\1\5\1\303\17\5\4\0\1\4\6\5"+
+    "\1\0\7\5\1\u01f0\7\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\11\5\1\u01f6\5\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\16\5\1\303\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\u0221\15\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0222\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0223"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\u0224\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u0225\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\1\5\1\u0226\4\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\4\5\1\u0227\12\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\4\5\1\u0228\12\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\11\5\1\303\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\1\u01b1\20\5\4\0\1\4\6\5\1\0\11\5\1\u0229"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\127"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\u0163"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\1\u022a"+
+    "\20\5\4\0\1\4\6\5\1\0\14\5\1\u022b\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\14\5\1\151\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\15\5\1\303\1\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\11\5\1\u01d8\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\7\4\1\0\7\4\1\u0203\7\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\12\4\1\u022c\4\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\16\4\1\u022d\11\0\3\4"+
+    "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+    "\4\0\2\4\1\0\21\4\17\0\1\u0208\114\0\1\u022e"+
+    "\114\0\1\u022e\124\0\1\u022f\106\0\1\u0208\121\0\1\u0230"+
+    "\125\0\1\u0231\70\0\1\4\6\5\1\0\5\5\1\u0140"+
+    "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\u01e6"+
+    "\15\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\u0232"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u0233"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\303\4\5"+
+    "\1\303\4\5\1\u0102\3\5\1\136\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\1\5\1\303\17\5"+
+    "\4\0\1\4\6\5\1\0\16\5\1\u0215\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\1\5\1\u0164\4\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\1\5\1\303\1\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\36\0"+
+    "\1\u01cf\115\0\1\u01d2\63\0\1\4\1\5\1\u0234\4\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\u0235\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\u01eb\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+    "\1\303\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+    "\1\u0236\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\u0237\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+    "\1\u020e\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\u0238\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\u0239\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+    "\1\315\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+    "\1\u0239\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\u0163\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\u023a\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\12\5"+
+    "\1\307\4\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\u0128\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u023b"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\330"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\5\5\1\127"+
+    "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\7\4\1\0\1\u01b6\16\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\14\4\1\u0203\2\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\23\0\1\u022e\120\0\1\u023c\121\0\1\u023d\67\0"+
+    "\1\4\6\5\1\0\16\5\1\307\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\16\5\1\136\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\1\5"+
+    "\1\u023e\4\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\11\5\1\307\5\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\10\5\1\u01a2\6\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\13\5\1\u023f\3\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\7\5\1\127\7\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\14\5\1\u0240\2\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\1\5\1\u01d9\15\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\14\0\1\u0209\131\0"+
+    "\1\u022e\71\0\1\4\6\5\1\0\7\5\1\u0241\7\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\6\5\1\u01eb\10\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u0242\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\u0235\1\0\21\5"+
+    "\4\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[42978];
+    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 =
+    "\3\0\26\1\1\11\4\1\1\11\2\1\1\11\6\1"+
+    "\1\11\1\1\1\11\7\1\1\11\5\1\1\11\114\1"+
+    "\1\0\2\11\2\1\1\11\3\1\1\11\20\1\1\0"+
+    "\14\1\2\0\1\11\6\0\6\1\1\0\141\1\1\11"+
+    "\7\1\1\11\22\1\6\0\14\1\10\0\6\1\1\0"+
+    "\141\1\4\0\1\1\4\0\11\1\2\0\1\1\2\0"+
+    "\65\1\7\0\10\1\4\0\24\1\1\11\3\0\12\1"+
+    "\2\0\5\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[578];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CPlusPlusTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 CPlusPlusTokenMaker(java.io.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 CPlusPlusTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 184) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 27: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 30: break;
+        case 7: 
+          { addNullToken(); return firstToken;
+          }
+        case 31: break;
+        case 24: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 32: break;
+        case 21: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 33: break;
+        case 17: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 34: break;
+        case 9: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 35: break;
+        case 26: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 36: break;
+        case 18: 
+          { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/
+          }
+        case 37: break;
+        case 25: 
+          { addToken(Token.ERROR_STRING_DOUBLE);
+          }
+        case 38: break;
+        case 14: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 39: break;
+        case 15: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 40: break;
+        case 5: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 41: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 42: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 43: break;
+        case 16: 
+          { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+          }
+        case 44: break;
+        case 22: 
+          { addToken(Token.FUNCTION);
+          }
+        case 45: break;
+        case 6: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 46: break;
+        case 8: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 47: break;
+        case 23: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 48: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 49: break;
+        case 19: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 50: break;
+        case 20: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 51: break;
+        case 29: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 52: break;
+        case 28: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 53: break;
+        case 13: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 54: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 55: break;
+        case 4: 
+          { addToken(Token.OPERATOR);
+          }
+        case 56: break;
+        case 10: 
+          { 
+          }
+        case 57: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 58: 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 579: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 580: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 581: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.flex
new file mode 100644
index 0000000..f87ac99
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.flex
@@ -0,0 +1,413 @@
+/*
+ * 09/03/2005
+ *
+ * CSSTokenMaker.java - Token maker for CSS 3 files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class splits up text into tokens representing a CSS 3 file.  It's
+ * written with a few extra internal states so that it can easily be copy
+ * and pasted into HTML, PHP, and JSP TokenMakres when it is updated.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated CSSTokenMaker.java</code> file will contain 2
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+%%
+
+%public
+%class CSSTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Internal type denoting a line ending in a CSS property.
+	 */
+	public static final int INTERNAL_CSS_PROPERTY			= -1;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property value.
+	 */
+	public static final int INTERNAL_CSS_VALUE				= -2;
+
+	/**
+	 * Internal type denoting line ending in a CSS double-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_STRING				= -(1<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS single-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_CHAR				= -(2<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS multi-line comment.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_MLC				= -(3<<11);
+
+	/**
+	 * The state previous CSS-related state we were in before going into a CSS
+	 * string, multi-line comment, etc.
+	 */
+	private int cssPrevState;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CSSTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns <code>true</code> since CSS uses curly braces.
+	 *
+	 * @return <code>true</code> always.
+	 */
+	public boolean getCurlyBracesDenoteCodeBlocks() {
+		return true;
+	}
+
+
+	/**
+	 * 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;
+		cssPrevState = YYINITIAL; // Shouldn't be necessary
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = CSS_STRING;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CSS_CHAR_LITERAL;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = CSS_C_STYLE_COMMENT;
+				break;
+			case INTERNAL_CSS_PROPERTY:
+				state = CSS_PROPERTY;
+				break;
+			case INTERNAL_CSS_VALUE:
+				state = CSS_VALUE;
+				break;
+			default:
+				if (initialTokenType<-1024) {
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_CSS_STRING:
+							state = CSS_STRING;
+							break;
+						case INTERNAL_CSS_CHAR:
+							state = CSS_CHAR_LITERAL;
+							break;
+						case INTERNAL_CSS_MLC:
+							state = CSS_C_STYLE_COMMENT;
+							break;
+					}
+					cssPrevState = -initialTokenType&0xff;
+				}
+				else {
+					state = Token.NULL;
+				}
+		}
+
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.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;
+	}
+
+
+%}
+
+Digit						= ([0-9])
+Letter						= ([A-Za-z])
+LetterOrUnderscore			= ({Letter}|[_])
+LetterOrUnderscoreOrDash	= ({LetterOrUnderscore}|[\-])
+
+CSS_SelectorPiece			= (("*"|"."|{LetterOrUnderscoreOrDash})({LetterOrUnderscoreOrDash}|"."|{Digit})*)
+CSS_PseudoClass				= (":"("root"|"nth-child"|"nth-last-child"|"nth-of-type"|"nth-last-of-type"|"first-child"|"last-child"|"first-of-type"|"last-of-type"|"only-child"|"only-of-type"|"empty"|"link"|"visited"|"active"|"hover"|"focus"|"target"|"lang"|"enabled"|"disabled"|"checked"|":first-line"|":first-letter"|":before"|":after"|"not"))
+CSS_AtKeyword				= ("@"{CSS_SelectorPiece})
+CSS_Id						= ("#"{CSS_SelectorPiece})
+CSS_Separator				= ([;\(\)\[\]])
+WhiteSpace					= ([ \t]+)
+MlcStart					= ("/*")
+MlcEnd						= ("*/")
+
+CSS_Property				= ([\*]?{LetterOrUnderscoreOrDash}({LetterOrUnderscoreOrDash}|{Digit})*)
+CSS_ValueChar				= ({LetterOrUnderscoreOrDash}|[\\/])
+CSS_Value					= ({CSS_ValueChar}*)
+CSS_Function				= ({CSS_Value}\()
+CSS_Digits					= ([\-]?{Digit}+([0-9\.]+)?(pt|pc|in|mm|cm|em|ex|px|ms|s|%)?)
+CSS_Hex						= ("#"[0-9a-fA-F]+)
+CSS_Number					= ({CSS_Digits}|{CSS_Hex})
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state CSS_PROPERTY
+%state CSS_VALUE
+%state CSS_STRING
+%state CSS_CHAR_LITERAL
+%state CSS_C_STYLE_COMMENT
+
+
+%%
+
+<YYINITIAL> {
+	{CSS_SelectorPiece}	{ addToken(Token.DATA_TYPE); }
+	{CSS_PseudoClass}	{ addToken(Token.RESERVED_WORD); }
+	":"					{ /* Unknown pseudo class */ addToken(Token.DATA_TYPE); }
+	{CSS_AtKeyword}		{ addToken(Token.REGEX); }
+	{CSS_Id}			{ addToken(Token.VARIABLE); }
+	"{"					{ addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY); }
+	[,]					{ addToken(Token.IDENTIFIER); }
+	\"					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+	\'					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+	[+>~\^$\|=]			{ addToken(Token.OPERATOR); }
+	{CSS_Separator}		{ addToken(Token.SEPARATOR); }
+	{WhiteSpace}		{ addToken(Token.WHITESPACE); }
+	{MlcStart}			{ start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+	.					{ /*System.out.println("yyinitial: " + yytext());*/ addToken(Token.IDENTIFIER); }
+	"\n" |
+	<<EOF>>				{ addNullToken(); return firstToken; }
+}
+
+<CSS_PROPERTY> {
+	{CSS_Property}		{ addToken(Token.RESERVED_WORD); }
+	"}"					{ addToken(Token.SEPARATOR); yybegin(YYINITIAL); }
+	":"					{ addToken(Token.OPERATOR); yybegin(CSS_VALUE); }
+	{WhiteSpace}		{ addToken(Token.WHITESPACE); }
+	{MlcStart}			{ start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+	.					{ /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER); }
+	"\n" |
+	<<EOF>>				{ addEndToken(INTERNAL_CSS_PROPERTY); return firstToken; }
+}
+
+<CSS_VALUE> {
+	{CSS_Value}			{ addToken(Token.IDENTIFIER); }
+	"!important"		{ addToken(Token.ANNOTATION); }
+	{CSS_Function}		{ int temp = zzMarkedPos - 2;
+						  addToken(zzStartRead, temp, Token.FUNCTION);
+						  addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+						  zzStartRead = zzCurrentPos = zzMarkedPos;
+						}
+	{CSS_Number}		{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	\"					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+	\'					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+	")"					{ /* End of a function */ addToken(Token.SEPARATOR); }
+	[;]					{ addToken(Token.OPERATOR); yybegin(CSS_PROPERTY); }
+	[,\.]				{ addToken(Token.IDENTIFIER); }
+	"}"					{ addToken(Token.SEPARATOR); yybegin(YYINITIAL); }
+	{WhiteSpace}		{ addToken(Token.WHITESPACE); }
+	{MlcStart}			{ start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+	.					{ /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER); }
+	"\n" |
+	<<EOF>>				{ addEndToken(INTERNAL_CSS_VALUE); return firstToken; }
+}
+
+<CSS_STRING> {
+	[^\n\\\"]+			{}
+	\\.?				{ /* Skip escaped chars. */ }
+	\"					{ addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState); }
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken; }
+}
+
+<CSS_CHAR_LITERAL> {
+	[^\n\\\']+			{}
+	\\.?				{ /* Skip escaped chars. */ }
+	\'					{ addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState); }
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken; }
+}
+
+<CSS_C_STYLE_COMMENT> {
+	[^hwf\n\*]+			{}
+	{URL}				{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]				{}
+	{MlcEnd}			{ addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState); }
+	\*					{}
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.java
new file mode 100644
index 0000000..71519a8
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.java
@@ -0,0 +1,976 @@
+/* The following code was generated by JFlex 1.4.1 on 2/12/12 12:51 AM */
+
+/*
+ * 09/03/2005
+ *
+ * CSSTokenMaker.java - Token maker for CSS 3 files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class splits up text into tokens representing a CSS 3 file.  It's
+ * written with a few extra internal states so that it can easily be copy
+ * and pasted into HTML, PHP, and JSP TokenMakres when it is updated.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated CSSTokenMaker.java</code> file will contain 2
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+
+public class CSSTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int CSS_C_STYLE_COMMENT = 5;
+  public static final int YYINITIAL = 0;
+  public static final int CSS_STRING = 3;
+  public static final int CSS_VALUE = 2;
+  public static final int CSS_PROPERTY = 1;
+  public static final int CSS_CHAR_LITERAL = 4;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\40\1\61\25\0\1\40\1\63\1\56\1\36\1\52\1\45"+
+    "\1\47\1\57\1\43\1\64\1\5\1\51\1\55\1\4\1\6\1\41"+
+    "\12\1\1\7\1\37\1\0\1\51\1\60\1\47\1\35\6\46\24\2"+
+    "\1\50\1\42\1\50\1\60\1\3\1\0\1\21\1\34\1\15\1\20"+
+    "\1\26\1\23\1\33\1\14\1\16\1\2\1\30\1\17\1\27\1\13"+
+    "\1\11\1\25\1\2\1\10\1\22\1\12\1\32\1\31\1\53\1\44"+
+    "\1\24\1\2\1\54\1\60\1\62\1\51\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\1\1\3\0\1\2\1\3\1\4\2\2\1\5"+
+    "\1\6\1\2\1\7\1\10\1\1\1\11\1\12\1\13"+
+    "\1\14\1\15\1\14\1\16\1\14\1\17\1\20\1\21"+
+    "\1\22\2\1\1\21\1\23\1\1\1\24\1\25\1\21"+
+    "\1\26\1\27\1\30\1\31\1\32\1\27\1\33\1\34"+
+    "\5\27\1\35\15\0\1\36\1\37\1\40\2\0\1\22"+
+    "\3\0\1\22\1\0\1\30\1\41\41\0\1\15\17\0"+
+    "\1\42\47\0\1\43";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[167];
+    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\65\0\152\0\237\0\324\0\u0109\0\u013e\0\u0173"+
+    "\0\u01a8\0\u01dd\0\u0212\0\u013e\0\u0247\0\u027c\0\u013e\0\u013e"+
+    "\0\u013e\0\u013e\0\u013e\0\u013e\0\u013e\0\u02b1\0\u02e6\0\u013e"+
+    "\0\u027c\0\u013e\0\u013e\0\u013e\0\u031b\0\u0350\0\u0385\0\u03ba"+
+    "\0\u013e\0\u03ef\0\u013e\0\u013e\0\u0424\0\u013e\0\u0459\0\u048e"+
+    "\0\u013e\0\u013e\0\u04c3\0\u013e\0\u013e\0\u04f8\0\u052d\0\u0562"+
+    "\0\u0597\0\u05cc\0\u013e\0\u0601\0\u0636\0\u066b\0\u06a0\0\u06d5"+
+    "\0\u070a\0\u073f\0\u0774\0\u07a9\0\u07de\0\u0813\0\u0848\0\u087d"+
+    "\0\u08b2\0\u08e7\0\u013e\0\u091c\0\u0951\0\u013e\0\u0986\0\u09bb"+
+    "\0\u09f0\0\u03ba\0\u0a25\0\u013e\0\u013e\0\u0a5a\0\u0a8f\0\u0ac4"+
+    "\0\u0af9\0\u0b2e\0\u0b63\0\u0b98\0\u0bcd\0\u0c02\0\u0c37\0\u0c6c"+
+    "\0\u0ca1\0\u0cd6\0\u0d0b\0\u0d40\0\u0d75\0\u0daa\0\u0ddf\0\u0e14"+
+    "\0\u0e49\0\u0e7e\0\u0eb3\0\u0ee8\0\u0f1d\0\u0f52\0\u0f87\0\u0fbc"+
+    "\0\u0ff1\0\u1026\0\u105b\0\u1090\0\u10c5\0\u10fa\0\u013e\0\u112f"+
+    "\0\u1164\0\u1199\0\u11ce\0\u1203\0\u1238\0\u126d\0\u12a2\0\u12d7"+
+    "\0\u130c\0\u1341\0\u1376\0\u13ab\0\u13e0\0\u1415\0\u144a\0\u147f"+
+    "\0\u14b4\0\u14e9\0\u151e\0\u1553\0\u1588\0\u15bd\0\u15f2\0\u1627"+
+    "\0\u165c\0\u1691\0\u16c6\0\u16fb\0\u1730\0\u144a\0\u1765\0\u179a"+
+    "\0\u17cf\0\u1804\0\u1839\0\u186e\0\u18a3\0\u18d8\0\u190d\0\u1942"+
+    "\0\u1977\0\u19ac\0\u19e1\0\u1a16\0\u1a4b\0\u1a80\0\u1ab5\0\u1aea"+
+    "\0\u1b1f\0\u1b54\0\u1b89\0\u1bbe\0\u1bf3\0\u1c28\0\u013e";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[167];
+    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 =
+    "\2\7\5\10\1\11\25\10\1\12\1\13\1\14\1\15"+
+    "\1\16\1\7\1\14\1\10\1\7\1\10\1\7\1\14"+
+    "\2\17\1\10\1\20\1\21\1\22\1\23\1\17\1\24"+
+    "\2\7\1\14\2\25\3\26\1\27\1\25\1\30\25\26"+
+    "\3\25\1\15\1\31\2\25\1\26\1\25\1\26\4\25"+
+    "\1\26\5\25\1\32\1\33\2\25\1\34\1\35\2\36"+
+    "\1\37\1\34\1\21\1\34\25\36\1\34\1\40\1\41"+
+    "\1\15\1\42\1\36\1\43\1\36\1\34\1\36\4\34"+
+    "\1\36\1\34\1\21\1\22\1\23\1\34\1\44\1\33"+
+    "\1\45\1\46\42\47\1\50\13\47\1\51\2\47\1\52"+
+    "\3\47\42\53\1\50\14\53\1\54\1\53\1\55\3\53"+
+    "\5\56\1\57\6\56\1\60\6\56\1\61\27\56\1\62"+
+    "\5\56\1\63\3\56\66\0\4\10\1\0\1\10\1\0"+
+    "\25\10\7\0\1\10\1\0\1\10\4\0\1\10\20\0"+
+    "\1\64\1\65\1\66\1\67\1\70\1\71\1\72\1\0"+
+    "\1\73\1\74\1\75\1\0\1\76\2\0\1\77\2\0"+
+    "\1\100\35\0\5\101\1\0\25\101\7\0\1\101\1\0"+
+    "\1\101\4\0\1\101\13\0\5\102\1\0\25\102\7\0"+
+    "\1\102\1\0\1\102\4\0\1\102\51\0\1\15\31\0"+
+    "\1\103\60\0\4\26\3\0\25\26\7\0\1\26\1\0"+
+    "\1\26\4\0\1\26\13\0\3\26\3\0\25\26\7\0"+
+    "\1\26\1\0\1\26\4\0\1\26\12\0\1\35\4\0"+
+    "\1\35\6\0\1\104\1\105\3\0\1\106\2\0\1\107"+
+    "\1\110\1\111\15\0\1\106\21\0\3\36\3\0\25\36"+
+    "\4\0\2\36\1\43\1\36\1\0\1\36\4\0\1\36"+
+    "\12\0\1\35\3\36\3\0\25\36\4\0\2\36\1\43"+
+    "\1\36\1\0\1\36\4\0\1\36\12\0\1\112\13\0"+
+    "\1\112\2\0\2\112\1\0\1\112\2\0\1\112\5\0"+
+    "\1\112\11\0\1\112\20\0\3\36\1\103\2\0\25\36"+
+    "\4\0\2\36\1\43\1\36\1\0\1\36\4\0\1\36"+
+    "\27\0\1\113\46\0\42\47\1\0\13\47\1\0\2\47"+
+    "\1\0\3\47\61\114\1\0\3\114\42\53\1\0\14\53"+
+    "\1\0\1\53\1\0\3\53\5\56\1\0\6\56\1\0"+
+    "\6\56\1\0\27\56\1\0\5\56\1\0\3\56\41\0"+
+    "\1\115\35\0\1\116\64\0\1\117\3\0\1\120\121\0"+
+    "\1\121\32\0\1\122\1\0\1\123\10\0\1\124\41\0"+
+    "\1\125\66\0\1\126\72\0\1\127\54\0\1\130\1\131"+
+    "\63\0\1\132\67\0\1\133\66\0\1\134\2\0\1\135"+
+    "\61\0\1\136\63\0\1\137\60\0\1\140\4\0\1\141"+
+    "\61\0\1\142\13\0\1\143\53\0\1\144\47\0\4\101"+
+    "\1\0\1\101\1\0\25\101\7\0\1\101\1\0\1\101"+
+    "\4\0\1\101\12\0\4\102\1\0\1\102\1\0\25\102"+
+    "\7\0\1\102\1\0\1\102\4\0\1\102\40\0\1\106"+
+    "\50\0\1\106\63\0\1\106\2\0\1\106\26\0\1\106"+
+    "\47\0\1\106\14\0\1\106\42\0\1\106\4\0\1\106"+
+    "\64\0\1\145\47\0\1\146\77\0\1\147\56\0\1\150"+
+    "\120\0\1\151\34\0\1\152\57\0\1\153\74\0\1\154"+
+    "\47\0\1\130\72\0\1\155\55\0\1\156\66\0\1\157"+
+    "\66\0\1\160\101\0\1\161\61\0\1\162\51\0\1\163"+
+    "\64\0\1\164\6\0\1\165\64\0\1\142\54\0\1\166"+
+    "\67\0\1\167\57\0\1\170\75\0\1\171\70\0\1\172"+
+    "\61\0\1\173\67\0\1\174\64\0\1\175\46\0\1\176"+
+    "\103\0\1\147\44\0\1\177\70\0\1\161\62\0\1\200"+
+    "\77\0\1\201\65\0\1\202\73\0\1\203\35\0\1\204"+
+    "\106\0\1\205\53\0\1\206\77\0\1\157\67\0\1\157"+
+    "\43\0\1\202\70\0\1\207\100\0\1\210\54\0\1\165"+
+    "\76\0\1\211\42\0\1\212\70\0\1\213\57\0\1\214"+
+    "\62\0\1\176\12\0\1\147\103\0\1\215\24\0\2\177"+
+    "\5\216\25\177\3\216\1\0\1\177\1\0\1\216\1\177"+
+    "\1\216\1\177\3\216\2\177\1\0\1\216\1\0\1\216"+
+    "\3\0\2\216\22\0\1\217\53\0\1\220\57\0\1\221"+
+    "\106\0\1\130\47\0\1\222\3\0\1\223\1\0\1\224"+
+    "\55\0\1\157\104\0\1\225\65\0\1\226\55\0\1\157"+
+    "\61\0\1\225\71\0\1\157\52\0\1\225\62\0\1\227"+
+    "\115\0\1\177\35\0\1\230\62\0\1\226\65\0\1\222"+
+    "\3\0\1\223\72\0\1\231\55\0\1\232\71\0\1\170"+
+    "\71\0\1\233\64\0\1\157\50\0\1\234\56\0\1\235"+
+    "\64\0\1\236\76\0\1\237\66\0\1\157\65\0\1\240"+
+    "\62\0\1\241\57\0\1\242\71\0\1\233\60\0\1\243"+
+    "\67\0\1\244\7\0\1\245\62\0\1\246\52\0\1\247"+
+    "\65\0\1\226\63\0\1\152\77\0\1\226\37\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[7261];
+    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\1\3\0\1\11\4\1\1\11\2\1\7\11"+
+    "\2\1\1\11\1\1\3\11\4\1\1\11\1\1\2\11"+
+    "\1\1\1\11\2\1\2\11\1\1\2\11\5\1\1\11"+
+    "\15\0\2\1\1\11\2\0\1\11\3\0\1\1\1\0"+
+    "\2\11\41\0\1\11\17\0\1\1\47\0\1\11";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[167];
+    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;
+
+  /* user code: */
+
+	/**
+	 * Internal type denoting a line ending in a CSS property.
+	 */
+	public static final int INTERNAL_CSS_PROPERTY			= -1;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property value.
+	 */
+	public static final int INTERNAL_CSS_VALUE				= -2;
+
+	/**
+	 * Internal type denoting line ending in a CSS double-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_STRING				= -(1<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS single-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_CHAR				= -(2<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS multi-line comment.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_MLC				= -(3<<11);
+
+	/**
+	 * The state previous CSS-related state we were in before going into a CSS
+	 * string, multi-line comment, etc.
+	 */
+	private int cssPrevState;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CSSTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns <code>true</code> since CSS uses curly braces.
+	 *
+	 * @return <code>true</code> always.
+	 */
+	public boolean getCurlyBracesDenoteCodeBlocks() {
+		return true;
+	}
+
+
+	/**
+	 * 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;
+		cssPrevState = YYINITIAL; // Shouldn't be necessary
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = CSS_STRING;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CSS_CHAR_LITERAL;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = CSS_C_STYLE_COMMENT;
+				break;
+			case INTERNAL_CSS_PROPERTY:
+				state = CSS_PROPERTY;
+				break;
+			case INTERNAL_CSS_VALUE:
+				state = CSS_VALUE;
+				break;
+			default:
+				if (initialTokenType<-1024) {
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_CSS_STRING:
+							state = CSS_STRING;
+							break;
+						case INTERNAL_CSS_CHAR:
+							state = CSS_CHAR_LITERAL;
+							break;
+						case INTERNAL_CSS_MLC:
+							state = CSS_C_STYLE_COMMENT;
+							break;
+					}
+					cssPrevState = -initialTokenType&0xff;
+				}
+				else {
+					state = Token.NULL;
+				}
+		}
+
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 CSSTokenMaker(java.io.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 CSSTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 134) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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: 
+          { /* Unknown pseudo class */ addToken(Token.DATA_TYPE);
+          }
+        case 36: break;
+        case 11: 
+          { addNullToken(); return firstToken;
+          }
+        case 37: break;
+        case 27: 
+          { addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState);
+          }
+        case 38: break;
+        case 15: 
+          { addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+          }
+        case 39: break;
+        case 22: 
+          { /* End of a function */ addToken(Token.SEPARATOR);
+          }
+        case 40: break;
+        case 6: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 41: break;
+        case 2: 
+          { /*System.out.println("yyinitial: " + yytext());*/ addToken(Token.IDENTIFIER);
+          }
+        case 42: break;
+        case 32: 
+          { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT);
+          }
+        case 43: break;
+        case 14: 
+          { addToken(Token.OPERATOR); yybegin(CSS_VALUE);
+          }
+        case 44: break;
+        case 13: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 45: break;
+        case 31: 
+          { addToken(Token.VARIABLE);
+          }
+        case 46: break;
+        case 5: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 47: break;
+        case 16: 
+          { addToken(Token.SEPARATOR); yybegin(YYINITIAL);
+          }
+        case 48: break;
+        case 26: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+          }
+        case 49: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 50: break;
+        case 19: 
+          { addToken(Token.OPERATOR); yybegin(CSS_PROPERTY);
+          }
+        case 51: break;
+        case 9: 
+          { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING);
+          }
+        case 52: break;
+        case 30: 
+          { addToken(Token.REGEX);
+          }
+        case 53: break;
+        case 12: 
+          { /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER);
+          }
+        case 54: break;
+        case 17: 
+          { /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER);
+          }
+        case 55: break;
+        case 33: 
+          { addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState);
+          }
+        case 56: break;
+        case 24: 
+          { /* Skip escaped chars. */
+          }
+        case 57: break;
+        case 3: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 58: break;
+        case 10: 
+          { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL);
+          }
+        case 59: break;
+        case 35: 
+          { addToken(Token.ANNOTATION);
+          }
+        case 60: break;
+        case 25: 
+          { addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState);
+          }
+        case 61: break;
+        case 20: 
+          { int temp = zzMarkedPos - 2;
+						  addToken(zzStartRead, temp, Token.FUNCTION);
+						  addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+						  zzStartRead = zzCurrentPos = zzMarkedPos;
+          }
+        case 62: break;
+        case 8: 
+          { addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY);
+          }
+        case 63: break;
+        case 28: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+          }
+        case 64: break;
+        case 34: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 65: break;
+        case 21: 
+          { addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+          }
+        case 66: break;
+        case 29: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+          }
+        case 67: break;
+        case 18: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 68: break;
+        case 7: 
+          { addToken(Token.OPERATOR);
+          }
+        case 69: break;
+        case 23: 
+          { 
+          }
+        case 70: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case CSS_C_STYLE_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+            }
+            case 168: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 169: break;
+            case CSS_STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+            }
+            case 170: break;
+            case CSS_VALUE: {
+              addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+            }
+            case 171: break;
+            case CSS_PROPERTY: {
+              addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+            }
+            case 172: break;
+            case CSS_CHAR_LITERAL: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+            }
+            case 173: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.flex
new file mode 100644
index 0000000..e8d7d09
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.flex
@@ -0,0 +1,517 @@
+/*
+ * 11/13/2004
+ *
+ * CSharpTokenMaker.java - An object that can take a chunk of text and return
+ * a linked list of tokens representing it in the C# programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A lexer for the C# programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated CSharpTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class CSharpTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CSharpTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = VERBATIMSTRING;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = DELIMITEDCOMMENT;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+	}
+
+
+%}
+
+/* C1.1 - Line terminators. */
+NewlineCharacter						= ([\n])
+
+/* C.1.2 - Whitespace. */
+Whitespace							= ([\t ]+)
+
+/* C.1.3 - Comments */
+InputCharacter							= ([^\n])
+InputCharacters						= ({InputCharacter}+)
+DocumentationCommentStart				= ("///")
+SingleLineComment						= ("//"([^/]{InputCharacters}?)?)
+DelimitedCommentStart					= ("/*")
+DelimitedCommentEnd						= ("*/")
+
+/* C.1.5 - Unicode character escape sequences. */
+UnicodeEscape1							= ("\\u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+UnicodeEscape2							= ("\\U"{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+UnicodeEscapeSequence					= ({UnicodeEscape1}|{UnicodeEscape2})
+
+/* C1.6 - Identifiers. */
+LetterCharacter						= ([A-Za-z])  /* Not accurate - many more Unicode letters, Unicode escapes */
+/*
+CombiningCharacter						= ()
+*/
+DecimalDigitCharacter					= ([0-9])
+ConnectingCharacter						= ([_\-])
+/*
+FormattingCharacter						= ()
+*/
+/*
+IdentifierPartCharacter					= ({LetterCharacter}|{DecimalDigitCharacter}|{ConnectingCharacter}|{CombiningCharacter}|{FormattingCharacter})
+*/
+IdentifierPartCharacter					= ({LetterCharacter}|{DecimalDigitCharacter}|{ConnectingCharacter})
+IdentifierPartCharacters					= ({IdentifierPartCharacter}+)
+IdentifierStartCharacter					= ({LetterCharacter}|[_])
+IdentifierOrKeyword						= ({IdentifierStartCharacter}{IdentifierPartCharacters}?)
+Identifier							= ("@"?{IdentifierOrKeyword})
+/* NOTE:  The two below aren't from the C# spec, but we add them so we can */
+/* highlight errors.                                                       */
+NonSeparator		= (([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\"))
+ErrorIdentifier						= ({NonSeparator}+)
+
+/* C1.8 - Literals. */
+BooleanLiteral							= ("true"|"false")
+DecimalDigit							= ([0-9])
+DecimalDigits							= ({DecimalDigit}+)
+IntegerTypeSuffix						= (([uU][lL]?)|([lL][uU]?))
+DecimalIntegerLiteral					= ({DecimalDigits}{IntegerTypeSuffix}?)
+HexDigit								= ([0-9A-Fa-f])
+HexDigits								= ({HexDigit}+)
+HexadecimalIntegerLiteral				= ("0"[xX]{HexDigits}{IntegerTypeSuffix}?)
+Sign									= ([+\-])
+ExponentPart							= ([eE]{Sign}?{DecimalDigits})
+RealTypeSuffix							= ([fFdDmM])
+RealHelper1							= ({DecimalDigits}"."{DecimalDigits}{ExponentPart}?{RealTypeSuffix}?)
+RealHelper2							= ("."{DecimalDigits}{ExponentPart}?{RealTypeSuffix}?)
+RealHelper3							= ({DecimalDigits}{ExponentPart}{RealTypeSuffix}?)
+RealHelper4							= ({DecimalDigits}{RealTypeSuffix})
+RealLiteral							= ({RealHelper1}|{RealHelper2}|{RealHelper3}|{RealHelper4})
+ErrorNumberFormat						= (({DecimalIntegerLiteral}|{HexadecimalIntegerLiteral}|{RealLiteral}){NonSeparator}+)
+SingleCharacter						= ([^\'\\\n])
+SimpleEscapeSequence					= ("\\"[\'\"\\0abfnrtv])
+HexadecimalEscapeSequence				= ("\\x"{HexDigit}{HexDigit}?{HexDigit}?{HexDigit}?)
+Character								= ({SingleCharacter}|{SimpleEscapeSequence}|{HexadecimalEscapeSequence}|{UnicodeEscapeSequence})
+UnclosedCharacterLiteral					= ("'"{Character})
+CharacterLiteral						= ({UnclosedCharacterLiteral}"'")
+ErrorUnclosedCharacterLiteral				= ("'"[^\'\n]*)
+ErrorCharacterLiteral					= ("''"|{ErrorUnclosedCharacterLiteral}[\'])
+QuoteEscapeSequence						= ("\"\"")
+SingleVerbatimStringLiteralCharacter		= ([^\"])
+VerbatimStringLiteralStart				= ("@\"")
+SingleRegularStringLiteralCharacter		= ([^\"\\\n])
+RegularStringLiteralCharacter				= ({SingleRegularStringLiteralCharacter}|{SimpleEscapeSequence}|{HexadecimalEscapeSequence}|{UnicodeEscapeSequence})
+RegularStringLiteralCharacters			= ({RegularStringLiteralCharacter}+)
+RegularStringLiteral					= ([\"]{RegularStringLiteralCharacters}?[\"])
+UnclosedRegularStringLiteral				= ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorRegularStringLiteral				= ({UnclosedRegularStringLiteral}[\"])
+
+/* C.1.9 - Operators and Punctuators. */
+OOPHelper1							= (":")
+OOPHelper2							= ("+"|"-"|"*"|"/"|"%"|"&"|"|"|"^"|"!"|"~")
+OOPHelper3							= ("="|"<"|">"|"?"|"++"|"--"|"&&"|"||"|"<<"|">>")
+OOPHelper4							= ("=="|"!="|"<="|">="|"+="|"-="|"*="|"/="|"%="|"&=")
+OOPHelper5							= ("|="|"^="|"<<="|">>="|"->")
+OperatorOrPunctuator					= ({OOPHelper1}|{OOPHelper2}|{OOPHelper3}|{OOPHelper4}|{OOPHelper5})
+/* NOTE:  We distinguish between operators and separators (punctuators), but */
+/* the C# spec doesn't, so the stuff below isn't in the spec.                */
+Separator								= ([\{\}\[\]\(\)])
+Separator2							= ([,;])
+
+/* C.1.10 - Pre-processing Directives. */
+/* NOTE:  We don't do ALL of the PP stuff here as it's unnecessary  */
+/* for us to know the difference between declarations, diagnostics, */
+/* regions, etc.                                                    */
+ConditionalSymbol						= ({IdentifierOrKeyword})	/* Not correct - excludes "true" and "false". */
+PPNewLine								= ({Whitespace}?{SingleLineComment}?{NewlineCharacter})
+PPPrimaryExpression						= ({IdentifierOrKeyword}|({Whitespace}?{PPExpression}{Whitespace}?))
+PPUnaryExpression						= ({PPPrimaryExpression}|("!"{Whitespace}?{PPUnaryExpression}))
+PPEqualityExpression					= ({PPUnaryExpression}|({Whitespace}?"=="{Whitespace}?{PPUnaryExpression})|({Whitespace}?"!="{Whitespace}?{PPUnaryExpression}))
+PPAndExpression						= ({PPEqualityExpression}|({Whitespace}?"&&"{Whitespace}?{PPEqualityExpression}))
+PPOrExpression							= ({PPAndExpression}|({Whitespace}?"||"{Whitespace}?{PPAndExpression}))
+PPExpression							= ({Whitespace}?{PPOrExpression}{Whitespace}?)
+PPWord								= ("define"|"undef"|"if"|"elif"|"else"|"endif"|"line"|"error"|"warning"|"region"|"endregion")
+PPDirective							= ({Whitespace}?"#"{Whitespace}?{PPWord}{InputCharacter}*)
+
+/* URL matching, for comments (not in C# spec) */
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ([A-Za-z_]|{DecimalDigitCharacter}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|[A-Za-z0-9])
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state DELIMITEDCOMMENT
+%state DOCUMENTCOMMENT
+%state VERBATIMSTRING
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"abstract" |
+	"as" |
+	"base" |
+	"break" |
+	"case" |
+	"catch" |
+	"checked" |
+	"class" |
+	"const" |
+	"continue" |
+	"decimal" |
+	"default" |
+	"delegate" |
+	"do" |
+	"else" |
+	"enum" |
+	"event" |
+	"explicit" |
+	"extern" |
+	"finally" |
+	"fixed" |
+	"for" |
+	"foreach" |
+	"goto" |
+	"if" |
+	"implicit" |
+	"in" |
+	"interface" |
+	"internal" |
+	"is" |
+	"lock" |
+	"namespace" |
+	"new" |
+	"null" |
+	"object" |
+	"operator" |
+	"out" |
+	"override" |
+	"params" |
+	"private" |
+	"protected" |
+	"public" |
+	"readonly" |
+	"ref" |
+	"return" |
+	"sealed" |
+	"sizeof" |
+	"stackalloc" |
+	"static" |
+	"string" |
+	"struct" |
+	"switch" |
+	"this" |
+	"throw" |
+	"try" |
+	"typeof" |
+	"unchecked" |
+	"unsafe" |
+	"using" |
+	"virtual" |
+	"void" |
+	"volatile" |
+	"while"								{ addToken(Token.RESERVED_WORD); }
+
+	/* Data types. */
+	"bool" |
+	"byte" |
+	"char" |
+	"double" |
+	"float" |
+	"int" |
+	"long" |
+	"object" |
+	"sbyte" |
+	"short" |
+	"string" |
+	"uint" |
+	"ulong" |
+	"ushort"							{ addToken(Token.DATA_TYPE); }
+
+
+	{NewlineCharacter}					{ addNullToken(); return firstToken; }
+
+	{BooleanLiteral}					{ addToken(Token.LITERAL_BOOLEAN); }
+
+	{Identifier}						{ addToken(Token.IDENTIFIER); }
+
+	{Whitespace}						{ addToken(Token.WHITESPACE); }
+
+	/* String/Character Literals. */
+	{CharacterLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharacterLiteral}			{ addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
+	{ErrorUnclosedCharacterLiteral}		{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{ErrorCharacterLiteral}				{ addToken(Token.ERROR_CHAR); }
+	{VerbatimStringLiteralStart}			{ start = zzMarkedPos-2; yybegin(VERBATIMSTRING); }
+	{RegularStringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedRegularStringLiteral}		{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{ErrorRegularStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); }
+
+	/* Comments. */
+	{DelimitedCommentStart}				{ start = zzMarkedPos-2; yybegin(DELIMITEDCOMMENT); }
+	{DocumentationCommentStart}			{ start = zzMarkedPos-3; yybegin(DOCUMENTCOMMENT); }
+	{SingleLineComment}					{ addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+	/* Separators. */
+	{Separator}						{ addToken(Token.SEPARATOR); }
+	{Separator2}						{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{OperatorOrPunctuator}				{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{DecimalIntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexadecimalIntegerLiteral}			{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{RealLiteral}						{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}					{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	/* Preprocessor directives. */
+	{PPDirective}						{ addToken(Token.PREPROCESSOR); }
+
+	/* Pretty-much anything else. */
+	{ErrorIdentifier}					{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>							{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.								{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<DELIMITEDCOMMENT> {
+
+	[^hwf\n\*]+						{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]						{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{DelimitedCommentEnd}			{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<DOCUMENTCOMMENT> {
+
+	[^hwf\<\n]*						{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
+	[hwf]						{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken; }
+	"<"[^\>]*">"					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.PREPROCESSOR); start = zzMarkedPos; }
+	"<"							{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzEndRead, Token.PREPROCESSOR); addNullToken(); return firstToken; }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken; }
+
+}
+
+
+<VERBATIMSTRING> {
+
+	[^\"\n]*						{}
+	{QuoteEscapeSequence}			{}
+	\"							{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	\n							{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.java
new file mode 100644
index 0000000..d595ae6
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.java
@@ -0,0 +1,1600 @@
+/* The following code was generated by JFlex 1.4.1 on 1/21/09 4:27 PM */
+
+/*
+ * 11/13/2004
+ *
+ * CSharpTokenMaker.java - An object that can take a chunk of text and return
+ * a linked list of tokens representing it in the C# programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A lexer for the C# programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated CSharpTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class CSharpTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int VERBATIMSTRING = 3;
+  public static final int DOCUMENTCOMMENT = 2;
+  public static final int YYINITIAL = 0;
+  public static final int DELIMITEDCOMMENT = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\2\1\1\1\0\2\15\22\0\1\2\1\45\1\41\1\16"+
+    "\1\66\1\45\1\46\1\37\2\65\1\4\1\32\1\56\1\12\1\36"+
+    "\1\3\1\30\11\11\1\44\1\56\1\53\1\52\1\54\1\51\1\14"+
+    "\3\27\1\35\1\33\1\35\5\10\1\26\1\34\7\10\1\7\2\10"+
+    "\1\31\2\10\1\65\1\5\1\65\1\50\1\13\1\0\1\23\1\42"+
+    "\1\71\1\57\1\21\1\22\1\64\1\67\1\60\1\75\1\72\1\24"+
+    "\1\73\1\61\1\62\1\70\1\10\1\20\1\25\1\17\1\6\1\40"+
+    "\1\63\1\43\1\74\1\76\1\55\1\47\1\55\1\51\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\1\2\1\3\1\4\2\5\2\6\1\7"+
+    "\1\5\3\2\7\6\1\7\1\5\1\2\1\10\1\6"+
+    "\1\11\1\6\5\5\1\12\11\6\1\1\1\13\5\1"+
+    "\1\14\1\1\1\15\3\1\1\16\1\17\1\0\1\20"+
+    "\1\21\5\6\1\22\1\7\1\22\1\23\1\7\1\0"+
+    "\1\24\7\2\14\6\1\25\10\6\1\22\1\23\1\26"+
+    "\1\10\1\27\2\6\2\11\1\30\4\6\2\25\21\6"+
+    "\1\31\7\0\1\32\2\0\1\1\7\0\1\20\1\33"+
+    "\5\6\1\7\1\23\1\0\7\2\1\34\1\2\17\6"+
+    "\1\25\10\6\1\35\1\10\1\36\2\10\1\26\1\10"+
+    "\3\6\1\11\1\37\3\11\7\6\1\40\20\6\20\0"+
+    "\1\6\1\40\2\6\6\2\1\41\12\6\2\35\2\10"+
+    "\1\26\2\6\2\11\16\6\1\0\1\42\2\0\1\43"+
+    "\7\0\3\2\10\6\1\35\2\10\1\26\1\6\2\11"+
+    "\10\6\7\0\2\2\3\6\2\10\1\26\1\11\5\6"+
+    "\2\0\1\2\3\6\1\0\1\6";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[364];
+    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\77\0\176\0\275\0\374\0\u013b\0\u017a\0\u01b9"+
+    "\0\u01f8\0\u0237\0\u0276\0\u02b5\0\u02f4\0\u0333\0\u013b\0\u0372"+
+    "\0\u03b1\0\u03f0\0\u042f\0\u046e\0\u04ad\0\u04ec\0\u052b\0\u056a"+
+    "\0\u05a9\0\u05e8\0\u0627\0\u0666\0\u06a5\0\u06e4\0\u013b\0\u0723"+
+    "\0\u0762\0\u07a1\0\u07e0\0\u013b\0\u013b\0\u081f\0\u085e\0\u089d"+
+    "\0\u08dc\0\u091b\0\u095a\0\u0999\0\u09d8\0\u0a17\0\u013b\0\u0a56"+
+    "\0\u0a95\0\u0ad4\0\u0b13\0\u0b52\0\u013b\0\u0b91\0\u0bd0\0\u0c0f"+
+    "\0\u0c4e\0\u0c8d\0\u013b\0\u0ccc\0\u0d0b\0\u0d4a\0\u013b\0\u0d89"+
+    "\0\u0dc8\0\u0e07\0\u0e46\0\u0e85\0\u0ec4\0\u0f03\0\u0f42\0\u0ec4"+
+    "\0\u0f81\0\u05e8\0\u013b\0\u0fc0\0\u0fff\0\u103e\0\u107d\0\u10bc"+
+    "\0\u10fb\0\u113a\0\u1179\0\u11b8\0\u11f7\0\u1236\0\u1275\0\u12b4"+
+    "\0\u12f3\0\u1332\0\u1371\0\u13b0\0\u13ef\0\u142e\0\u0276\0\u146d"+
+    "\0\u14ac\0\u14eb\0\u152a\0\u1569\0\u15a8\0\u15e7\0\u1626\0\u1665"+
+    "\0\u16a4\0\u16e3\0\u1722\0\u013b\0\u1761\0\u17a0\0\u17df\0\u181e"+
+    "\0\u013b\0\u185d\0\u189c\0\u18db\0\u191a\0\u1959\0\u1998\0\u19d7"+
+    "\0\u1a16\0\u1a55\0\u1a94\0\u1ad3\0\u1b12\0\u1b51\0\u1b90\0\u1bcf"+
+    "\0\u1c0e\0\u1c4d\0\u1c8c\0\u1ccb\0\u1d0a\0\u1d49\0\u1d88\0\u1dc7"+
+    "\0\u013b\0\u1e06\0\u1e45\0\u1e84\0\u1ec3\0\u1f02\0\u1f41\0\u0bd0"+
+    "\0\u013b\0\u1f80\0\u1fbf\0\u013b\0\u1ffe\0\u203d\0\u207c\0\u20bb"+
+    "\0\u20fa\0\u2139\0\u2178\0\u21b7\0\u013b\0\u21f6\0\u2235\0\u2274"+
+    "\0\u22b3\0\u22f2\0\u0ec4\0\u2331\0\u2370\0\u23af\0\u23ee\0\u242d"+
+    "\0\u246c\0\u24ab\0\u24ea\0\u2529\0\u2568\0\u25a7\0\u25e6\0\u2625"+
+    "\0\u2664\0\u26a3\0\u26e2\0\u2721\0\u2760\0\u279f\0\u27de\0\u281d"+
+    "\0\u285c\0\u289b\0\u28da\0\u2919\0\u2958\0\u2997\0\u29d6\0\u2a15"+
+    "\0\u2a54\0\u2a93\0\u2ad2\0\u2b11\0\u2b50\0\u2b8f\0\u2bce\0\u2c0d"+
+    "\0\u013b\0\u2c4c\0\u2c8b\0\u2cca\0\u2d09\0\u2d48\0\u2d87\0\u2dc6"+
+    "\0\u2e05\0\u013b\0\u2e44\0\u2e83\0\u2ec2\0\u2f01\0\u2f40\0\u2f7f"+
+    "\0\u2fbe\0\u2ffd\0\u303c\0\u307b\0\u30ba\0\u30f9\0\u3138\0\u3177"+
+    "\0\u31b6\0\u31f5\0\u3234\0\u3273\0\u32b2\0\u32f1\0\u3330\0\u336f"+
+    "\0\u33ae\0\u33ed\0\u342c\0\u346b\0\u34aa\0\u34e9\0\u3528\0\u3567"+
+    "\0\u35a6\0\u35e5\0\u3624\0\u3663\0\u36a2\0\u36e1\0\u3720\0\u375f"+
+    "\0\u379e\0\u37dd\0\u381c\0\u385b\0\u389a\0\u38d9\0\u0276\0\u3918"+
+    "\0\u3957\0\u3996\0\u39d5\0\u3a14\0\u3a53\0\u3a92\0\u3ad1\0\u0276"+
+    "\0\u3b10\0\u3b4f\0\u3b8e\0\u3bcd\0\u3c0c\0\u3c4b\0\u3c8a\0\u3cc9"+
+    "\0\u3d08\0\u3d47\0\u3d86\0\u3dc5\0\u3e04\0\u3e43\0\u3e82\0\u3ec1"+
+    "\0\u3f00\0\u3f3f\0\u3f7e\0\u3fbd\0\u3ffc\0\u403b\0\u407a\0\u40b9"+
+    "\0\u40f8\0\u4137\0\u4176\0\u41b5\0\u41f4\0\u4233\0\u4272\0\u42b1"+
+    "\0\u42f0\0\u432f\0\u436e\0\u43ad\0\u43ec\0\u442b\0\u446a\0\u44a9"+
+    "\0\u44e8\0\u4527\0\u4566\0\u45a5\0\u45e4\0\u4623\0\u4662\0\u46a1"+
+    "\0\u46e0\0\u471f\0\u475e\0\u479d\0\u47dc\0\u481b\0\u485a\0\u4899"+
+    "\0\u0ec4\0\u48d8\0\u4917\0\u4956\0\u4995\0\u49d4\0\u4a13\0\u4a52"+
+    "\0\u4a91\0\u4ad0\0\u4b0f\0\u4b4e\0\u4b8d\0\u4bcc\0\u4c0b\0\u4c4a"+
+    "\0\u436e\0\u4c89\0\u442b\0\u4cc8\0\u4d07\0\u4d46\0\u4d85\0\u4dc4"+
+    "\0\u4e03\0\u4e42\0\u4e81\0\u4ec0\0\u4eff\0\u4f3e\0\u4f7d\0\u4fbc"+
+    "\0\u4ffb\0\u503a\0\u5079\0\u50b8\0\u50f7\0\u5136\0\u5175\0\u51b4"+
+    "\0\u51f3\0\u5232\0\u5271\0\u52b0";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[364];
+    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\5\1\6\1\7\1\10\1\11\1\5\1\12\2\13"+
+    "\1\14\1\15\1\13\1\16\1\17\1\20\1\21\1\22"+
+    "\1\23\1\24\1\25\1\26\1\27\2\13\1\30\1\13"+
+    "\1\31\3\13\1\32\1\33\1\34\1\35\1\36\1\13"+
+    "\1\37\1\11\1\40\1\41\1\11\1\37\1\11\1\42"+
+    "\1\43\1\44\1\45\1\46\1\47\1\50\1\51\1\52"+
+    "\1\53\1\44\1\5\1\13\1\54\1\55\5\13\1\56"+
+    "\1\57\2\56\1\60\15\56\1\61\40\56\1\62\3\56"+
+    "\1\63\7\56\1\64\1\65\20\64\1\66\30\64\1\67"+
+    "\7\64\1\70\3\64\1\71\7\64\1\72\1\73\37\72"+
+    "\1\74\35\72\1\5\4\0\5\5\1\0\2\5\1\0"+
+    "\14\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+    "\6\5\1\0\11\5\101\0\1\7\13\0\1\75\63\0"+
+    "\1\76\1\77\45\0\1\37\76\0\1\37\24\0\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\5\13\1\101\1\102\4\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\1\13\1\103\1\104\3\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\105"+
+    "\4\0\1\105\2\106\1\105\1\14\1\0\2\105\1\0"+
+    "\3\105\1\107\1\110\1\105\1\111\1\105\1\111\1\105"+
+    "\1\14\1\105\1\0\1\107\2\110\1\112\1\0\1\105"+
+    "\1\0\2\105\13\0\1\110\5\105\1\0\5\105\1\110"+
+    "\3\105\12\0\1\37\37\0\1\37\1\0\1\37\22\0"+
+    "\1\5\4\0\1\5\3\13\1\5\1\0\1\13\1\5"+
+    "\1\0\1\5\11\13\1\5\1\13\1\0\3\13\2\0"+
+    "\1\13\1\113\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\1\0\1\75\2\0\1\5\1\114\3\5\1\0"+
+    "\2\5\1\0\2\5\1\115\1\116\2\5\1\117\5\5"+
+    "\1\0\3\5\2\0\1\5\1\0\2\5\13\0\1\120"+
+    "\1\121\2\5\1\122\1\5\1\0\12\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\1\13\1\123"+
+    "\11\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\1\124\4\13\1\125\2\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\2\13\1\126\10\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\5\13"+
+    "\1\127\5\13\1\0\3\13\2\0\1\130\1\0\1\13"+
+    "\1\131\13\0\2\13\1\132\3\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\4\13\1\133\1\134\5\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\1\13\1\135\1\13\1\136"+
+    "\2\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\6\13\1\137\4\13"+
+    "\1\0\3\13\2\0\1\13\1\0\1\140\1\13\13\0"+
+    "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\3\13\1\141\2\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\142\1\13\1\143\10\13"+
+    "\1\0\3\13\2\0\1\13\1\0\1\144\1\13\13\0"+
+    "\1\13\1\145\2\13\1\146\1\13\1\0\1\5\1\147"+
+    "\7\13\1\105\4\0\1\105\2\106\1\105\1\14\1\0"+
+    "\2\105\1\0\3\105\1\107\1\110\1\105\1\111\1\105"+
+    "\1\111\1\105\1\14\1\150\1\0\1\107\2\110\1\112"+
+    "\1\0\1\105\1\0\1\105\1\150\13\0\1\110\5\105"+
+    "\1\0\5\105\1\110\3\105\32\0\1\37\17\0\1\37"+
+    "\35\0\1\151\16\0\1\151\46\0\1\152\1\0\3\152"+
+    "\1\153\31\152\1\154\37\152\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\1\13\1\155\1\13"+
+    "\1\156\2\13\1\0\1\5\10\13\1\35\1\157\3\35"+
+    "\1\160\33\35\1\161\35\35\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\1\13\1\162\2\13"+
+    "\1\127\6\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\3\13\1\163\2\13\1\0\1\5\5\13\1\164"+
+    "\2\13\46\0\1\37\3\0\1\37\73\0\1\37\2\0"+
+    "\1\37\76\0\1\37\1\11\75\0\1\37\1\0\1\11"+
+    "\22\0\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\2\13\1\165\10\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\3\13\1\166\2\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\3\13\1\137\2\13\1\137\4\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\2\13"+
+    "\1\167\3\13\1\0\1\5\4\13\1\170\3\13\1\5"+
+    "\4\0\1\5\1\171\3\13\1\100\1\13\1\5\1\0"+
+    "\1\5\2\13\1\172\1\13\1\173\6\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\1\174\3\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\175"+
+    "\1\0\1\176\1\13\13\0\6\13\1\0\1\5\1\13"+
+    "\1\177\6\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\1\200\7\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\3\13\1\201\2\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\1\202\3\13\1\100\1\13\1\5\1\0"+
+    "\1\5\1\13\1\203\2\13\1\204\6\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\4\13\1\205\1\206\5\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\3\13\1\207\2\13"+
+    "\1\0\1\5\1\210\7\13\1\56\1\0\2\56\1\0"+
+    "\15\56\1\0\40\56\1\0\3\56\1\0\7\56\3\0"+
+    "\1\211\112\0\1\212\40\0\1\213\101\0\1\214\32\0"+
+    "\1\215\57\0\1\64\1\0\20\64\1\0\30\64\1\0"+
+    "\7\64\1\0\3\64\1\0\7\64\17\0\1\216\40\0"+
+    "\1\217\16\0\54\220\1\221\22\220\63\0\1\222\32\0"+
+    "\1\223\57\0\1\72\1\0\37\72\1\0\35\72\41\0"+
+    "\1\224\37\0\1\75\3\0\1\225\11\0\1\226\1\227"+
+    "\2\0\1\230\32\0\1\231\1\232\2\0\1\233\13\0"+
+    "\3\234\1\235\73\234\6\0\6\100\3\0\13\100\1\0"+
+    "\3\100\2\0\1\100\1\0\2\100\13\0\6\100\2\0"+
+    "\10\100\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\3\13\1\236\2\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\1\13\1\237\4\13\1\0\1\5\1\147\7\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\2\13\1\240\3\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\6\13\1\241\4\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\2\13\1\242\5\13"+
+    "\1\105\4\0\5\105\1\0\2\105\1\0\14\105\1\0"+
+    "\3\105\2\0\1\105\1\0\2\105\13\0\6\105\1\0"+
+    "\12\105\4\0\5\105\1\0\2\105\1\0\6\105\1\243"+
+    "\1\105\1\243\3\105\1\0\3\105\2\0\1\105\1\0"+
+    "\2\105\13\0\6\105\1\0\12\105\4\0\4\105\1\244"+
+    "\1\245\2\105\1\0\12\105\1\244\1\105\1\245\3\105"+
+    "\2\0\1\105\1\0\2\105\13\0\6\105\1\0\12\105"+
+    "\4\0\1\105\2\243\2\105\1\0\2\105\1\0\14\105"+
+    "\1\0\3\105\2\0\1\105\1\0\2\105\13\0\6\105"+
+    "\1\0\11\105\1\5\4\0\5\5\1\0\2\5\1\0"+
+    "\14\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+    "\2\5\1\246\3\5\1\0\12\5\4\0\5\5\1\0"+
+    "\2\5\1\0\3\5\1\247\10\5\1\0\3\5\2\0"+
+    "\1\5\1\0\2\5\13\0\6\5\1\0\12\5\4\0"+
+    "\5\5\1\0\2\5\1\0\2\5\1\250\3\5\1\251"+
+    "\5\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+    "\2\5\1\252\3\5\1\0\12\5\4\0\5\5\1\0"+
+    "\2\5\1\0\14\5\1\0\3\5\2\0\1\5\1\0"+
+    "\2\5\13\0\1\5\1\253\4\5\1\0\12\5\4\0"+
+    "\5\5\1\0\2\5\1\0\3\5\1\254\10\5\1\0"+
+    "\3\5\2\0\1\5\1\0\2\5\13\0\6\5\1\0"+
+    "\12\5\4\0\5\5\1\0\2\5\1\0\4\5\1\255"+
+    "\7\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+    "\6\5\1\0\12\5\4\0\5\5\1\0\2\5\1\0"+
+    "\5\5\1\256\6\5\1\0\3\5\2\0\1\5\1\0"+
+    "\2\5\13\0\6\5\1\0\12\5\4\0\1\5\1\257"+
+    "\3\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\5\13\1\137\2\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\1\13\1\260\11\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\1\13"+
+    "\1\261\4\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\1\13\1\262\6\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\1\263\2\13\1\137"+
+    "\1\264\6\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\6\13\1\265"+
+    "\4\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\2\13\1\266\10\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\267\12\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\1\13\1\270\6\13\1\5\4\0\1\5\1\271\3\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\5\13\1\272\5\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\3\13\1\273\2\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\13\13\1\0\3\13\2\0\1\13\1\0\1\13\1\274"+
+    "\13\0\2\13\1\275\3\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\1\13\1\276\11\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\6\13"+
+    "\1\277\4\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\2\13\1\300"+
+    "\3\13\1\0\1\5\2\13\1\301\5\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\1\13"+
+    "\1\302\2\13\1\303\6\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\4\13\1\304\6\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\5\13\1\164\2\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\7\13\1\262\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\1\13\1\305\4\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\3\13\1\306\2\13\1\0\1\5"+
+    "\10\13\1\105\4\0\4\105\1\307\1\0\2\105\1\0"+
+    "\3\105\3\307\3\105\2\307\1\105\1\0\1\307\1\105"+
+    "\1\307\2\0\1\105\1\0\1\307\1\105\13\0\1\307"+
+    "\5\105\1\0\3\105\1\307\6\105\4\0\4\105\1\151"+
+    "\1\0\2\105\1\0\3\105\1\107\1\110\5\105\1\151"+
+    "\1\105\1\0\1\107\2\110\2\0\1\105\1\0\2\105"+
+    "\13\0\1\110\5\105\1\0\5\105\1\110\3\105\1\310"+
+    "\1\0\35\310\1\311\40\310\1\0\3\310\1\152\1\312"+
+    "\1\313\7\310\2\152\1\310\2\152\4\310\1\152\6\310"+
+    "\1\314\3\152\1\315\15\310\1\152\15\310\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\1\13"+
+    "\1\316\11\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\5\13\1\317"+
+    "\5\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\1\13\1\320\4\13\1\0\1\5\10\13\5\157\1\321"+
+    "\33\157\1\322\36\157\1\0\3\157\1\35\1\323\1\324"+
+    "\7\157\2\35\1\157\2\35\4\157\1\35\6\157\4\35"+
+    "\1\325\15\157\1\35\15\157\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\2\13\1\326\10\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\3\13\1\327\2\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\1\330\12\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\3\13\1\331\1\13\1\332\5\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\2\13\1\333\5\13\1\5\4\0\1\5\1\334\3\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\1\335\12\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\13\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\1\13\1\270\6\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\5\13"+
+    "\1\336\5\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\4\13\1\137"+
+    "\1\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\4\13\1\337\3\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\137\12\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\2\13\1\340\10\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\6\13\1\341\1\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\2\13\1\342\10\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\1\13"+
+    "\1\343\4\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\1\344\12\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\1\345\1\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\1\13\1\346\1\13\1\347\2\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\1\13\1\350\11\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\1\351\5\13\1\265\4\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\4\13\1\352\6\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\2\13\1\353\3\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\2\13\1\354\1\13\1\355\6\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\70\0\1\356\32\0\1\357\135\0\1\360\32\0\1\361"+
+    "\147\0\1\362\32\0\1\363\135\0\1\364\32\0\1\365"+
+    "\140\0\1\366\36\0\1\367\75\0\1\370\3\0\1\371"+
+    "\34\0\1\372\75\0\1\373\37\0\1\374\77\0\1\255"+
+    "\77\0\1\375\53\0\1\234\1\0\75\234\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\2\13"+
+    "\1\300\3\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\2\13\1\376"+
+    "\3\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\1\377\12\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\4\13\1\u0100\6\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\1\u0101\7\13\1\105"+
+    "\4\0\4\105\1\244\1\0\2\105\1\0\4\105\1\110"+
+    "\5\105\1\244\1\105\1\0\1\105\2\110\2\0\1\105"+
+    "\1\0\2\105\13\0\1\110\5\105\1\0\5\105\1\110"+
+    "\3\105\11\0\1\244\16\0\1\244\46\0\1\5\4\0"+
+    "\5\5\1\0\2\5\1\0\14\5\1\0\3\5\2\0"+
+    "\1\5\1\0\2\5\13\0\1\u0102\5\5\1\0\12\5"+
+    "\4\0\5\5\1\0\2\5\1\0\14\5\1\0\3\5"+
+    "\2\0\1\5\1\0\2\5\13\0\5\5\1\u0103\1\0"+
+    "\12\5\4\0\5\5\1\0\2\5\1\0\2\5\1\u0104"+
+    "\11\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+    "\6\5\1\0\12\5\4\0\5\5\1\0\2\5\1\0"+
+    "\7\5\1\u0105\4\5\1\0\3\5\2\0\1\5\1\0"+
+    "\2\5\13\0\1\5\1\121\4\5\1\0\12\5\4\0"+
+    "\5\5\1\0\2\5\1\0\14\5\1\0\3\5\2\0"+
+    "\1\5\1\0\2\5\13\0\1\u0106\5\5\1\0\12\5"+
+    "\4\0\5\5\1\0\2\5\1\0\14\5\1\0\3\5"+
+    "\2\0\1\5\1\0\2\5\13\0\2\5\1\u0105\3\5"+
+    "\1\0\12\5\4\0\5\5\1\0\2\5\1\0\4\5"+
+    "\1\117\7\5\1\0\3\5\2\0\1\5\1\0\2\5"+
+    "\13\0\6\5\1\0\11\5\1\255\1\0\75\255\1\5"+
+    "\4\0\5\5\1\0\2\5\1\0\2\5\1\u0107\11\5"+
+    "\1\0\3\5\2\0\1\5\1\0\2\5\13\0\6\5"+
+    "\1\0\12\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\2\13\1\u0108\10\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\3\13\1\172\2\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\6\13\1\137\4\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\2\13"+
+    "\1\u0109\10\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\1\u010a\3\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\1\u010b\5\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\2\13\1\137\10\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\2\13\1\174\3\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\2\13\1\u010a\10\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\5\13"+
+    "\1\u010c\5\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\4\13\1\137\3\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\6\13\1\257\4\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\4\13\1\240\6\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\2\13\1\320\10\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\4\13\1\u010d\6\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\2\13\1\u010e\10\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\1\u010f\12\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\5\13\1\377"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\3\13"+
+    "\1\137\4\13\1\5\4\0\1\5\1\u0110\3\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\1\13\1\237\4\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\1\u0111\12\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\2\13"+
+    "\1\u0112\5\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\5\13\1\274\5\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\1\351\12\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\1\13\1\240\11\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\105\4\0"+
+    "\1\105\2\u0113\1\105\1\307\1\0\2\105\1\0\3\105"+
+    "\3\307\1\u0114\1\105\1\u0114\2\307\1\105\1\0\1\307"+
+    "\1\105\1\307\2\0\1\105\1\0\1\307\1\105\13\0"+
+    "\1\307\5\105\1\0\3\105\1\307\5\105\1\310\1\0"+
+    "\35\310\1\154\40\310\1\0\7\310\1\u0115\7\310\3\u0115"+
+    "\3\310\2\u0115\2\310\1\u0115\1\310\1\u0115\1\310\1\154"+
+    "\2\310\1\u0115\14\310\1\u0115\11\310\1\u0115\6\310\1\0"+
+    "\7\310\1\u0116\7\310\3\u0116\3\310\2\u0116\2\310\1\u0116"+
+    "\1\310\1\u0116\1\310\1\154\2\310\1\u0116\14\310\1\u0116"+
+    "\11\310\1\u0116\5\310\37\0\1\311\37\0\1\310\1\0"+
+    "\7\310\1\u0117\7\310\3\u0117\3\310\2\u0117\2\310\1\u0117"+
+    "\1\310\1\u0117\1\310\1\154\2\310\1\u0117\14\310\1\u0117"+
+    "\11\310\1\u0117\5\310\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\u0118\12\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\4\13\1\u0119\6\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\1\137\5\13\1\0\1\5\10\13\1\157\1\0"+
+    "\102\157\1\321\3\157\1\u011a\7\157\3\u011a\3\157\2\u011a"+
+    "\2\157\1\u011a\1\157\1\u011a\3\157\1\322\1\u011a\14\157"+
+    "\1\u011a\11\157\1\u011a\12\157\1\321\3\157\1\u011b\7\157"+
+    "\3\u011b\3\157\2\u011b\2\157\1\u011b\1\157\1\u011b\3\157"+
+    "\1\322\1\u011b\14\157\1\u011b\11\157\1\u011b\12\157\1\321"+
+    "\3\157\1\35\7\157\3\35\3\157\2\35\2\157\1\35"+
+    "\1\157\1\35\3\157\1\322\1\35\14\157\1\35\11\157"+
+    "\1\35\5\157\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\4\13\1\301\6\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\5\13\1\377\5\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\2\13\1\377\10\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\4\13\1\u011c\6\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\2\13"+
+    "\1\u011d\10\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\1\13\1\u011e"+
+    "\4\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\1\u011f\1\13\13\0\6\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\2\13\1\u0120\10\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\5\13\1\137\5\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\2\13\1\u0121\10\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\1\13\1\u0122\11\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\2\13"+
+    "\1\u0110\10\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\1\13\1\u0123"+
+    "\11\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\5\13\1\265\5\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\3\13\1\137\2\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\5\13\1\u0111\5\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\u0124\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\1\u0125"+
+    "\12\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\4\13\1\u0126\6\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\2\13"+
+    "\1\u0127\5\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\6\13\1\261\4\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\1\u0128\5\13\1\174\4\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\2\13\1\u0129\5\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\1\13\1\377\11\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\44\0"+
+    "\1\u012a\53\0\1\356\113\0\1\u012b\130\0\1\u012c\52\0"+
+    "\1\u012d\53\0\1\362\113\0\1\u012e\130\0\1\u012f\65\0"+
+    "\1\u0130\103\0\1\u0131\32\0\1\u0132\103\0\1\u0133\32\0"+
+    "\1\232\75\0\1\u0134\100\0\1\u0133\37\0\1\230\74\0"+
+    "\1\u0135\56\0\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\5\13\1\137\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\3\13\1\265\7\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\2\13\1\354\10\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\5\5\1\0\2\5\1\0\3\5\1\121\10\5\1\0"+
+    "\3\5\2\0\1\5\1\0\2\5\13\0\6\5\1\0"+
+    "\12\5\4\0\5\5\1\0\2\5\1\0\14\5\1\0"+
+    "\3\5\2\0\1\5\1\0\2\5\13\0\1\5\1\u0136"+
+    "\4\5\1\0\12\5\4\0\5\5\1\0\2\5\1\0"+
+    "\14\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+    "\3\5\1\u0137\2\5\1\0\12\5\4\0\5\5\1\0"+
+    "\2\5\1\0\3\5\1\255\10\5\1\0\3\5\2\0"+
+    "\1\5\1\0\2\5\13\0\6\5\1\0\12\5\4\0"+
+    "\5\5\1\0\2\5\1\0\2\5\1\115\11\5\1\0"+
+    "\3\5\2\0\1\5\1\0\2\5\13\0\1\5\1\121"+
+    "\4\5\1\0\12\5\4\0\5\5\1\0\2\5\1\0"+
+    "\14\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+    "\2\5\1\u0138\3\5\1\0\12\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\3\13\1\u0139\2\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\13\1\u013a\11\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\3\13\1\u013b\2\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\1\13\1\u013c\4\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\5\13\1\u013d\5\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\4\13\1\351\6\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\1\13"+
+    "\1\u013e\11\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\2\13\1\174\5\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\1\13\1\u013f\4\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\3\13"+
+    "\1\u0140\4\13\1\105\4\0\5\105\1\0\2\105\1\0"+
+    "\6\105\1\u0141\1\105\1\u0141\3\105\1\0\3\105\2\0"+
+    "\1\105\1\0\2\105\13\0\6\105\1\0\12\105\4\0"+
+    "\1\105\2\u0141\2\105\1\0\2\105\1\0\14\105\1\0"+
+    "\3\105\2\0\1\105\1\0\2\105\13\0\6\105\1\0"+
+    "\11\105\1\310\1\0\7\310\1\u0142\7\310\3\u0142\3\310"+
+    "\2\u0142\2\310\1\u0142\1\310\1\u0142\1\310\1\154\2\310"+
+    "\1\u0142\14\310\1\u0142\11\310\1\u0142\6\310\1\0\7\310"+
+    "\1\u0143\7\310\3\u0143\3\310\2\u0143\2\310\1\u0143\1\310"+
+    "\1\u0143\1\310\1\154\2\310\1\u0143\14\310\1\u0143\11\310"+
+    "\1\u0143\6\310\1\0\7\310\1\u0144\7\310\3\u0144\3\310"+
+    "\2\u0144\2\310\1\u0144\1\310\1\u0144\1\310\1\311\2\310"+
+    "\1\u0144\14\310\1\u0144\11\310\1\u0144\5\310\1\5\4\0"+
+    "\1\5\1\u0145\3\13\1\100\1\13\1\5\1\0\1\5"+
+    "\13\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\1\200\12\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\10\13\5\157\1\321\3\157\1\u0146\7\157\3\u0146"+
+    "\3\157\2\u0146\2\157\1\u0146\1\157\1\u0146\3\157\1\322"+
+    "\1\u0146\14\157\1\u0146\11\157\1\u0146\12\157\1\321\3\157"+
+    "\1\u0147\7\157\3\u0147\3\157\2\u0147\2\157\1\u0147\1\157"+
+    "\1\u0147\3\157\1\322\1\u0147\14\157\1\u0147\11\157\1\u0147"+
+    "\5\157\1\5\4\0\1\5\1\u0148\3\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\13\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\5\13\1\u0124\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\4\13\1\u0145\3\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\5\13\1\330\5\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\13\1\u0149\11\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\6\13\1\u014a\4\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\1\13\1\u014b\11\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\4\13\1\u014c\6\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\4\13\1\u014d\6\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\2\13"+
+    "\1\u014e\10\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\4\13\1\261\3\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\1\137\7\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\1\13\1\u014f\4\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\3\13\1\274\4\13"+
+    "\3\0\1\u0150\76\0\1\u012b\1\u0151\1\0\4\u012b\3\u0151"+
+    "\1\0\1\u0151\13\u012b\1\u0151\3\u012b\2\u0151\1\u012b\1\0"+
+    "\2\u012b\3\u0151\2\0\2\u0151\3\0\1\u0151\6\u012b\1\u0151"+
+    "\11\u012b\25\0\1\356\16\0\1\u012a\35\0\1\u0152\76\0"+
+    "\1\u012e\1\u0153\1\0\4\u012e\3\u0153\1\0\1\u0153\13\u012e"+
+    "\1\u0153\3\u012e\2\u0153\1\u012e\1\0\2\u012e\3\u0153\2\0"+
+    "\2\u0153\3\0\1\u0153\6\u012e\1\u0153\11\u012e\25\0\1\362"+
+    "\16\0\1\u012d\53\0\1\232\135\0\1\u0154\100\0\1\u0155"+
+    "\35\0\1\255\75\0\1\226\37\0\1\232\77\0\1\u0156"+
+    "\15\0\1\5\4\0\5\5\1\0\2\5\1\0\14\5"+
+    "\1\0\3\5\2\0\1\5\1\0\2\5\13\0\3\5"+
+    "\1\u0157\2\5\1\0\12\5\4\0\5\5\1\0\2\5"+
+    "\1\0\2\5\1\255\11\5\1\0\3\5\2\0\1\5"+
+    "\1\0\2\5\13\0\6\5\1\0\12\5\4\0\5\5"+
+    "\1\0\2\5\1\0\14\5\1\0\3\5\2\0\1\5"+
+    "\1\0\2\5\13\0\1\5\1\u0158\4\5\1\0\12\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\3\13\1\137\7\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\2\13"+
+    "\1\137\3\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\2\13\1\u013d"+
+    "\3\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\2\13\1\u0159\5\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\5\13\1\u015a\5\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\4\13\1\u0110\6\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\2\13\1\137\5\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\4\13\1\u015b\6\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\310"+
+    "\1\0\7\310\1\u015c\7\310\3\u015c\3\310\2\u015c\2\310"+
+    "\1\u015c\1\310\1\u015c\1\310\1\154\2\310\1\u015c\14\310"+
+    "\1\u015c\11\310\1\u015c\6\310\1\0\7\310\1\u015d\7\310"+
+    "\3\u015d\3\310\2\u015d\2\310\1\u015d\1\310\1\u015d\1\310"+
+    "\1\154\2\310\1\u015d\14\310\1\u015d\11\310\1\u015d\6\310"+
+    "\1\0\7\310\1\u015e\7\310\3\u015e\3\310\2\u015e\2\310"+
+    "\1\u015e\1\310\1\u015e\1\310\1\311\2\310\1\u015e\14\310"+
+    "\1\u015e\11\310\1\u015e\5\310\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\4\13\1\336\6\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\5\157\1\321\3\157\1\325\7\157"+
+    "\3\325\3\157\2\325\2\157\1\325\1\157\1\325\3\157"+
+    "\1\322\1\325\14\157\1\325\11\157\1\325\12\157\1\321"+
+    "\3\157\1\u015f\7\157\3\u015f\3\157\2\u015f\2\157\1\u015f"+
+    "\1\157\1\u015f\3\157\1\322\1\u015f\14\157\1\u015f\11\157"+
+    "\1\u015f\5\157\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\5\13\1\174\5\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\3\13\1\u0160\7\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\2\13\1\u0145\3\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\1\13\1\u0160"+
+    "\6\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\1\13\1\u0161\4\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\1\u0162\12\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\1\265"+
+    "\12\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\2\13\1\u0163\5\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\2\13\1\u0164\3\13\1\0"+
+    "\1\5\10\13\3\0\1\u012b\76\0\1\u012e\155\0\1\u0165"+
+    "\34\0\1\255\136\0\1\u0166\16\0\1\5\4\0\5\5"+
+    "\1\0\2\5\1\0\14\5\1\0\3\5\2\0\1\5"+
+    "\1\0\2\5\13\0\2\5\1\255\3\5\1\0\12\5"+
+    "\4\0\5\5\1\0\2\5\1\0\14\5\1\0\3\5"+
+    "\2\0\1\5\1\0\2\5\13\0\2\5\1\u0167\3\5"+
+    "\1\0\12\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\1\13\1\174\4\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\5\13\1\137\2\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\5\13\1\u0168\5\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\310\1\0"+
+    "\7\310\1\152\7\310\3\152\3\310\2\152\2\310\1\152"+
+    "\1\310\1\152\1\310\1\154\2\310\1\152\14\310\1\152"+
+    "\11\310\1\152\6\310\1\0\7\310\1\312\7\310\3\312"+
+    "\3\310\2\312\2\310\1\312\1\310\1\312\1\310\1\154"+
+    "\2\310\1\312\14\310\1\312\11\310\1\312\6\310\1\0"+
+    "\7\310\1\152\7\310\3\152\3\310\2\152\2\310\1\152"+
+    "\1\310\1\152\1\310\1\311\2\310\1\152\14\310\1\152"+
+    "\11\310\1\152\5\310\5\157\1\321\3\157\1\323\7\157"+
+    "\3\323\3\157\2\323\2\157\1\323\1\157\1\323\3\157"+
+    "\1\322\1\323\14\157\1\323\11\157\1\323\5\157\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\4\13\1\u0169\6\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\1\265"+
+    "\5\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\3\13\1\u016a\2\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\274\12\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\1\265\3\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\61\0"+
+    "\1\255\76\0\1\u016b\15\0\1\5\4\0\5\5\1\0"+
+    "\2\5\1\0\14\5\1\0\3\5\2\0\1\5\1\0"+
+    "\2\5\13\0\5\5\1\255\1\0\12\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\5\13\1\u016c"+
+    "\5\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\2\13\1\265\5\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\13\1\137\11\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\10\13\64\0\1\255\12\0\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\3\13\1\u013f"+
+    "\2\13\1\0\1\5\10\13";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[21231];
+    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\3\1\1\11\10\1\1\11\17\1\1\11\4\1"+
+    "\2\11\11\1\1\11\5\1\1\11\5\1\1\11\1\1"+
+    "\1\0\1\1\1\11\12\1\1\0\1\11\40\1\1\11"+
+    "\4\1\1\11\27\1\1\11\7\0\1\11\2\0\1\11"+
+    "\7\0\1\1\1\11\7\1\1\0\43\1\1\11\10\1"+
+    "\1\11\33\1\20\0\54\1\1\0\1\1\2\0\1\1"+
+    "\7\0\32\1\7\0\16\1\2\0\4\1\1\0\1\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[364];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CSharpTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = VERBATIMSTRING;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = DELIMITEDCOMMENT;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 CSharpTokenMaker(java.io.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 CSharpTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 158) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 35: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos;
+          }
+        case 36: break;
+        case 28: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 37: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 38: break;
+        case 30: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 39: break;
+        case 25: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 40: break;
+        case 4: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 41: break;
+        case 29: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 42: break;
+        case 22: 
+          { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/
+          }
+        case 43: break;
+        case 31: 
+          { addToken(Token.ERROR_STRING_DOUBLE);
+          }
+        case 44: break;
+        case 19: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 45: break;
+        case 21: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 46: break;
+        case 10: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 47: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken;
+          }
+        case 48: break;
+        case 6: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 49: break;
+        case 13: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzEndRead, Token.PREPROCESSOR); addNullToken(); return firstToken;
+          }
+        case 50: break;
+        case 8: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 51: break;
+        case 9: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 52: break;
+        case 32: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 53: break;
+        case 2: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 54: break;
+        case 23: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 55: break;
+        case 33: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 56: break;
+        case 20: 
+          { start = zzMarkedPos-2; yybegin(VERBATIMSTRING);
+          }
+        case 57: break;
+        case 24: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 58: break;
+        case 14: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 59: break;
+        case 34: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 60: break;
+        case 16: 
+          { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 61: break;
+        case 18: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 62: break;
+        case 27: 
+          { start = zzMarkedPos-3; yybegin(DOCUMENTCOMMENT);
+          }
+        case 63: break;
+        case 17: 
+          { start = zzMarkedPos-2; yybegin(DELIMITEDCOMMENT);
+          }
+        case 64: break;
+        case 7: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 65: break;
+        case 5: 
+          { addToken(Token.OPERATOR);
+          }
+        case 66: break;
+        case 26: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.PREPROCESSOR); start = zzMarkedPos;
+          }
+        case 67: break;
+        case 15: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 68: break;
+        case 1: 
+          { 
+          }
+        case 69: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 70: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case VERBATIMSTRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 365: break;
+            case DOCUMENTCOMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken;
+            }
+            case 366: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 367: break;
+            case DELIMITEDCOMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 368: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.flex
new file mode 100644
index 0000000..e11ec75
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.flex
@@ -0,0 +1,643 @@
+/*
+ * 11/13/2004
+ *
+ * CTokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing it in the C programming
+ * language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the C programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>CTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class CTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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}|[_])
+Digit				= [0-9]
+HexDigit			= {Digit}|[A-Fa-f]
+OctalDigit			= [0-7]
+Exponent			= [eE][+-]?{Digit}+
+
+PreprocessorWord	= define|elif|else|endif|error|if|ifdef|ifndef|include|line|pragma|undef
+
+Trigraph				= ("??="|"??("|"??)"|"??/"|"??'"|"??<"|"??>"|"??!"|"??-")
+
+OctEscape1			= ([\\]{OctalDigit})
+OctEscape2			= ([\\]{OctalDigit}{OctalDigit})
+OctEscape3			= ([\\][0-3]{OctalDigit}{OctalDigit})
+OctEscape				= ({OctEscape1}|{OctEscape2}|{OctEscape3})
+HexEscape				= ([\\][xX]{HexDigit}{HexDigit})
+
+AnyChrChr					= ([^\'\n\\])
+Escape					= ([\\]([abfnrtv\'\"\?\\0]))
+UnclosedCharLiteral			= ([\']({Escape}|{OctEscape}|{HexEscape}|{Trigraph}|{AnyChrChr}))
+CharLiteral				= ({UnclosedCharLiteral}[\'])
+ErrorUnclosedCharLiteral		= ([\'][^\'\n]*)
+ErrorCharLiteral			= (([\'][\'])|{ErrorUnclosedCharLiteral}[\'])
+AnyStrChr					= ([^\"\n\\])
+FalseTrigraph				= (("?"(("?")*)[^\=\(\)\/\'\<\>\!\-\\\?\"\n])|("?"[\=\(\)\/\'\<\>\!\-]))
+StringLiteral				= ([\"]((((("?")*)({Escape}|{OctEscape}|{HexEscape}|{Trigraph}))|{FalseTrigraph}|{AnyStrChr})*)(("?")*)[\"])
+UnclosedStringLiteral		= ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral			= ({UnclosedStringLiteral}[\"])
+
+
+LineTerminator		= \n
+WhiteSpace		= [ \t\f]
+
+MLCBegin			= "/*"
+MLCEnd			= "*/"
+LineCommentBegin	= "//"
+
+NonFloatSuffix		= (([uU][lL]?)|([lL][uU]?))
+IntegerLiteral		= ({Digit}+{Exponent}?{NonFloatSuffix}?)
+HexLiteral		= ("0"[xX]{HexDigit}+{NonFloatSuffix}?)
+FloatLiteral		= ((({Digit}*[\.]{Digit}+)|({Digit}+[\.]{Digit}*)){Exponent}?[fFlL]?)
+ErrorNumberFormat	= (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+
+NonSeparator		= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#")
+Identifier		= ({LetterOrUnderscore}({LetterOrUnderscore}|{Digit}|[$])*)
+ErrorIdentifier	= ({NonSeparator}+)
+
+
+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 EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"auto" |
+	"break" |
+	"case" |
+	"const" |
+	"continue" |
+	"default" |
+	"do" |
+	"else" |
+	"enum" |
+	"extern" |
+	"for" |
+	"goto" |
+	"if" |
+	"register" |
+	"return" |
+	"sizeof" |
+	"static" |
+	"struct" |
+	"switch" |
+	"typedef" |
+	"union" |
+	"volatile" |
+	"while"					{ addToken(Token.RESERVED_WORD); }
+
+	/* Data types. */
+	"char" |
+	"div_t" |
+	"double" |
+	"float" |
+	"int" |
+	"ldiv_t" |
+	"long" |
+	"short" |
+	"signed" |
+	"size_t" |
+	"unsigned" |
+	"void" |
+	"wchar_t"				{ addToken(Token.DATA_TYPE); }
+
+	/* Standard functions */
+	"abort" |
+	"abs" |
+	"acos" |
+	"asctime" |
+	"asin" |
+	"assert" |
+	"atan2" |
+	"atan" |
+	"atexit" |
+	"atof" |
+	"atoi" |
+	"atol" |
+	"bsearch" |
+	"btowc" |
+	"calloc" |
+	"ceil" |
+	"clearerr" |
+	"clock" |
+	"cosh" |
+	"cos" |
+	"ctime" |
+	"difftime" |
+	"div" |
+	"errno" |
+	"exit" |
+	"exp" |
+	"fabs" |
+	"fclose" |
+	"feof" |
+	"ferror" |
+	"fflush" |
+	"fgetc" |
+	"fgetpos" |
+	"fgetwc" |
+	"fgets" |
+	"fgetws" |
+	"floor" |
+	"fmod" |
+	"fopen" |
+	"fprintf" |
+	"fputc" |
+	"fputs" |
+	"fputwc" |
+	"fputws" |
+	"fread" |
+	"free" |
+	"freopen" |
+	"frexp" |
+	"fscanf" |
+	"fseek" |
+	"fsetpos" |
+	"ftell" |
+	"fwprintf" |
+	"fwrite" |
+	"fwscanf" |
+	"getchar" |
+	"getc" |
+	"getenv" |
+	"gets" |
+	"getwc" |
+	"getwchar" |
+	"gmtime" |
+	"isalnum" |
+	"isalpha" |
+	"iscntrl" |
+	"isdigit" |
+	"isgraph" |
+	"islower" |
+	"isprint" |
+	"ispunct" |
+	"isspace" |
+	"isupper" |
+	"isxdigit" |
+	"labs" |
+	"ldexp" |
+	"ldiv" |
+	"localeconv" |
+	"localtime" |
+	"log10" |
+	"log" |
+	"longjmp" |
+	"malloc" |
+	"mblen" |
+	"mbrlen" |
+	"mbrtowc" |
+	"mbsinit" |
+	"mbsrtowcs" |
+	"mbstowcs" |
+	"mbtowc" |
+	"memchr" |
+	"memcmp" |
+	"memcpy" |
+	"memmove" |
+	"memset" |
+	"mktime" |
+	"modf" |
+	"offsetof" |
+	"perror" |
+	"pow" |
+	"printf" |
+	"putchar" |
+	"putc" |
+	"puts" |
+	"putwc" |
+	"putwchar" |
+	"qsort" |
+	"raise" |
+	"rand" |
+	"realloc" |
+	"remove" |
+	"rename" |
+	"rewind" |
+	"scanf" |
+	"setbuf" |
+	"setjmp" |
+	"setlocale" |
+	"setvbuf" |
+	"setvbuf" |
+	"signal" |
+	"sinh" |
+	"sin" |
+	"sprintf" |
+	"sqrt" |
+	"srand" |
+	"sscanf" |
+	"strcat" |
+	"strchr" |
+	"strcmp" |
+	"strcmp" |
+	"strcoll" |
+	"strcpy" |
+	"strcspn" |
+	"strerror" |
+	"strftime" |
+	"strlen" |
+	"strncat" |
+	"strncmp" |
+	"strncpy" |
+	"strpbrk" |
+	"strrchr" |
+	"strspn" |
+	"strstr" |
+	"strtod" |
+	"strtok" |
+	"strtol" |
+	"strtoul" |
+	"strxfrm" |
+	"swprintf" |
+	"swscanf" |
+	"system" |
+	"tanh" |
+	"tan" |
+	"time" |
+	"tmpfile" |
+	"tmpnam" |
+	"tolower" |
+	"toupper" |
+	"ungetc" |
+	"ungetwc" |
+	"va_arg" |
+	"va_end" |
+	"va_start" |
+	"vfprintf" |
+	"vfwprintf" |
+	"vprintf" |
+	"vsprintf" |
+	"vswprintf" |
+	"vwprintf" |
+	"wcrtomb" |
+	"wcscat" |
+	"wcschr" |
+	"wcscmp" |
+	"wcscoll" |
+	"wcscpy" |
+	"wcscspn" |
+	"wcsftime" |
+	"wcslen" |
+	"wcsncat" |
+	"wcsncmp" |
+	"wcsncpy" |
+	"wcspbrk" |
+	"wcsrchr" |
+	"wcsrtombs" |
+	"wcsspn" |
+	"wcsstr" |
+	"wcstod" |
+	"wcstok" |
+	"wcstol" |
+	"wcstombs" |
+	"wcstoul" |
+	"wcsxfrm" |
+	"wctob" |
+	"wctomb" |
+	"wmemchr" |
+	"wmemcmp" |
+	"wmemcpy" |
+	"wmemmove" |
+	"wmemset" |
+	"wprintf" |
+	"wscanf"				{ addToken(Token.FUNCTION); }
+
+	/* Standard-defined macros. */
+	"__DATE__" |
+	"__TIME__" |
+	"__FILE__" |
+	"__LINE__" |
+	"__STDC__"				{ addToken(Token.PREPROCESSOR); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* Preprocessor directives */
+	"#"{WhiteSpace}*{PreprocessorWord}	{ addToken(Token.PREPROCESSOR); }
+
+	/* String/Character Literals. */
+	{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
+	{ErrorUnclosedCharLiteral}		{ 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. */
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+	{LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+	/* Separators. */
+	"(" |
+	")" |
+	"[" |
+	"]" |
+	"{" |
+	"}"							{ addToken(Token.SEPARATOR); }
+
+	/* Operators. */
+	{Trigraph} |
+	"=" |
+	"+" |
+	"-" |
+	"*" |
+	"/" |
+	"%" |
+	"~" |
+	"<" |
+	">" |
+	"<<" |
+	">>" |
+	"==" |
+	"+=" |
+	"-=" |
+	"*=" |
+	"/=" |
+	"%=" |
+	">>=" |
+	"<<=" |
+	"^" |
+	"&" |
+	"&&" |
+	"|" |
+	"||" |
+	"?" |
+	":" |
+	"," |
+	"!" |
+	"++" |
+	"--" |
+	"." |
+	","							{ 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); }
+
+	/* Some lines will end in '\' to wrap an expression. */
+	"\\"							{ addToken(Token.IDENTIFIER); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Other punctuation, we'll highlight it as "identifiers." */
+	";"							{ addToken(Token.IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<MLC> {
+
+	[^hwf\n\*]+					{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]						{}
+
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}						{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<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; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.java
new file mode 100644
index 0000000..f57d624
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.java
@@ -0,0 +1,2072 @@
+/* The following code was generated by JFlex 1.4.1 on 1/25/09 9:54 PM */
+
+/*
+ * 11/13/2004
+ *
+ * CTokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing it in the C programming
+ * language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the C programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>CTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class CTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int EOL_COMMENT = 2;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\50\1\43\1\0\1\50\1\56\22\0\1\50\1\36\1\44"+
+    "\1\57\1\60\1\65\1\114\1\33\1\31\1\31\1\51\1\7\1\64"+
+    "\1\37\1\54\1\32\1\47\1\77\1\76\1\41\4\5\2\3\1\70"+
+    "\1\63\1\34\1\30\1\35\1\27\1\61\1\103\1\4\1\111\1\102"+
+    "\1\6\1\55\2\1\1\105\2\1\1\53\1\106\1\107\4\1\1\110"+
+    "\1\104\1\52\2\1\1\42\2\1\1\62\1\40\1\62\1\113\1\2"+
+    "\1\0\1\24\1\46\1\21\1\10\1\11\1\12\1\25\1\66\1\13"+
+    "\1\100\1\72\1\15\1\26\1\14\1\20\1\23\1\101\1\17\1\16"+
+    "\1\67\1\22\1\45\1\71\1\73\1\75\1\74\1\112\1\115\1\112"+
+    "\1\64\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 =
+    "\3\0\1\1\2\2\1\3\1\4\16\2\2\4\1\5"+
+    "\1\4\1\6\4\4\1\2\1\7\1\10\2\2\1\3"+
+    "\1\11\1\4\2\1\4\2\2\4\2\12\1\13\5\12"+
+    "\1\14\2\12\1\2\2\15\2\3\1\16\2\2\1\17"+
+    "\21\2\1\17\50\2\1\0\1\20\1\21\2\22\1\23"+
+    "\1\6\2\10\1\24\7\2\1\15\6\1\1\0\11\2"+
+    "\2\0\1\25\6\0\5\2\1\3\1\0\1\3\1\15"+
+    "\1\16\2\2\1\26\5\2\1\26\17\2\1\27\15\2"+
+    "\1\26\1\2\1\26\45\2\1\6\1\30\1\6\3\22"+
+    "\1\6\2\10\1\31\6\2\1\32\4\1\1\33\4\1"+
+    "\6\0\10\2\10\0\5\2\1\16\1\0\27\2\1\27"+
+    "\36\2\1\26\2\2\1\26\6\2\1\6\1\10\6\2"+
+    "\2\32\7\1\4\0\1\33\4\0\10\2\2\0\1\34"+
+    "\2\0\1\35\47\2\1\32\1\33\3\1\7\0\7\2"+
+    "\4\0\12\2\2\1\1\33\3\0\4\2\2\0\1\33";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[500];
+    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\116\0\234\0\352\0\u0138\0\u0186\0\u01d4\0\u0222"+
+    "\0\u0270\0\u02be\0\u030c\0\u035a\0\u03a8\0\u03f6\0\u0444\0\u0492"+
+    "\0\u04e0\0\u052e\0\u057c\0\u05ca\0\u0618\0\u0666\0\u06b4\0\u0702"+
+    "\0\u0750\0\u079e\0\u07ec\0\u083a\0\u0888\0\u0750\0\u08d6\0\352"+
+    "\0\u0750\0\u0924\0\u0972\0\u09c0\0\u0a0e\0\u0a5c\0\u0aaa\0\u0750"+
+    "\0\u0af8\0\u0750\0\u0b46\0\u0b94\0\u0be2\0\u0c30\0\u0c7e\0\u0ccc"+
+    "\0\u0d1a\0\u0750\0\u0d68\0\u0db6\0\u0e04\0\u0e52\0\u0ea0\0\u0750"+
+    "\0\u0eee\0\u0f3c\0\u0f8a\0\u0fd8\0\u1026\0\u1074\0\u10c2\0\u1110"+
+    "\0\u115e\0\u11ac\0\u11fa\0\u1248\0\u1296\0\u12e4\0\u1332\0\u1380"+
+    "\0\u13ce\0\u141c\0\u146a\0\u14b8\0\u1506\0\u1554\0\u15a2\0\u15f0"+
+    "\0\u163e\0\u168c\0\u16da\0\u1728\0\u0138\0\u1776\0\u17c4\0\u1812"+
+    "\0\u1860\0\u18ae\0\u18fc\0\u194a\0\u1998\0\u19e6\0\u1a34\0\u1a82"+
+    "\0\u1ad0\0\u1b1e\0\u1b6c\0\u1bba\0\u1c08\0\u1c56\0\u1ca4\0\u1cf2"+
+    "\0\u1d40\0\u1d8e\0\u1ddc\0\u1e2a\0\u1e78\0\u1ec6\0\u1f14\0\u1f62"+
+    "\0\u1fb0\0\u1ffe\0\u204c\0\u209a\0\u20e8\0\u2136\0\u2184\0\u21d2"+
+    "\0\u2220\0\u226e\0\u22bc\0\u230a\0\u2358\0\u23a6\0\u0750\0\u0750"+
+    "\0\u23f4\0\u2442\0\u0750\0\u2490\0\u24de\0\u252c\0\u0750\0\u257a"+
+    "\0\u25c8\0\u2616\0\u2664\0\u26b2\0\u2700\0\u274e\0\u279c\0\u27ea"+
+    "\0\u2838\0\u2886\0\u28d4\0\u2922\0\u2970\0\u29be\0\u2a0c\0\u2a5a"+
+    "\0\u2aa8\0\u2af6\0\u2b44\0\u2b92\0\u2be0\0\u2c2e\0\u2c7c\0\u2cca"+
+    "\0\u2d18\0\u0750\0\u2d66\0\u2db4\0\u2e02\0\u2e50\0\u2e9e\0\u2eec"+
+    "\0\u2f3a\0\u2f88\0\u2fd6\0\u3024\0\u3072\0\u30c0\0\u310e\0\u0fd8"+
+    "\0\u315c\0\u0fd8\0\u31aa\0\u31f8\0\u3246\0\u3294\0\u32e2\0\u3330"+
+    "\0\u337e\0\u33cc\0\u0138\0\u341a\0\u3468\0\u34b6\0\u3504\0\u3552"+
+    "\0\u35a0\0\u35ee\0\u363c\0\u368a\0\u36d8\0\u3726\0\u3774\0\u37c2"+
+    "\0\u3810\0\u385e\0\u0138\0\u38ac\0\u38fa\0\u3948\0\u3996\0\u39e4"+
+    "\0\u3a32\0\u3a80\0\u3ace\0\u3b1c\0\u3b6a\0\u3bb8\0\u3c06\0\u3c54"+
+    "\0\u3ca2\0\u3cf0\0\u3d3e\0\u3d8c\0\u3dda\0\u3e28\0\u3e76\0\u3ec4"+
+    "\0\u3f12\0\u3f60\0\u3fae\0\u3ffc\0\u404a\0\u4098\0\u40e6\0\u4134"+
+    "\0\u4182\0\u41d0\0\u421e\0\u426c\0\u42ba\0\u4308\0\u4356\0\u43a4"+
+    "\0\u43f2\0\u4440\0\u448e\0\u44dc\0\u452a\0\u4578\0\u45c6\0\u4614"+
+    "\0\u4662\0\u46b0\0\u46fe\0\u474c\0\u479a\0\u47e8\0\u4836\0\u4884"+
+    "\0\u48d2\0\u0750\0\u4920\0\u496e\0\u49bc\0\u4a0a\0\u4a58\0\u4aa6"+
+    "\0\u4af4\0\u0750\0\u4b42\0\u4b90\0\u4bde\0\u4c2c\0\u4c7a\0\u4cc8"+
+    "\0\u4d16\0\u4d64\0\u4db2\0\u4e00\0\u4e4e\0\u4e9c\0\u4eea\0\u4f38"+
+    "\0\u4f86\0\u4fd4\0\u5022\0\u5070\0\u50be\0\u510c\0\u515a\0\u51a8"+
+    "\0\u51f6\0\u5244\0\u5292\0\u52e0\0\u532e\0\u537c\0\u53ca\0\u5418"+
+    "\0\u5466\0\u54b4\0\u5502\0\u5550\0\u559e\0\u55ec\0\u563a\0\u5688"+
+    "\0\u56d6\0\u5724\0\u5772\0\u57c0\0\u580e\0\u585c\0\u58aa\0\u58f8"+
+    "\0\u5946\0\u5994\0\u59e2\0\u5a30\0\u5a7e\0\u5acc\0\u5b1a\0\u5b68"+
+    "\0\u5bb6\0\u5c04\0\u5c52\0\u5ca0\0\u5cee\0\u5d3c\0\u5d8a\0\u5dd8"+
+    "\0\u5e26\0\u5e74\0\u5ec2\0\u5f10\0\u5f5e\0\u5fac\0\u5ffa\0\u6048"+
+    "\0\u6096\0\u60e4\0\u6132\0\u6180\0\u61ce\0\u621c\0\u626a\0\u62b8"+
+    "\0\u6306\0\u6354\0\u63a2\0\u63f0\0\u643e\0\u648c\0\u64da\0\u6528"+
+    "\0\u6576\0\u65c4\0\u6612\0\u6660\0\u66ae\0\u66fc\0\u674a\0\u6798"+
+    "\0\u67e6\0\u6834\0\u6882\0\u68d0\0\u691e\0\u696c\0\u69ba\0\u6a08"+
+    "\0\u6a56\0\u6aa4\0\u6af2\0\u6b40\0\u6b8e\0\u6bdc\0\u6c2a\0\u6c78"+
+    "\0\u6cc6\0\u6d14\0\u6d62\0\u6db0\0\u6dfe\0\u6e4c\0\u6e9a\0\u6ee8"+
+    "\0\u6f36\0\u6f84\0\u6fd2\0\u7020\0\u706e\0\u70bc\0\u710a\0\u7158"+
+    "\0\u71a6\0\u71f4\0\u7242\0\u7290\0\u72de\0\u732c\0\u737a\0\u73c8"+
+    "\0\u7416\0\u7464\0\u74b2\0\u7500\0\u754e\0\u759c\0\u75ea\0\u7638"+
+    "\0\u7686\0\u76d4\0\u7722\0\u7770\0\u77be\0\u780c\0\u785a\0\u78a8"+
+    "\0\u78f6\0\u7944\0\u7992\0\u3d3e\0\u79e0\0\u7a2e\0\u7a7c\0\u7aca"+
+    "\0\u7b18\0\u7b66\0\u7bb4\0\u7c02\0\u7c50\0\u7c9e\0\u7cec\0\u7d3a"+
+    "\0\u7d88\0\u7dd6\0\u7e24\0\u7e72\0\u7ec0\0\u7f0e\0\u7f5c\0\u7faa"+
+    "\0\u7ff8\0\u8046\0\u8094\0\u80e2\0\u8130\0\u817e\0\u81cc\0\u821a"+
+    "\0\u8268\0\u82b6\0\u8304\0\u8352\0\u83a0\0\u83ee\0\u0fd8\0\352"+
+    "\0\u843c\0\u848a\0\u84d8\0\u8526\0\u8574\0\u85c2\0\u8610\0\u865e"+
+    "\0\u86ac\0\u86fa\0\u8748\0\u8796\0\u87e4\0\u8832\0\u8880\0\u3246"+
+    "\0\u88ce\0\u891c\0\u7770\0\u896a\0\u785a\0\u89b8\0\u8a06\0\u8a54"+
+    "\0\u8aa2\0\u8af0\0\u8b3e\0\u8b8c\0\u8bda\0\u8c28\0\u8c76\0\u8cc4"+
+    "\0\u8d12\0\u0750\0\u8d60\0\u8dae\0\u8dfc\0\u8e4a\0\u8e98\0\u8ee6"+
+    "\0\u8f34\0\u8f82\0\u8fd0\0\u0138";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[500];
+    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\4\1\5\1\6\1\7\1\5\1\7\1\5\1\10"+
+    "\1\11\1\12\1\13\1\14\1\5\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\32\1\33\1\34\1\35\1\36\1\37"+
+    "\1\40\1\7\1\5\1\41\1\42\1\43\1\44\1\45"+
+    "\1\46\1\30\2\5\1\47\1\5\1\50\1\51\2\4"+
+    "\1\31\1\52\1\36\1\30\1\5\1\53\1\36\1\54"+
+    "\4\5\2\7\1\5\1\55\10\5\1\31\1\36\1\56"+
+    "\1\57\12\60\1\61\30\60\1\62\5\60\1\63\14\60"+
+    "\1\64\2\60\1\65\24\60\12\66\1\67\30\66\1\70"+
+    "\22\66\1\71\2\66\1\72\24\66\7\4\1\0\17\4"+
+    "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+
+    "\1\0\3\4\4\0\2\4\1\0\21\4\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\1\5\1\73"+
+    "\4\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\3\74\1\7\1\74"+
+    "\1\7\1\75\1\0\1\74\1\75\3\74\1\76\4\74"+
+    "\1\77\4\74\11\0\1\74\1\7\1\74\2\0\2\74"+
+    "\1\7\2\0\1\77\1\76\1\100\1\74\1\0\3\74"+
+    "\4\0\2\74\1\0\5\74\2\7\12\74\13\0\1\36"+
+    "\20\0\1\36\65\0\1\4\6\5\1\0\1\5\1\101"+
+    "\1\5\1\102\4\5\1\103\6\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\4\5\1\104\1\105\1\5\1\106\7\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\2\5\1\107\16\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\110\1\111\2\5\1\112\1\113\1\114\1\115\1\116"+
+    "\1\5\1\117\1\120\1\121\1\122\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\123\1\0\1\124\20\5"+
+    "\4\0\1\4\6\5\1\0\2\5\1\125\1\5\1\126"+
+    "\1\5\1\127\10\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\130\7\5\1\131\3\5\1\120\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\132\1\5\1\133\2\5"+
+    "\1\134\1\135\1\5\1\136\1\5\1\137\3\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\140\1\141\1\0"+
+    "\1\142\3\5\1\143\3\5\1\144\10\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\145\12\5\1\146\2\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\2\5\1\147\14\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\150\3\5\1\151"+
+    "\2\5\1\152\3\5\1\153\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\154\1\155\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\4\5\1\156\12\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\157\5\5\1\160\1\161"+
+    "\1\5\1\162\4\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\163\2\5\1\164\1\165\4\5\11\0\1\4"+
+    "\2\5\2\0\1\5\1\166\1\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\167"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\170"+
+    "\6\5\1\165\5\5\1\171\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\1\5\1\172\6\5\1\173\3\5\1\174\2\5"+
+    "\11\0\1\4\2\5\2\0\1\5\1\175\1\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\1\5\1\171\17\5\33\0\1\176\116\0"+
+    "\1\36\233\0\1\36\1\0\1\177\16\0\1\200\44\0"+
+    "\27\201\1\202\3\201\1\203\4\201\1\204\2\201\1\0"+
+    "\52\201\34\0\1\30\116\0\1\30\110\0\1\36\6\0"+
+    "\1\36\56\0\40\42\1\205\2\42\1\206\1\207\51\42"+
+    "\1\4\6\5\1\0\2\5\1\210\3\5\1\210\1\5"+
+    "\1\211\2\5\1\137\1\212\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\1\213\20\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\214\1\215\7\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\216\1\0"+
+    "\21\5\4\0\3\74\1\7\1\74\1\7\1\75\1\0"+
+    "\1\74\1\75\3\74\1\76\4\74\1\77\4\74\11\0"+
+    "\1\74\1\7\1\217\2\0\2\74\1\7\2\0\1\77"+
+    "\1\76\1\100\1\74\1\0\3\74\4\0\2\74\1\0"+
+    "\2\74\1\217\2\74\2\7\12\74\54\0\1\46\50\0"+
+    "\1\100\1\0\1\100\33\0\1\100\5\0\1\100\26\0"+
+    "\2\100\16\0\7\4\1\0\1\220\1\221\1\4\1\222"+
+    "\1\4\1\223\4\4\1\224\1\225\3\4\11\0\3\4"+
+    "\2\0\3\4\1\226\1\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\1\4\6\5"+
+    "\1\0\3\5\1\227\4\5\1\230\3\5\1\231\1\5"+
+    "\1\232\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\4\5\1\233\14\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\134\2\5\1\234\1\5\1\137\2\5\1\235"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\236\1\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\237"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\120\0\1\36\116\0\1\36\12\60\1\0"+
+    "\30\60\1\0\5\60\1\0\14\60\1\0\2\60\1\0"+
+    "\24\60\13\0\1\240\53\0\1\241\60\0\1\242\152\0"+
+    "\1\243\117\0\1\244\24\0\12\66\1\0\30\66\1\0"+
+    "\22\66\1\0\2\66\1\0\24\66\13\0\1\245\53\0"+
+    "\1\246\115\0\1\247\117\0\1\250\24\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\1\5\1\251\1\0\1\252\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\11\5\1\253\1\5\1\254\3\5"+
+    "\1\255\1\5\4\0\7\74\1\0\17\74\11\0\3\74"+
+    "\2\0\3\74\2\0\2\74\1\0\1\74\1\0\3\74"+
+    "\4\0\2\74\1\0\21\74\4\0\3\74\1\256\1\74"+
+    "\1\256\1\74\1\257\17\74\10\0\1\257\1\74\1\256"+
+    "\1\74\2\0\2\74\1\256\2\0\2\74\1\0\1\74"+
+    "\1\0\3\74\4\0\2\74\1\0\5\74\2\256\12\74"+
+    "\4\0\7\74\1\0\12\74\1\260\4\74\11\0\3\74"+
+    "\2\0\3\74\2\0\1\260\1\74\1\0\1\74\1\0"+
+    "\3\74\4\0\2\74\1\0\21\74\4\0\7\74\1\0"+
+    "\5\74\1\260\11\74\11\0\3\74\2\0\3\74\2\0"+
+    "\1\74\1\260\1\0\1\74\1\0\3\74\4\0\2\74"+
+    "\1\0\21\74\4\0\3\74\1\100\1\74\1\100\1\261"+
+    "\1\0\1\74\1\261\1\262\2\74\1\262\11\74\11\0"+
+    "\1\74\1\100\1\74\2\0\2\74\1\100\2\0\1\74"+
+    "\1\262\1\0\1\262\1\0\3\74\4\0\2\74\1\0"+
+    "\5\74\2\100\12\74\4\0\1\4\6\5\1\0\2\5"+
+    "\1\263\14\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\2\5"+
+    "\1\264\14\5\11\0\1\4\2\5\2\0\1\265\2\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\12\5\1\266\4\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\12\5\1\267\4\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\270\10\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\7\5\1\271\7\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\3\5\1\272\7\5\1\273\3\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\274\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\275\1\276\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\5\5\1\277\11\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\10\5\1\300\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\301\7\5\1\136"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\302"+
+    "\15\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\7\5\1\125"+
+    "\3\5\1\303\3\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\5\5\1\304\11\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\7\5\1\160\2\5\1\305\4\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\1\5"+
+    "\1\306\1\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\307\15\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\10\5\1\310\6\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\311\15\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\6\5\1\134\1\312\3\5\1\137\3\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\313\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\314\4\5\1\315\1\316"+
+    "\2\5\1\317\1\320\1\321\1\322\1\323\1\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\2\5"+
+    "\1\324\16\5\4\0\1\4\6\5\1\0\1\5\1\325"+
+    "\1\5\1\326\13\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\4\5\1\327\4\5\1\330\3\5\1\331\1\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\332\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\4\5\1\333\10\5\1\334\1\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\3\5\1\335\15\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\136\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+    "\1\336\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+    "\1\337\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\160\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+    "\1\340\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\341\4\5\1\342\2\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\343\2\5\1\134\4\5\1\137\3\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\6\5\1\344\10\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\7\5\1\272\7\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\4\5\1\345\7\5"+
+    "\1\174\1\346\1\347\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\350\1\0\1\351\20\5\4\0\1\4"+
+    "\6\5\1\0\3\5\1\352\1\310\12\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\2\5\1\353\14\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\3\5\1\354\13\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\355\6\5\1\356\6\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\4\5\1\357\1\5"+
+    "\1\333\10\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\360\1\270\10\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\14\5\1\361\2\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\3\5\1\227\13\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\3\5\1\362\2\5\1\363\6\5\1\364\1\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\7\5\1\275\7\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\3\5\1\365\13\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\1\273\20\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\366\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\3\5\1\367\2\5\1\370\2\5\1\171"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\306"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\371\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\6\5\1\273\1\5"+
+    "\1\144\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\372\6\5\1\373\3\5\1\374\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\375\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\155\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\16\5\1\376\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\276\16\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\360\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\303\1\377\1\u0100\7\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\216\1\0\21\5\34\0\10\36"+
+    "\56\0\33\u0101\1\u0102\7\u0101\1\0\101\u0101\1\u0103\3\u0101"+
+    "\1\u0102\7\u0101\1\0\57\u0101\1\u0104\4\u0101\1\201\1\u0101"+
+    "\1\201\2\u0101\1\201\4\u0101\1\201\2\u0101\1\201\3\u0101"+
+    "\1\u0105\4\u0101\1\201\1\u0106\1\u0107\1\0\3\201\1\u0106"+
+    "\17\u0101\1\201\3\u0101\1\u0107\2\u0101\2\u0106\16\u0101\5\206"+
+    "\1\42\4\206\1\42\1\206\1\42\2\206\1\42\4\206"+
+    "\1\42\2\206\1\42\3\206\1\42\4\206\2\42\1\u0108"+
+    "\1\0\4\42\17\206\1\42\3\206\1\u0108\2\206\2\42"+
+    "\56\206\1\u0109\3\206\1\u010a\51\206\1\4\6\5\1\0"+
+    "\13\5\1\137\3\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\1\213\20\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\u010b\1\5\1\u010c\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\1\5\1\u010d\4\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\137\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\u010e\15\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\u010f\15\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\u0110\6\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\3\74\4\u0111\1\0\3\u0111\6\74\1\u0111\2\74\1\u0111"+
+    "\2\74\11\0\1\74\1\u0111\1\74\2\0\1\74\2\u0111"+
+    "\2\0\2\74\1\0\1\u0111\1\0\3\74\4\0\2\74"+
+    "\1\0\5\74\2\u0111\2\74\2\u0111\5\74\1\u0111\4\0"+
+    "\7\4\1\0\1\4\1\u0112\15\4\11\0\3\4\2\0"+
+    "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+
+    "\2\4\1\0\21\4\4\0\7\4\1\0\4\4\1\u0113"+
+    "\1\u0114\1\4\1\u0115\7\4\11\0\3\4\2\0\3\4"+
+    "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+
+    "\1\0\21\4\4\0\7\4\1\0\2\4\1\u0116\1\4"+
+    "\1\u0117\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\4\0\7\4\1\0\3\4\1\u0118\13\4\11\0\3\4"+
+    "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+    "\4\0\2\4\1\0\21\4\4\0\7\4\1\0\4\4"+
+    "\1\u0119\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\4\0\7\4\1\0\7\4\1\u011a\7\4\11\0\3\4"+
+    "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+    "\4\0\2\4\1\0\21\4\14\0\1\u011b\1\u011c\1\0"+
+    "\1\u011d\1\0\1\u011e\4\0\1\u011f\1\u0120\24\0\1\226"+
+    "\45\0\1\4\6\5\1\0\16\5\1\u0121\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\5\5\1\315\4\5\1\320\4\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\4\5\1\333\12\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\13\5\1\u0122\3\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\13\5\1\u0123\3\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\6\5\1\u0124\1\u0125"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\u0126"+
+    "\1\u0127\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\172\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\u0128\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+    "\1\144\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\21\0\1\u0129\123\0\1\u012a\161\0"+
+    "\1\u012b\117\0\1\u012c\41\0\1\u012d\123\0\1\u012e\161\0"+
+    "\1\u012f\117\0\1\u0130\24\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\14\5\1\u0131\4\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\14\5\1\u0132\4\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\12\5\1\u0133\6\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\14\5\1\u0134\4\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\13\5\1\u0135\5\5\4\0\3\74\1\256\1\74\1\256"+
+    "\1\74\1\0\5\74\1\76\4\74\1\77\4\74\11\0"+
+    "\1\74\1\256\1\74\2\0\2\74\1\256\2\0\1\77"+
+    "\1\76\1\0\1\74\1\0\3\74\4\0\2\74\1\0"+
+    "\5\74\2\256\12\74\7\0\1\256\1\0\1\256\33\0"+
+    "\1\256\5\0\1\256\26\0\2\256\16\0\3\74\1\u0136"+
+    "\1\74\1\u0136\1\74\1\u0137\17\74\10\0\1\u0137\1\74"+
+    "\1\u0136\1\74\2\0\2\74\1\u0136\2\0\2\74\1\0"+
+    "\1\74\1\0\3\74\4\0\2\74\1\0\5\74\2\u0136"+
+    "\12\74\4\0\1\4\6\5\1\0\14\5\1\u0138\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\2\5\1\171\14\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\1\5\1\126\4\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\1\5\1\u0139\1\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\16\5\1\125\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\125\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u013a\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\273\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\u013b\15\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u013c\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\2\5\1\273\14\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\12\5\1\u013d\4\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\u013e\3\5\1\126\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u013f\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0140"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\273"+
+    "\6\5\1\u0141\3\5\1\310\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\2\5\1\u0142\16\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\367\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\10\5\1\352\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\u0143\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\273\10\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\u0144\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\273\16\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\5\5\1\354\11\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\u0145\13\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\u0146\13\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\10\5\1\u0147\6\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\13\5\1\u0148\3\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\4\5\1\u0149\12\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\13\5\1\u014a\3\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\7\5\1\u014b\2\5\1\u014c\4\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\5\5\1\u014d\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u014e\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\314\16\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\2\5\1\u0142\16\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\1\265"+
+    "\2\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\15\5\1\u014f\1\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\14\5\1\u0150\2\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\6\5\1\u0151\12\5\4\0\1\4\6\5"+
+    "\1\0\5\5\1\u0152\11\5\11\0\1\4\2\5\2\0"+
+    "\1\u0153\1\u0154\1\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\7\5\1\u0155"+
+    "\11\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\273\1\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u0156\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u0157\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\310\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\276\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\7\5\1\126\7\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\157\1\171\1\5"+
+    "\1\u0158\1\303\1\u0159\1\u015a\1\5\1\u015b\1\u015c\1\u015d"+
+    "\3\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u015e\1\0\2\5\1\u015f\16\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u0160\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0161\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0162"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\227"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u0163"+
+    "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u0164"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\12\5\1\u013b"+
+    "\4\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\336"+
+    "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0121"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0165"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\5\5\1\273"+
+    "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\u0166"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\u013f"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0167"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0168\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\u0169\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\313\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+    "\1\u016a\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\u016b\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\u016c\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\4\5"+
+    "\1\u016d\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\6\5"+
+    "\1\273\2\5\1\u016e\5\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\1\u016f\20\5\4\0\1\4"+
+    "\6\5\1\0\4\5\1\273\12\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\144\15\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\10\5\1\125\6\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\2\5\1\u0170\16\5\4\0\1\4"+
+    "\6\5\1\0\2\5\2\273\1\5\1\273\11\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u0171\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u0172\4\5\1\273"+
+    "\2\5\1\u016e\5\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\1\u016f\20\5\4\0\1\4\6\5"+
+    "\1\0\6\5\1\u0173\2\5\1\u0174\4\5\1\347\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\3\5\1\u0175\3\5\1\u0176"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0177\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\303\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\216\1\0\21\5\4\0\33\u0101\1\203\7\u0101"+
+    "\1\0\102\u0101\3\201\1\u0105\4\201\3\u0101\1\0\57\u0101"+
+    "\1\201\25\u0101\1\u0102\5\u0101\1\201\1\u0101\1\0\3\u0101"+
+    "\1\201\26\u0101\2\201\16\u0101\33\0\1\u0102\62\0\5\u0101"+
+    "\1\u0104\25\u0101\1\u0102\5\u0101\1\u0104\1\u0101\1\0\3\u0101"+
+    "\1\u0104\26\u0101\2\u0104\21\u0101\4\u0178\1\u0101\3\u0178\6\u0101"+
+    "\1\u0178\2\u0101\1\u0178\6\u0101\1\203\5\u0101\1\u0178\1\u0101"+
+    "\1\0\2\u0101\2\u0178\5\u0101\1\u0178\20\u0101\2\u0178\2\u0101"+
+    "\2\u0178\5\u0101\1\u0178\4\u0101\3\206\4\u0179\1\206\3\u0179"+
+    "\6\206\1\u0179\2\206\1\u0179\13\206\1\u0109\1\u0179\2\206"+
+    "\1\u010a\1\206\2\u0179\5\206\1\u0179\20\206\2\u0179\2\206"+
+    "\2\u0179\5\206\1\u0179\47\206\1\0\52\206\1\4\6\5"+
+    "\1\0\1\313\16\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\14\5\1\u017a\2\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\336\4\5\1\u017b\5\5\1\u017c\2\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\14\5\1\u017d\2\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\14\5\1\u017e\2\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\1\u017f\20\5\4\0"+
+    "\3\74\4\u0111\1\0\3\u0111\2\74\1\u0180\3\74\1\u0111"+
+    "\1\u0181\1\74\1\u0111\2\74\11\0\1\74\1\u0111\1\74"+
+    "\2\0\1\74\2\u0111\2\0\1\u0181\1\u0180\1\0\1\u0111"+
+    "\1\0\3\74\4\0\2\74\1\0\5\74\2\u0111\2\74"+
+    "\2\u0111\5\74\1\u0111\4\0\7\4\1\0\2\4\1\223"+
+    "\14\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+
+    "\1\4\1\0\3\4\4\0\2\4\1\0\21\4\4\0"+
+    "\7\4\1\0\1\u0182\16\4\11\0\3\4\2\0\3\4"+
+    "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+
+    "\1\0\21\4\4\0\7\4\1\0\3\4\1\u0183\2\4"+
+    "\1\u0184\10\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\4\0\7\4\1\0\7\4\1\u0185\7\4\11\0\3\4"+
+    "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+    "\4\0\2\4\1\0\21\4\4\0\7\4\1\0\1\u0186"+
+    "\3\4\1\u0119\12\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\11\4\1\u0187\5\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\4\4\1\u0184\12\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\1\u0186\16\4\11\0\3\4"+
+    "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+    "\4\0\2\4\1\0\21\4\4\0\7\4\1\0\14\4"+
+    "\1\u0188\2\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\15\0\1\u0189\120\0\1\u018a\1\u018b\1\0\1\u018c\110\0"+
+    "\1\u018d\1\0\1\u018e\114\0\1\u018f\116\0\1\u0190\120\0"+
+    "\1\u0191\76\0\1\4\6\5\1\0\1\5\1\273\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\2\5\1\u0192\1\5"+
+    "\1\u0193\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\u0194\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\2\5"+
+    "\1\171\1\5\1\u0158\1\303\1\u0159\1\u0195\1\5\1\u015b"+
+    "\1\5\1\u015d\3\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\u0196\1\0\2\5\1\u015f\16\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\u0197\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\14\5\1\u0198\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\10\5\1\u0199\6\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\5\5\1\270\11\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\15\0\1\u012a"+
+    "\174\0\1\u019a\50\0\1\u019b\146\0\1\u019c\52\0\1\u012e"+
+    "\174\0\1\u019d\50\0\1\u019e\146\0\1\u019f\41\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\16\5\1\u01a0\2\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\1\5\1\u01a0\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\13\5\1\u01a0\5\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\15\5\1\u01a0\3\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\11\5\1\u01a1\7\5\4\0\3\74\1\u0136"+
+    "\1\74\1\u0136\1\74\1\0\2\74\1\262\2\74\1\262"+
+    "\11\74\11\0\1\74\1\u0136\1\74\2\0\2\74\1\u0136"+
+    "\2\0\1\74\1\262\1\0\1\262\1\0\3\74\4\0"+
+    "\2\74\1\0\5\74\2\u0136\12\74\7\0\1\u0136\1\0"+
+    "\1\u0136\33\0\1\u0136\5\0\1\u0136\26\0\2\u0136\16\0"+
+    "\1\4\6\5\1\0\12\5\1\u01a2\4\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\5\5\1\u01a3\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\273\6\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u016a\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\u013e\6\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\u01a4\10\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\273\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\1\5\1\273\17\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\164\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\303\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\273\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\273\2\5\1\273\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\1\u01a5\20\5\4\0\1\4\6\5\1\0\6\5\1\273"+
+    "\2\5\1\273\1\5\1\164\3\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\1\u01a5\20\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\u0121\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\15\5\1\u0170\1\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\1\u01a6\20\5\4\0\1\4\6\5"+
+    "\1\0\14\5\1\u01a7\2\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u01a8\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\13\5\1\u01a6\3\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\3\5\1\u01a9\13\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\4\5\1\u01aa\12\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\4\5\1\u01ab\6\5\1\u01ac\3\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\14\5\1\u01ad\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\7\5\1\u0155\11\5\4\0\1\4"+
+    "\6\5\1\0\5\5\1\u01ae\11\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\2\5"+
+    "\1\273\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\10\5\1\u01af\6\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\1\5\1\u0154"+
+    "\1\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\12\5\1\276\4\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\16\5\1\u0142\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\u010b\12\5\1\354\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\1\5\1\126\4\5\1\0\10\5\1\u01b0\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\11\5\1\u01b1\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\13\5\1\367\3\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\u013e\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\11\5\1\u01b2\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\6\5\1\u01b3\1\5"+
+    "\1\311\2\5\1\u01b4\1\272\1\5\1\u0142\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\u013e\1\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\11\5\1\u0167\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\1\5\1\u01b5\1\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\10\5\1\u01b6\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\2\5\1\u01b7\14\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\3\5\1\u01b8\13\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\11\5\1\u01b9\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u01ba\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\6\5\1\u01bb\10\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\1\u0121\2\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\u01bc\15\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u01bd\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\125\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\3\5\1\u01be\13\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\10\5\1\u017f\6\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\4\5\1\125\12\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\15\5\1\u01bf\1\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\u01c0\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\276\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\u01c1"+
+    "\1\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\u016e\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\272\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\5\5\1\273\13\5\4\0\1\4\6\5\1\0\4\5"+
+    "\1\u01c2\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\272\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\13\5"+
+    "\1\u01b4\2\5\1\u0142\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\u013e\1\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\4\5\1\u0170\12\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u0177\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\10\5\1\u01c3\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\3\u0101\4\201\1\u0101"+
+    "\3\201\6\u0101\1\201\2\u0101\1\201\6\u0101\1\203\5\u0101"+
+    "\1\201\1\u0101\1\0\2\u0101\2\201\5\u0101\1\201\20\u0101"+
+    "\2\201\2\u0101\2\201\5\u0101\1\201\4\u0101\3\206\4\42"+
+    "\1\206\3\42\6\206\1\42\2\206\1\42\13\206\1\u0109"+
+    "\1\42\2\206\1\u010a\1\206\2\42\5\206\1\42\20\206"+
+    "\2\42\2\206\2\42\5\206\1\42\4\206\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\236\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u01c4\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\u01c5\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\u01c6\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\1\5\1\125\17\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\273\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\7\74\1\0\12\74\1\u01c7"+
+    "\4\74\11\0\3\74\2\0\3\74\2\0\1\u01c7\1\74"+
+    "\1\0\1\74\1\0\3\74\4\0\2\74\1\0\21\74"+
+    "\4\0\7\74\1\0\5\74\1\u01c7\11\74\11\0\3\74"+
+    "\2\0\3\74\2\0\1\74\1\u01c7\1\0\1\74\1\0"+
+    "\3\74\4\0\2\74\1\0\21\74\4\0\7\4\1\0"+
+    "\3\4\1\u0183\13\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\2\4\1\u01c8\14\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\1\4\1\u01c8\15\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\10\4\1\u01c9\6\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\1\4\1\u0183\15\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\5\4\1\u01ca\11\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\15\4\1\u01cb\1\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\16\0\1\u011e\113\0\1\u01cc\120\0\1\u01cd\2\0"+
+    "\1\u01ce\116\0\1\u01cf\106\0\1\u01d0\3\0\1\u0190\122\0"+
+    "\1\u01d1\110\0\1\u01ce\111\0\1\u01d0\131\0\1\u01d2\71\0"+
+    "\1\4\6\5\1\0\3\5\1\u01d3\13\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\14\5\1\u01ba\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\u01d4\16\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\11\5\1\u01b2\5\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\u01d5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\u01d6\6\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\u01d7\6\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u01d8\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\16\5\1\u01d9\11\0\1\4\2\5"+
+    "\2\0\1\5\1\273\1\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\36\0\1\u01da\101\0\1\u012a\51\0\1\u019a\26\0\1\u019c"+
+    "\1\u01db\4\u019c\1\u01db\17\u019c\3\u01db\1\u019c\1\u01db\2\0"+
+    "\2\u01db\1\0\2\u019c\2\0\3\u019c\1\0\1\u01db\2\u019c"+
+    "\1\u01db\1\u019c\1\0\1\u01db\1\u019c\5\u01db\2\u019c\1\u01db"+
+    "\21\u019c\2\0\1\u01db\33\0\1\u01dc\101\0\1\u012e\51\0"+
+    "\1\u019d\26\0\1\u019f\1\u01dd\4\u019f\1\u01dd\17\u019f\3\u01dd"+
+    "\1\u019f\1\u01dd\2\0\2\u01dd\1\0\2\u019f\2\0\3\u019f"+
+    "\1\0\1\u01dd\2\u019f\1\u01dd\1\u019f\1\0\1\u01dd\1\u019f"+
+    "\5\u01dd\2\u019f\1\u01dd\21\u019f\2\0\1\u01dd\1\0\1\4"+
+    "\5\5\1\u01de\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\20\5\1\u01de\4\0\1\4\6\5\1\0"+
+    "\5\5\1\u0167\11\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\313\15\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\273\2\5\1\273\5\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\u013e\15\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\11\5\1\u0121\5\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\7\5\1\354\7\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\4\5\1\272\12\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\11\5\1\272\5\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\12\5\1\u01ba\4\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\u01df\1\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\13\5\1\u01a4\3\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\1\5\1\u01e0\15\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\155\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\11\5\1\u01e1\5\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\2\5\1\125\14\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\13\5\1\u01b4\1\272\1\5\1\u0142\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\u013e\1\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\367\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\4\5\1\273\14\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u013f\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\273\4\5\1\273\4\5\1\354"+
+    "\4\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\1\5\1\273\17\5\4\0\1\4\6\5\1\0"+
+    "\7\5\1\u01ba\7\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\11\5\1\125\5\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\125"+
+    "\1\5\1\0\21\5\4\0\1\4\6\5\1\0\16\5"+
+    "\1\273\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\u01e2\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\u01e3\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u01e4\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u01e5\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u01e6\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\11\5\1\273\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\1\u017f"+
+    "\20\5\4\0\1\4\6\5\1\0\14\5\1\u013e\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\1\273\2\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\1\u01e7\20\5\4\0"+
+    "\1\4\6\5\1\0\14\5\1\144\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\15\5\1\273\1\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\11\5\1\u01a4\5\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\7\4\1\0\7\4\1\u01c8\7\4\11\0\3\4\2\0"+
+    "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+
+    "\2\4\1\0\21\4\4\0\7\4\1\0\12\4\1\u01e8"+
+    "\4\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+
+    "\1\4\1\0\3\4\4\0\2\4\1\0\21\4\4\0"+
+    "\7\4\1\0\16\4\1\u01e9\11\0\3\4\2\0\3\4"+
+    "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+
+    "\1\0\21\4\17\0\1\u01cd\114\0\1\u01ea\114\0\1\u01ea"+
+    "\124\0\1\u01eb\106\0\1\u01cd\121\0\1\u01ec\125\0\1\u01ed"+
+    "\70\0\1\4\6\5\1\0\5\5\1\u0121\11\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u01b0\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\10\5\1\u01ee\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\273\4\5\1\273\4\5"+
+    "\1\354\3\5\1\120\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\1\5\1\273\17\5\4\0\1\4"+
+    "\6\5\1\0\16\5\1\u01d9\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\1\5\1\273"+
+    "\1\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\36\0\1\u019c\115\0"+
+    "\1\u019f\63\0\1\4\1\5\1\u01ef\4\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\14\5\1\273\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\11\5\1\u01f0\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\14\5\1\u01d3\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u01f1\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\10\5\1\276\6\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\7\5\1\u013e\7\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\12\5\1\270\4\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u010b\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\11\5\1\306\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\7\4\1\0\1\u0184\16\4\11\0\3\4"+
+    "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+    "\4\0\2\4\1\0\21\4\4\0\7\4\1\0\14\4"+
+    "\1\u01c8\2\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\23\0\1\u01ea\120\0\1\u01f2\121\0\1\u01f3\67\0\1\4"+
+    "\6\5\1\0\16\5\1\120\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\1\5"+
+    "\1\u01f4\4\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\10\5\1\u0172\6\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\7\5\1\125\7\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\14\0\1\u01ce\131\0"+
+    "\1\u01ea\71\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[36894];
+    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 =
+    "\3\0\25\1\1\11\4\1\1\11\2\1\1\11\6\1"+
+    "\1\11\1\1\1\11\7\1\1\11\5\1\1\11\105\1"+
+    "\1\0\2\11\2\1\1\11\3\1\1\11\16\1\1\0"+
+    "\11\1\2\0\1\11\6\0\6\1\1\0\122\1\1\11"+
+    "\7\1\1\11\20\1\6\0\10\1\10\0\6\1\1\0"+
+    "\121\1\4\0\1\1\4\0\10\1\2\0\1\1\2\0"+
+    "\55\1\7\0\7\1\4\0\14\1\1\11\3\0\4\1"+
+    "\2\0\1\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[500];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 CTokenMaker(java.io.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 CTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 184) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 27: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 30: break;
+        case 7: 
+          { addNullToken(); return firstToken;
+          }
+        case 31: break;
+        case 24: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 32: break;
+        case 21: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 33: break;
+        case 17: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 34: break;
+        case 9: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 35: break;
+        case 26: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 36: break;
+        case 18: 
+          { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/
+          }
+        case 37: break;
+        case 25: 
+          { addToken(Token.ERROR_STRING_DOUBLE);
+          }
+        case 38: break;
+        case 14: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 39: break;
+        case 15: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 40: break;
+        case 5: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 41: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 42: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 43: break;
+        case 16: 
+          { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+          }
+        case 44: break;
+        case 22: 
+          { addToken(Token.FUNCTION);
+          }
+        case 45: break;
+        case 6: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 46: break;
+        case 8: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 47: break;
+        case 23: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 48: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 49: break;
+        case 19: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 50: break;
+        case 20: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 51: break;
+        case 29: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 52: break;
+        case 28: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 53: break;
+        case 13: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 54: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 55: break;
+        case 4: 
+          { addToken(Token.OPERATOR);
+          }
+        case 56: break;
+        case 10: 
+          { 
+          }
+        case 57: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 58: 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 501: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 502: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 503: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.flex
new file mode 100644
index 0000000..7838ea5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.flex
@@ -0,0 +1,568 @@
+/*
+ * 12/23/2010
+ *
+ * ClojureTokenMaker.java - Scanner for Clojure.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Clojure programming language.<p>
+ *
+ * This was graciously donated by the folks at the
+ * <a href="http://pacific.mpi-cbg.de/wiki/index.php/Fiji">Fiji</a> project.
+ * Its original location was
+ * <a href="http://pacific.mpi-cbg.de/cgi-bin/gitweb.cgi?p=fiji.git;a=tree;f=src-plugins/Script_Editor/fiji/scripting;hb=935d85d9d88dd780c6d5f2765937ddc18b5008ca">here</a>.
+ * <p>
+ * 
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated ClojureTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ *
+ */
+%%
+
+%public
+%class ClojureTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public ClojureTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			/*case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;*/
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+	}
+
+
+%}
+
+
+LineCommentBegin						= (";")
+Keyword                                 =  ([:][a-zA-Z?!\-+*/][a-zA-Z0-9?!\-+*/]*)
+NonzeroDigit						    = [1-9]
+Digit							        = ("0"|{NonzeroDigit})
+HexDigit							    = ({Digit}|[A-Fa-f])
+OctalDigit						        = ([0-7])
+EscapedSourceCharacter				    = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape							        = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
+AnyCharacterButDoubleQuoteOrBackSlash	= ([^\\\"\n])
+UnclosedStringLiteral					= ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral						= ({UnclosedStringLiteral}[\"])
+StringLiteral                           = ([\"])
+CharLiteral                        		= ("\\."|"\\space"|"\\tab"|"\\newline")
+AnyCharacter                            = ([.]*)
+Separator								= ([\(\)\{\}\[\]])
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\'])
+
+BooleanLiteral						=("true"|"false")
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral				= ({IntegerHelper1}[lL]?)
+HexLiteral				= ({IntegerHelper2}[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}+)
+
+
+Nil                         = ("nil")
+Quote                       = (\('\|`\))
+Unquote                     = (\(\~@\|\~\))
+DispatchStart               = ("#^"|"#^{")
+Dispatch 					= ({DispatchStart}[^\s\t\n;\"}]*([ \t\n;\"]|"}"))
+VarQuote                    = ("#'"[.]*[ \t\n;(\"])
+DefName 					= (\s*[a-zA-Z0-9?!\-+*\./<>]*)
+
+NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"<"|"*"|">="|"%"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|">>>")
+AssignmentOperator			= ("=")
+Operator					= ({NonAssignmentOperator}|{AssignmentOperator})
+
+Letter					= [A-Za-z]
+LetterOrUnderscore		= ({Letter}|[_])
+Digit					= [0-9]
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state STRING
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+"case" |
+"class" |
+"cond" |
+"condp" |
+"def" |
+"defmacro" |
+"defn" |
+"do" |
+"fn" |
+"for" |
+"if" |
+"if-let" |
+"if-not" |
+"instance?" |
+"let" |
+"loop" |
+"monitor-enter" |
+"monitor-exit" |
+"new" |
+"quote" |
+"recur" |
+"set!" |
+"this" |
+"throw" |
+"try-finally" |
+"var" |
+"when" |
+"when-first" |
+"when-let" |
+"when-not"        { addToken(Token.RESERVED_WORD); }
+
+"*warn-on-reflection*" |
+"*1" |
+"*2" |
+"*3" |
+"*agent*" |
+"*allow-unresolved-args*" |
+"*assert*" |
+"*clojure-version*" |
+"*command-line-args*" |
+"*compile-files*" |
+"*compile-path*" |
+"*e" |
+"*err*" |
+"*file*" |
+"*flush-on-newline*" |
+"*fn-loader*" |
+"*in*" |
+"*math-context*" |
+"*ns*" |
+"*out*" |
+"*print-dup*" |
+"*print-length*" |
+"*print-level*" |
+"*print-meta*" |
+"*print-readably*" |
+"*read-eval*" |
+"*source-path*" |
+"*unchecked-math*" |
+"*use-context-classloader*"		{ addToken(Token.VARIABLE); }
+
+"*current-namespace*" |
+"*in*" |
+"*out*" |
+"*print-meta*"
+"->" |
+".." |
+"agent" |
+"agent-errors" |
+"agent-of" |
+"aget" |
+"alter" |
+"and" |
+"any" |
+"appl" |
+"apply" |
+"array" |
+"aset" |
+"aset-boolean" |
+"aset-byte" |
+"aset-double" |
+"aset-float" |
+"aset-int" |
+"aset-long" |
+"aset-short" |
+"assoc" |
+"binding" |
+"boolean" |
+"byte" |
+"char" |
+"clear-agent-errors" |
+"commute" |
+"comp" |
+"complement" |
+"concat" |
+"conj" |
+"cons" |
+"constantly" |
+"count" |
+"cycle" |
+"dec" |
+"defmethod" |
+"defmulti" |
+"delay" |
+"deref" |
+"dissoc" |
+"doseq" |
+"dotimes" |
+"doto" |
+"double" |
+"drop" |
+"drop-while" |
+"ensure" |
+"eql-ref?" |
+"eql?" |
+"eval" |
+"every" |
+"ffirst" |
+"filter" |
+"find" |
+"find-var" |
+"first" |
+"float" |
+"fnseq" |
+"frest" |
+"gensym" |
+"get" |
+"hash-map" |
+"identity" |
+"implement" |
+"import" |
+"in-namespace" |
+"inc" |
+"int" |
+"into" |
+"into-array" |
+"iterate" |
+"key" |
+"keys" |
+"lazy-cons" |
+"list" |
+"list*" |
+"load-file" |
+"locking" |
+"long" |
+"make-array" |
+"make-proxy" |
+"map" |
+"mapcat" |
+"max" |
+"memfn" |
+"merge" |
+"meta" |
+"min" |
+"name" |
+"namespace" |
+"neg?" |
+"newline" |
+"nil?" |
+"not" |
+"not-any" |
+"not-every" |
+"nth" |
+"or" |
+"peek" |
+"pmap" |
+"pop" |
+"pos?" |
+"print" |
+"prn" |
+"quot" |
+"range" |
+"read" |
+"reduce" |
+"ref" |
+"refer" |
+"rem" |
+"remove-method" |
+"repeat" |
+"replicate" |
+"rest" |
+"reverse" |
+"rfirst" |
+"rrest" |
+"rseq" |
+"second" |
+"seq" |
+"set" |
+"short" |
+"sorted-map" |
+"sorted-map-by" |
+"split-at" |
+"split-with" |
+"str" |
+"strcat" |
+"sym" |
+"sync" |
+"take" |
+"take-while" |
+"time" |
+"unimport" |
+"unintern" |
+"unrefer" |
+"val" |
+"vals" |
+"vector" |
+"with-meta" |
+"zero?" |
+"zipmap"      				{ addToken(Token.FUNCTION); }
+
+{LineTerminator}				{ addNullToken(); return firstToken; }
+
+{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+{StringLiteral}				{ start = zzMarkedPos-1; yybegin(STRING); }
+	//{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	//{ErrorStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); }
+
+{Nil}                           { addToken(Token.DATA_TYPE); }
+
+{BooleanLiteral}				{ addToken(Token.LITERAL_BOOLEAN); }
+
+
+{Quote}							{ addToken(Token.SEPARATOR); }
+{Unquote}						{ addToken(Token.SEPARATOR); }
+{VarQuote}						{ addToken(Token.SEPARATOR); }
+{Dispatch}						{ addToken(Token.DATA_TYPE); }
+
+{LineCommentBegin}			{ start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
+
+{Separator}					{ addToken(Token.SEPARATOR); }
+
+{Operator}					{ addToken(Token.OPERATOR); }
+
+{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); }
+{Keyword}						{ addToken(Token.PREPROCESSOR); }
+{DefName}						{ addToken(Token.IDENTIFIER); }
+
+<<EOF>>						{ addNullToken(); return firstToken; }
+
+.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<STRING> {
+
+	[^\n\"]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	"\"\""				{}
+	"\""					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+
+}
+
+<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; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.java
new file mode 100644
index 0000000..6d2304d
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.java
@@ -0,0 +1,2296 @@
+/* The following code was generated by JFlex 1.4.1 on 7/30/12 10:59 PM */
+
+/*
+ * 12/23/2010
+ *
+ * ClojureTokenMaker.java - Scanner for Clojure.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Clojure programming language.<p>
+ *
+ * This was graciously donated by the folks at the
+ * <a href="http://pacific.mpi-cbg.de/wiki/index.php/Fiji">Fiji</a> project.
+ * Its original location was
+ * <a href="http://pacific.mpi-cbg.de/cgi-bin/gitweb.cgi?p=fiji.git;a=tree;f=src-plugins/Script_Editor/fiji/scripting;hb=935d85d9d88dd780c6d5f2765937ddc18b5008ca">here</a>.
+ * <p>
+ * 
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated ClojureTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ *
+ */
+
+public class ClojureTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int EOL_COMMENT = 2;
+  public static final int STRING = 1;
+  public static final int YYINITIAL = 0;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\57\1\16\1\0\1\37\1\35\22\0\1\60\1\70\1\17"+
+    "\1\53\1\72\1\66\1\66\1\12\1\45\1\50\1\65\1\62\1\73"+
+    "\1\44\1\20\1\67\1\4\1\15\1\15\1\15\4\7\2\5\1\2"+
+    "\1\1\1\63\1\64\1\61\1\36\1\52\3\6\1\42\1\43\1\42"+
+    "\5\3\1\41\13\3\1\40\2\3\1\34\1\11\1\34\1\54\1\71"+
+    "\1\47\1\23\1\27\1\24\1\76\1\25\1\14\1\104\1\74\1\33"+
+    "\1\105\1\106\1\32\1\77\1\30\1\75\1\22\1\101\1\13\1\21"+
+    "\1\26\1\10\1\103\1\31\1\100\1\102\1\107\1\55\1\46\1\56"+
+    "\1\51\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 =
+    "\1\1\2\0\1\2\1\3\1\4\1\1\2\5\1\1"+
+    "\1\2\2\1\1\6\1\7\14\1\1\10\1\4\1\11"+
+    "\1\10\1\4\1\2\4\4\11\1\1\12\1\13\1\14"+
+    "\2\12\1\15\2\12\1\16\2\17\1\20\1\17\2\21"+
+    "\1\17\1\5\1\17\1\1\1\22\3\0\6\1\1\23"+
+    "\3\1\1\24\52\1\1\23\4\1\4\0\1\4\3\1"+
+    "\1\25\4\1\1\25\11\1\1\23\13\1\1\12\4\0"+
+    "\1\20\1\21\1\1\1\20\2\1\3\0\4\1\1\24"+
+    "\5\1\1\24\4\1\1\23\2\1\2\24\40\1\1\23"+
+    "\1\26\1\24\13\1\1\24\3\1\2\0\2\26\26\1"+
+    "\1\23\10\1\1\24\4\1\4\0\3\1\2\0\4\1"+
+    "\1\24\4\1\2\24\2\1\1\24\1\23\1\24\3\1"+
+    "\1\27\1\1\1\24\3\1\1\24\3\1\1\23\1\1"+
+    "\1\24\5\1\1\24\3\1\2\0\26\1\1\24\2\1"+
+    "\1\0\1\30\1\0\1\1\2\0\7\1\1\24\52\1"+
+    "\2\0\1\1\1\0\176\1\1\24\50\1\1\25\44\1";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[627];
+    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\330\0\u0120\0\u0168\0\u01b0"+
+    "\0\u01f8\0\u0240\0\u0288\0\u02d0\0\u0318\0\330\0\330\0\u0360"+
+    "\0\u03a8\0\u03f0\0\u0438\0\u0480\0\u04c8\0\u0510\0\u0558\0\u05a0"+
+    "\0\u05e8\0\u0630\0\u0678\0\330\0\u0168\0\u06c0\0\u0708\0\330"+
+    "\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\330"+
+    "\0\u0b88\0\u0bd0\0\u0c18\0\330\0\u0c60\0\u0ca8\0\u0cf0\0\u0d38"+
+    "\0\u0d80\0\u0dc8\0\u0e10\0\u0d80\0\u0e58\0\u0ea0\0\u0d80\0\u0ee8"+
+    "\0\u0f30\0\330\0\u0f78\0\u0fc0\0\u1008\0\u1050\0\u1098\0\u10e0"+
+    "\0\u1128\0\u1170\0\u11b8\0\u1200\0\u1248\0\u1290\0\u12d8\0\u0168"+
+    "\0\u1320\0\u1368\0\u13b0\0\u13f8\0\u1440\0\u1488\0\u14d0\0\u1518"+
+    "\0\u1560\0\u15a8\0\u15f0\0\u1638\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\u0168"+
+    "\0\u2298\0\u22e0\0\u2328\0\u2370\0\u23b8\0\u2400\0\u2448\0\u2490"+
+    "\0\u24d8\0\u2520\0\u2568\0\u25b0\0\u25f8\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\330\0\u29e8\0\u2a30\0\u2a78\0\u2ac0\0\u0d80"+
+    "\0\u2b08\0\u2b50\0\u2b98\0\u2be0\0\u2c28\0\u2c70\0\u2cb8\0\u2d00"+
+    "\0\u2d48\0\u2d90\0\u2dd8\0\u2e20\0\u2e68\0\u2eb0\0\u2ef8\0\u2f40"+
+    "\0\u2f88\0\u2fd0\0\u3018\0\u3060\0\u30a8\0\u30f0\0\u3138\0\u0168"+
+    "\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\u2e68"+
+    "\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\u3408\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\u3f48\0\u3f90\0\u3fd8\0\u4020\0\u4068"+
+    "\0\330\0\u2130\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\u4920\0\u4968\0\u49b0\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\u4f98\0\u5028\0\u5070\0\u50b8\0\u3de0\0\u5100\0\u5148"+
+    "\0\u5190\0\u51d8\0\u0168\0\u5220\0\u5268\0\u52b0\0\u52f8\0\u5340"+
+    "\0\u5388\0\u53d0\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\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\u3600\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\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\u69c0\0\u6a08\0\u6a50\0\u6a98\0\u6ae0\0\u6b28\0\u6b70\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\u5fa0\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\u4968\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\u5388\0\u7fb0\0\u7ff8\0\u8040\0\u8088\0\u80d0\0\u8118\0\u8160"+
+    "\0\u81a8\0\u81f0\0\u8238\0\u8280\0\u82c8\0\u8310\0\u8358\0\u83a0"+
+    "\0\u83e8\0\u8430\0\u8478\0\u84c0\0\u8508\0\u8550\0\u8598\0\u85e0"+
+    "\0\u8628\0\u8670\0\u86b8\0\u8700\0\u8748\0\u8790\0\u87d8\0\u8820"+
+    "\0\u8868\0\u88b0\0\u88f8\0\u8940\0\u8988\0\u89d0\0\u8a18\0\u8a60"+
+    "\0\u8aa8\0\u8af0\0\u8b38\0\u8b80\0\u8bc8\0\u8c10\0\u8c58\0\u8ca0"+
+    "\0\u8ce8\0\u8d30\0\u8d78\0\u8dc0\0\u8e08\0\u8e50\0\u8e98\0\u8ee0"+
+    "\0\u8f28\0\u8f70\0\u8fb8\0\u9000\0\u9048\0\u9090\0\u90d8\0\u9120"+
+    "\0\u9168\0\u91b0\0\u91f8\0\u9240\0\u9288\0\u92d0\0\u9318\0\u9360"+
+    "\0\u93a8\0\u93f0\0\u9438\0\u9480\0\u94c8\0\u9510\0\u9558\0\u95a0"+
+    "\0\u95e8\0\u9630\0\u9678\0\u96c0\0\u9708\0\u9750\0\u9798\0\u97e0"+
+    "\0\u9828\0\u9870\0\u98b8\0\u9900\0\u9948\0\u9990\0\u99d8\0\u9a20"+
+    "\0\u9a68\0\u9ab0\0\u9af8\0\u9b40\0\u9b88\0\u9bd0\0\u9c18\0\u9c60"+
+    "\0\u9ca8\0\u9cf0\0\u9d38\0\u9d80\0\u9dc8\0\u9e10\0\u9e58\0\u9ea0"+
+    "\0\u9ee8\0\u9f30\0\u9f78\0\u9fc0\0\ua008\0\ua050\0\ua098\0\ua0e0"+
+    "\0\ua128\0\ua170\0\ua1b8\0\ua200\0\ua248\0\ua290\0\ua2d8\0\ua320"+
+    "\0\ua368\0\ua3b0\0\ua3f8\0\ua440\0\ua488\0\ua4d0\0\ua518\0\ua560"+
+    "\0\ua5a8\0\ua5f0\0\ua638\0\ua680\0\ua6c8\0\ua710\0\ua758\0\ua7a0"+
+    "\0\ua7e8\0\ua830\0\u5538";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[627];
+    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\4\1\5\1\6\1\7\1\10\1\11\1\7\1\11"+
+    "\1\12\1\13\1\4\1\14\1\15\1\11\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\32\1\33\1\34\1\4\1\35\1\36"+
+    "\4\7\1\35\1\37\2\4\1\34\1\40\1\4\1\41"+
+    "\1\40\2\34\2\36\1\42\1\35\1\43\1\44\1\45"+
+    "\1\40\1\35\1\43\3\4\1\46\1\47\1\50\1\51"+
+    "\1\7\1\52\1\7\1\53\1\54\1\7\1\55\1\56"+
+    "\16\57\1\60\1\61\70\57\14\62\1\63\1\62\1\64"+
+    "\12\62\1\65\42\62\1\66\13\62\113\0\1\67\2\0"+
+    "\1\67\1\0\1\67\2\0\2\67\4\0\13\67\2\0"+
+    "\1\67\1\0\5\67\15\0\1\67\2\0\1\67\1\0"+
+    "\2\67\3\0\14\67\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\1\70\2\0\1\71"+
+    "\1\72\1\73\1\71\1\72\1\71\1\70\1\0\1\71"+
+    "\1\74\1\72\2\0\1\75\4\71\1\76\4\71\1\77"+
+    "\1\71\2\0\1\7\1\0\1\100\1\77\1\74\1\76"+
+    "\1\7\2\0\1\70\2\0\2\70\5\0\3\7\1\0"+
+    "\1\7\1\0\2\7\2\70\1\0\2\71\1\74\1\71"+
+    "\1\100\7\71\1\70\2\0\1\71\2\11\1\71\1\11"+
+    "\1\71\1\70\1\0\1\71\1\74\1\11\2\0\1\75"+
+    "\4\71\1\76\4\71\1\77\1\71\2\0\1\7\1\0"+
+    "\1\71\1\77\1\74\1\76\1\7\2\0\1\70\2\0"+
+    "\2\70\5\0\3\7\1\0\1\7\1\0\2\7\2\70"+
+    "\1\0\2\71\1\74\11\71\3\0\6\7\2\0\3\7"+
+    "\2\0\10\7\1\101\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\20\0\1\102\1\103\4\0\1\104\1\0\1\105\62\0"+
+    "\6\7\2\0\1\106\1\107\1\7\2\0\1\7\1\110"+
+    "\1\7\1\111\1\7\1\112\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\1\106\1\107\1\7\2\0"+
+    "\3\7\1\113\4\7\1\114\1\7\1\115\1\116\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\1\7\1\117\12\7\3\0\1\7\2\75"+
+    "\1\7\1\75\1\7\2\0\2\7\1\75\2\0\1\120"+
+    "\13\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\2\7\1\121\2\7\1\122\1\123\5\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\1\124\1\125\4\7\1\126\5\7"+
+    "\3\0\6\7\2\0\1\127\2\7\2\0\5\7\1\130"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\1\7\1\131\1\7\1\132"+
+    "\10\7\3\0\6\7\2\0\1\133\2\7\2\0\1\7"+
+    "\1\134\1\135\5\7\1\136\1\7\1\137\1\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\10\7\1\140\3\7\3\0\6\7\2\0"+
+    "\3\7\2\0\3\7\1\141\6\7\1\142\1\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\1\143\1\144\4\7\1\145\5\7\3\0"+
+    "\6\7\2\0\3\7\2\0\10\7\1\146\3\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\5\7\1\147\1\7\1\150\4\7\3\0"+
+    "\6\7\2\0\1\151\2\7\2\0\3\7\1\152\7\7"+
+    "\1\153\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\1\154\13\7\3\0\6\7"+
+    "\2\0\3\7\2\0\13\7\1\155\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\7\1\156\4\7\1\157\5\7\3\0\6\7\2\0"+
+    "\3\7\2\0\3\7\1\160\1\7\1\161\1\162\4\7"+
+    "\1\163\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\1\7\1\164\12\7\3\0"+
+    "\6\7\2\0\3\7\2\0\13\7\1\165\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\1\166\13\7\3\0\6\7\2\0\3\7\2\0"+
+    "\3\7\1\167\1\7\1\170\5\7\1\171\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\1\7\1\172\12\7\3\0\6\7\2\0\1\7"+
+    "\1\173\1\7\2\0\6\7\1\174\1\7\1\175\3\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\2\7\1\176\1\177\10\7\37\0"+
+    "\1\36\17\0\2\36\41\0\1\200\36\0\1\201\50\0"+
+    "\1\202\41\0\1\203\36\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\1\204\2\7"+
+    "\1\40\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\40\1\7\1\0\2\7\3\0\14\7"+
+    "\64\0\1\40\26\0\5\7\1\205\2\0\1\206\1\207"+
+    "\1\210\2\0\1\7\1\211\1\212\1\213\1\214\1\215"+
+    "\2\7\1\216\1\217\1\7\1\220\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\7\1\221\1\7\1\222\10\7\3\0\6\7\2\0"+
+    "\3\7\2\0\3\7\1\223\10\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\1\120\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\1\224"+
+    "\2\7\2\0\5\7\1\225\5\7\1\226\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\1\7\1\227\12\7\3\0\6\7\2\0\3\7"+
+    "\2\0\3\7\1\230\1\7\1\231\5\7\1\232\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\1\7\1\233\12\7\3\0\5\7\1\234"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\3\7\1\235\1\7"+
+    "\1\236\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\5\7\1\237\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\5\7"+
+    "\1\240\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\5\7\1\241\5\7\1\242\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\16\57\2\0\70\57\17\0\1\243"+
+    "\70\0\14\62\1\0\1\62\1\0\12\62\1\0\42\62"+
+    "\1\0\13\62\26\0\1\244\4\0\1\245\105\0\1\246"+
+    "\104\0\1\247\64\0\6\67\2\0\3\67\3\0\13\67"+
+    "\2\0\1\67\1\0\5\67\15\0\1\67\2\0\1\67"+
+    "\1\0\2\67\3\0\14\67\1\70\2\0\7\70\1\0"+
+    "\3\70\3\0\13\70\4\0\4\70\3\0\1\70\2\0"+
+    "\2\70\15\0\2\70\1\0\15\70\2\0\6\71\1\70"+
+    "\1\0\3\71\2\0\1\7\13\71\2\0\1\7\1\0"+
+    "\4\71\1\7\2\0\1\70\2\0\2\70\5\0\3\7"+
+    "\1\0\1\7\1\0\2\7\2\70\1\0\14\71\1\70"+
+    "\2\0\1\71\1\72\1\73\1\71\1\72\1\71\1\70"+
+    "\1\0\1\71\1\74\1\72\2\0\1\75\4\71\1\76"+
+    "\4\71\1\250\1\71\2\0\1\7\1\0\1\71\1\250"+
+    "\1\74\1\76\1\7\2\0\1\70\2\0\2\70\5\0"+
+    "\3\7\1\0\1\7\1\0\2\7\2\70\1\0\2\71"+
+    "\1\74\11\71\1\70\2\0\1\71\2\73\1\71\1\73"+
+    "\1\71\1\70\1\0\1\71\1\74\1\73\2\0\1\75"+
+    "\4\71\1\76\6\71\2\0\1\7\1\0\2\71\1\74"+
+    "\1\76\1\7\2\0\1\70\2\0\2\70\5\0\3\7"+
+    "\1\0\1\7\1\0\2\7\2\70\1\0\2\71\1\74"+
+    "\11\71\1\70\2\0\1\71\2\75\1\71\1\75\1\71"+
+    "\1\70\1\0\1\71\1\74\1\75\2\0\1\7\4\71"+
+    "\1\76\6\71\2\0\1\7\1\0\2\71\1\74\1\76"+
+    "\1\7\2\0\1\70\2\0\2\70\5\0\3\7\1\0"+
+    "\1\7\1\0\2\7\2\70\1\0\2\71\1\74\11\71"+
+    "\1\70\2\0\1\71\2\251\1\71\1\251\1\71\1\70"+
+    "\1\0\2\71\1\251\2\0\1\7\13\71\2\0\1\7"+
+    "\1\0\4\71\1\252\2\0\1\70\2\0\2\70\5\0"+
+    "\1\7\1\252\1\7\1\0\1\7\1\0\2\7\2\70"+
+    "\1\0\14\71\1\70\2\0\1\71\4\253\1\71\1\70"+
+    "\1\0\1\71\2\253\2\0\1\7\2\71\3\253\1\71"+
+    "\1\253\4\71\2\0\1\7\1\0\2\71\2\253\1\7"+
+    "\2\0\1\70\2\0\2\70\5\0\3\7\1\0\1\7"+
+    "\1\0\2\7\2\70\1\0\2\71\1\253\11\71\3\0"+
+    "\6\7\2\0\1\254\2\7\2\0\13\7\1\255\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\22\0\1\256\110\0\1\257\111\0"+
+    "\1\260\65\0\6\7\2\0\3\7\2\0\5\7\1\261"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\13\7\1\262\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\5\7\1\263\6\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\10\7\1\264\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\1\7\1\265\1\7\2\0\1\7"+
+    "\1\266\1\267\1\270\1\271\7\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\2\7\1\272\1\273\3\7\1\274\4\7\3\0\6\7"+
+    "\2\0\3\7\2\0\12\7\1\275\1\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\1\7"+
+    "\1\110\12\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\1\7"+
+    "\1\276\12\7\3\0\6\7\2\0\1\261\2\7\2\0"+
+    "\10\7\1\277\1\7\1\137\1\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\1\300\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\12\7\1\301\1\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\4\7\1\302\1\7"+
+    "\1\303\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\5\7\1\120\6\7"+
+    "\3\0\6\7\2\0\1\304\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\1\7\1\305\12\7\3\0"+
+    "\6\7\2\0\1\306\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\10\7"+
+    "\1\307\3\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\3\7\1\120\10\7"+
+    "\3\0\6\7\2\0\3\7\2\0\10\7\1\120\2\7"+
+    "\1\310\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\5\7\1\311\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\1\7\1\312"+
+    "\1\120\11\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\3\7\1\313\10\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\1\314\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\1\7\1\315\3\7\1\316\6\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\2\7\1\317\11\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\2\7\1\120\3\7\1\120\5\7\3\0\6\7\2\0"+
+    "\3\7\2\0\6\7\1\320\5\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\321"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\1\7\1\322\12\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\3\7\1\323"+
+    "\1\7\1\324\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\3\7\1\47\10\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\5\7\1\310\2\0\3\7"+
+    "\2\0\10\7\1\325\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\3\7"+
+    "\1\326\10\7\3\0\6\7\2\0\3\7\2\0\4\7"+
+    "\1\327\7\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\1\7\1\330\12\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\12\7"+
+    "\1\331\1\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\3\7\1\332\1\7\1\333\6\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\5\7\1\334\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\6\7\1\335"+
+    "\5\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\12\7\1\336\1\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\3\7\1\337"+
+    "\10\7\3\0\6\7\2\0\1\340\2\7\2\0\13\7"+
+    "\1\341\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\10\7\1\342\3\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\1\7\1\343\12\7\3\0\6\7\2\0"+
+    "\3\7\2\0\6\7\1\337\5\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\3\7\1\344\10\7\3\0\6\7\2\0"+
+    "\3\7\2\0\11\7\1\345\2\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\10\7\1\312\3\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\1\120\13\7\3\0\6\7"+
+    "\2\0\3\7\2\0\12\7\1\346\1\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\6\7"+
+    "\1\347\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\6\7\1\350\5\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\5\7"+
+    "\1\351\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\13\7"+
+    "\1\352\3\0\6\7\2\0\3\7\2\0\6\7\1\300"+
+    "\5\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\1\7\1\353\12\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\3\7\1\354"+
+    "\1\355\3\7\1\356\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\1\7"+
+    "\1\357\12\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\4\7\1\360\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\5\7\1\361\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\1\7\1\362"+
+    "\2\7\1\120\1\7\1\363\5\7\2\0\1\7\1\0"+
+    "\4\7\1\364\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\5\7"+
+    "\1\365\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\2\7\1\366\11\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\46\0\1\367\113\0\1\370\36\0\1\34"+
+    "\14\0\2\34\1\202\24\0\1\34\11\0\2\34\27\0"+
+    "\1\203\1\371\14\203\2\371\1\203\1\0\34\203\2\371"+
+    "\1\372\27\203\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\1\35\2\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\1\7\1\373\6\7\1\374\3\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\5\7\1\375\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\10\7\1\376\1\7\1\377"+
+    "\1\u0100\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\1\7\1\u0101"+
+    "\12\7\3\0\6\7\2\0\1\u0102\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\1\7\1\u0103\10\7\1\u0104\1\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\10\7\1\u0105\3\7\3\0\5\7\1\u0106\2\0"+
+    "\3\7\2\0\12\7\1\u0107\1\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\7\1\u0108\12\7\3\0\6\7\2\0\1\u0109\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\1\7\1\u010a\12\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\3\7"+
+    "\1\u010b\10\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\10\7\1\u010a\3\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\5\7\1\u010c\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\3\7\1\u010d\10\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\1\7\1\u010e"+
+    "\12\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\1\7\1\u010f"+
+    "\12\7\3\0\6\7\2\0\1\u0110\1\u0111\1\7\2\0"+
+    "\4\7\1\120\5\7\1\314\1\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\1\7\1\u0112"+
+    "\12\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\5\7\1\u0113"+
+    "\2\0\3\7\2\0\1\7\1\110\4\7\1\u0114\5\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\2\7\1\304\11\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\4\7"+
+    "\1\120\5\7\1\u0115\1\7\3\0\6\7\2\0\1\264"+
+    "\2\7\2\0\6\7\1\u0116\5\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\3\7\1\u0117\10\7\3\0\6\7\2\0\3\7\2\0"+
+    "\10\7\1\120\3\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\10\7\1\u0118\3\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\1\7\1\u0119\12\7\3\0"+
+    "\6\7\2\0\1\300\2\7\2\0\12\7\1\u011a\1\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\4\7\1\u011b\7\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\6\7\1\120\1\7"+
+    "\1\u011c\3\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\6\7"+
+    "\1\u011a\5\7\3\0\6\7\2\0\1\u011d\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\2\7\1\u011e\11\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\22\0\1\u011f\117\0\1\u0120\106\0\1\u0121\104\0"+
+    "\1\u0122\61\0\1\70\2\0\1\71\2\251\1\71\1\251"+
+    "\1\71\1\70\1\0\1\71\1\74\1\251\2\0\1\7"+
+    "\13\71\2\0\1\7\1\0\2\71\1\74\1\71\1\7"+
+    "\2\0\1\70\2\0\2\70\5\0\3\7\1\0\1\7"+
+    "\1\0\2\7\2\70\1\0\2\71\1\74\11\71\3\0"+
+    "\1\7\2\251\1\7\1\251\1\7\2\0\2\7\1\251"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\1\70\2\0"+
+    "\1\71\4\253\1\71\1\70\1\0\1\71\2\253\2\0"+
+    "\1\7\2\71\3\253\1\71\1\253\2\71\1\250\1\71"+
+    "\2\0\1\7\1\0\1\71\1\250\2\253\1\7\2\0"+
+    "\1\70\2\0\2\70\5\0\3\7\1\0\1\7\1\0"+
+    "\2\7\2\70\1\0\2\71\1\253\11\71\3\0\6\7"+
+    "\2\0\3\7\2\0\5\7\1\u0123\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\10\7"+
+    "\1\u0124\3\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\3\7\1\u0125\10\7"+
+    "\23\0\1\u0126\113\0\1\102\111\0\1\u0127\61\0\6\7"+
+    "\2\0\3\7\2\0\1\7\1\266\12\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\1\261\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\5\7\1\120"+
+    "\6\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\10\7\1\337\3\7\3\0\6\7\2\0"+
+    "\3\7\2\0\5\7\1\47\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\6\7\1\120"+
+    "\5\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\5\7\1\276\4\7\1\u0128\1\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\2\7\1\120\11\7\3\0"+
+    "\5\7\1\117\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\5\7\1\u0129\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\1\7\1\u012a"+
+    "\12\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u012b"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\1\7\1\334\12\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\3\7\1\266"+
+    "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\2\7\1\u012c"+
+    "\11\7\3\0\6\7\2\0\3\7\2\0\13\7\1\u012d"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\1\7\1\u012e\12\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\1\7"+
+    "\1\300\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\4\7\1\276\7\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\1\266\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\6\7"+
+    "\1\u012f\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\4\7\1\120\7\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\10\7"+
+    "\1\266\3\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\12\7"+
+    "\1\120\1\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\120\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\2\7\1\120\11\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\3\7\1\u0130\10\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\1\7\1\307\12\7"+
+    "\3\0\6\7\2\0\3\7\2\0\6\7\1\u0131\5\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\12\7\1\u0132\1\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\6\7\1\120\1\7"+
+    "\1\u0133\3\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\5\7\1\300\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\1\7"+
+    "\1\341\12\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\3\7\1\u0134\10\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\1\7"+
+    "\1\u0135\2\7\1\276\7\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\2\7"+
+    "\1\u0136\6\7\1\120\2\7\3\0\6\7\2\0\3\7"+
+    "\2\0\2\7\1\u0137\11\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\3\7"+
+    "\1\u0138\10\7\3\0\6\7\2\0\3\7\2\0\12\7"+
+    "\1\337\1\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\5\7"+
+    "\1\u0139\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\120\1\0\4\7\1\u013a\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\12\7\1\120\1\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\1\u0130\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\5\7\1\u013b\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\4\7\1\u013c\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\5\7"+
+    "\1\u013d\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\5\7\1\120\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\1\7\1\u013e\12\7\3\0\6\7"+
+    "\2\0\3\7\2\0\1\7\1\300\12\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\2\7\1\u013f\11\7\3\0\6\7"+
+    "\2\0\3\7\2\0\12\7\1\u0140\1\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\5\7"+
+    "\1\u0141\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\12\7\1\u0142\1\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\4\7\1\u0143\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\1\u0144\13\7"+
+    "\3\0\6\7\2\0\3\7\2\0\10\7\1\u0145\3\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\6\7\1\u0146\5\7"+
+    "\3\0\6\7\2\0\3\7\2\0\6\7\1\u0147\5\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\2\7\1\u0148\11\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\12\7\1\u013f\1\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\10\7\1\120\3\7"+
+    "\3\0\6\7\2\0\3\7\2\0\2\7\1\300\11\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\10\7\1\u0149\1\7\1\u014a\1\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\1\u014b\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\6\7\1\u014c\5\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\1\7\1\u014d\12\7\3\0\6\7\2\0"+
+    "\3\7\2\0\10\7\1\u014e\3\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\10\7\1\u014f"+
+    "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\12\7\1\u0150\1\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\7\1\305\12\7\47\0\1\u0151\106\0\1\u0152\44\0"+
+    "\6\7\2\0\3\7\2\0\5\7\1\u0153\6\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\4\7\1\u0154\7\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\3\7\1\u0155\10\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\4\7\1\u0156\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\5\7"+
+    "\1\u0157\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\12\7\1\u0158"+
+    "\1\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\5\7\1\u0159"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\13\7\1\u015a\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\1\7\1\u015b\12\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\12\7\1\u015c\1\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\5\7\1\u015d\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\1\u015e\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\1\7\1\u015f\12\7\3\0\6\7"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\3\7"+
+    "\1\u0160\10\7\3\0\6\7\2\0\1\u010a\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\210\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\1\u0161\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\6\7"+
+    "\1\u010a\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\6\7\1\u0162\5\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\1\u0163\13\7\3\0\6\7\2\0"+
+    "\3\7\2\0\2\7\1\u013d\11\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u0164"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\10\7\1\300\3\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\3\7\1\u0165\10\7\3\0\6\7\2\0\3\7\2\0"+
+    "\1\7\1\315\12\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\7\7\1\327\4\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\13\7\1\u0166\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\1\7\1\120\12\7"+
+    "\3\0\6\7\2\0\3\7\2\0\5\7\1\u0167\6\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\3\7\1\120\10\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\1\7\1\232\1\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\13\7\1\u0168\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\6\7\1\u0169\5\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\1\7\1\120\12\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\6\7\1\u016a\5\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\1\7\1\u016b\12\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\7\1\312\12\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\3\7\1\132\10\7\2\0"+
+    "\1\u016c\132\0\1\u011f\102\0\1\u016d\111\0\1\u016e\70\0"+
+    "\6\7\2\0\1\7\1\320\1\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\6\7\1\u016f\5\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\2\7\1\124\11\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\24\0\1\u0170\115\0\1\u0171\60\0"+
+    "\6\7\2\0\3\7\2\0\13\7\1\u0172\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\4\7"+
+    "\1\337\7\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\7\7"+
+    "\1\u0173\4\7\3\0\6\7\2\0\1\u0174\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\4\7\1\u0175"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\6\7\1\u0176\5\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\10\7\1\270\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\5\7\1\u0177\6\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\6\7\1\120\5\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\4\7\1\u0178\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\6\7\1\u0179\5\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\1\u017a\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\6\7"+
+    "\1\u017b\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\12\7\1\u0150\1\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\5\7\1\157\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\1\337\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\1\u017c\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\1\7\1\u017d"+
+    "\1\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\4\7\1\u017e\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\11\7"+
+    "\1\300\2\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\13\7\1\u017f\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u0180"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\1\7\1\u0181\12\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\13\7\1\u0182"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\3\7\1\u0183\1\7\1\u0184\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\4\7\1\u0185\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\4\7\1\u0186"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\4\7\1\u0187\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\120\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\4\7\1\u0188"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\1\7\1\170\12\7\3\0\6\7\2\0\3\7"+
+    "\2\0\5\7\1\170\6\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\3\7\1\157\10\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\3\7\1\u0189\10\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\4\7\1\u018a\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\3\7\1\u018b\10\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\6\7\1\u018c\5\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\5\7\1\u018d\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\50\0"+
+    "\1\34\110\0\1\u0151\41\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\4\7\1\u018e\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\1\u018f"+
+    "\13\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\2\7\1\u0190\11\7\3\0\6\7\2\0"+
+    "\3\7\2\0\12\7\1\u0191\1\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\1\7\1\u0192"+
+    "\12\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\5\7\1\u010a\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\1\u0193\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\10\7\1\u0194\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\5\7\1\u0195\6\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\1\7\1\u0196\12\7"+
+    "\3\0\6\7\2\0\3\7\2\0\10\7\1\u010c\3\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\1\u0197"+
+    "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\11\7\1\u0198\2\7\3\0\6\7\2\0\3\7\2\0"+
+    "\2\7\1\u0199\11\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\3\7\1\u019a"+
+    "\10\7\3\0\6\7\2\0\3\7\2\0\10\7\1\u019b"+
+    "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\1\u019c\13\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\4\7\1\u011e\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\1\7\1\120"+
+    "\1\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\5\7\1\u019d\2\0\3\7\2\0\3\7\1\u019e\1\7"+
+    "\1\u019f\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\3\7"+
+    "\1\u01a0\10\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\4\7\1\u01a1\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\6\7\1\u01a2\5\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\1\7\1\47\12\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\6\7\1\u01a3"+
+    "\5\7\67\0\1\u01a4\21\0\2\u01a5\6\u016d\1\0\1\u01a5"+
+    "\3\u016d\2\0\1\u01a5\13\u016d\1\u01a5\1\0\1\u01a5\1\0"+
+    "\4\u016d\2\u01a5\2\0\4\u01a5\6\0\1\u01a5\1\0\3\u01a5"+
+    "\1\u016d\2\u01a5\1\u016d\1\u01a5\14\u016d\2\0\1\u016c\16\0"+
+    "\1\u011f\71\0\6\7\2\0\3\7\2\0\5\7\1\u01a6"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\25\0\1\102\115\0"+
+    "\1\u01a7\57\0\6\7\2\0\3\7\2\0\4\7\1\u014b"+
+    "\7\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\5\7\1\u01a8\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\1\7\1\337"+
+    "\12\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\7\7\1\143"+
+    "\4\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\4\7\1\u01a9\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\2\7\1\u01aa\11\7"+
+    "\3\0\6\7\2\0\1\7\1\u01ab\1\7\2\0\1\7"+
+    "\1\u01ac\5\7\1\u01ad\2\7\1\u01ae\1\310\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\2\7\1\u01af\11\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\4\7\1\u01b0\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\4\7\1\u01b1\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\3\7"+
+    "\1\u01b2\10\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\5\7\1\u01b3\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\13\7"+
+    "\1\u01b4\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\11\7\1\u01b5\2\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\10\7\1\356"+
+    "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\3\7\1\232\10\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\2\7\1\u01b6"+
+    "\11\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\10\7\1\337\3\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\10\7\1\u0130"+
+    "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\7\7\1\u01b7"+
+    "\4\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\3\7\1\u01b8\10\7\3\0\6\7\2\0"+
+    "\1\7\1\u01b9\1\7\2\0\10\7\1\u0149\1\7\1\u014a"+
+    "\1\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\4\7\1\u01ba\7\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\1\7\1\u01bb\1\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\10\7\1\u01bc\3\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\3\7\1\u01bd"+
+    "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\3\7\1\u01be"+
+    "\10\7\3\0\6\7\2\0\3\7\2\0\13\7\1\u01bf"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\3\7\1\u01c0\10\7"+
+    "\3\0\6\7\2\0\3\7\2\0\4\7\1\u01c1\7\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\5\7\1\u01c2\6\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\4\7\1\u01c3\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\1\7\1\u01c4\12\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\u01c5\13\7\3\0\6\7\2\0\3\7\2\0\4\7"+
+    "\1\u01c6\7\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\6\7\1\u01c7\5\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\1\u010c\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\11\7\1\u01c8\2\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u01c9"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\5\7\1\u01ca"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\13\7\1\u01cb\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\3\7\1\u01cc\10\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\4\7\1\u01cd\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\4\7\1\u01ce\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\12\7\1\u01cf\1\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\4\7\1\u01d0"+
+    "\7\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\6\7\1\u01d1\5\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u01d2"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\2\7\1\u01d3\1\u01bd\10\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\1\7\1\u01d4\12\7\3\0\6\7"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\3\7"+
+    "\1\120\10\7\67\0\1\u016d\23\0\6\7\2\0\1\232"+
+    "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\30\0"+
+    "\1\u0170\62\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\4\7\1\u01d5\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\3\7\1\266\5\7\1\u01d6\2\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\4\7\1\u01d7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\12\7\1\115\1\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\1\124\13\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\1\7\1\156\4\7"+
+    "\1\157\5\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\1\7\1\u017f\12\7\3\0\6\7"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\1\7"+
+    "\1\u01d8\12\7\3\0\6\7\2\0\3\7\2\0\5\7"+
+    "\1\u01d9\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\1\7\1\u0164\12\7"+
+    "\3\0\6\7\2\0\3\7\2\0\3\7\1\u01da\10\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\10\7\1\u01db\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\1\7\1\312\1\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\10\7\1\u01dc\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\1\u01bb\13\7\3\0\6\7\2\0\3\7\2\0"+
+    "\3\7\1\u0129\10\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\5\7\1\333\6\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\5\7\1\u01dd\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\13\7\1\u01de\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\1\7\1\u01df\12\7\3\0\6\7"+
+    "\2\0\3\7\2\0\13\7\1\327\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\4\7\1\u01e0"+
+    "\7\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\1\133\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\5\7\1\u01e1\6\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\6\7\1\u0130\5\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\5\7\1\310\6\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\1\7\1\u01e2\12\7"+
+    "\3\0\6\7\2\0\3\7\2\0\4\7\1\u01e3\7\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\5\7\1\u01e4\6\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\3\7\1\u01e5\10\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\4\7\1\u01e6\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\5\7\1\u01e7\6\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\4\7\1\u01e8\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\4\7"+
+    "\1\u01e9\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\10\7\1\u01ea"+
+    "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\1\u01eb\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\12\7\1\u01ec\1\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\10\7\1\u01ed\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\1\7\1\u01ee\12\7\3\0\6\7\2\0\3\7"+
+    "\2\0\4\7\1\u01ef\7\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\6\7\1\u01f0\5\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\1\u01f1"+
+    "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\u01f2\13\7\3\0\6\7\2\0\1\u01f3\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\1\u01f4\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\3\7\1\u01f5\10\7\3\0\6\7\2\0\3\7"+
+    "\2\0\13\7\1\u01f6\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\3\7\1\u01f7\10\7\3\0\5\7\1\u0113\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\1\u01f8\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\10\7\1\u01f9\3\7\3\0\6\7\2\0"+
+    "\3\7\2\0\6\7\1\u01fa\5\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\3\7\1\u01fb"+
+    "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\6\7\1\u0116\5\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\1\u01fc\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\10\7\1\u01d2\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\5\7\1\u01fd\6\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\10\7\1\u01fe\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\12\7\1\u01ff\1\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\7\7\1\u0200\4\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\2\7\1\u0201\11\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\1\7\1\u0202\12\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\4\7\1\u0203\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\1\u0204\2\7"+
+    "\2\0\12\7\1\u0205\1\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\2\7"+
+    "\1\u0206\1\u0207\10\7\3\0\5\7\1\u0208\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\6\7\1\u0209\5\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\5\7"+
+    "\1\u020a\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\5\7\1\u020b\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\2\7\1\u020c\11\7\3\0\6\7"+
+    "\2\0\3\7\2\0\10\7\1\u020d\3\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\1\7\1\u020e\12\7\3\0\6\7"+
+    "\2\0\3\7\2\0\13\7\1\120\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\1\7\1\300\12\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\1\7\1\270"+
+    "\12\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\1\7\1\u020f\12\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\4\7\1\u0210"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\5\7\1\u019f\6\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\6\7\1\162\5\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\3\7\1\u0211\10\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\1\u0212"+
+    "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\5\7\1\u0213\6\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\12\7\1\u0130\1\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\12\7\1\u0214\1\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\1\7\1\170\12\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\300\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\6\7\1\u0215"+
+    "\5\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\5\7\1\u0216\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\3\7\1\u0217"+
+    "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\5\7\1\u0109\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\10\7\1\u0218"+
+    "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\2\7\1\u0219\11\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u021a"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\5\7\1\u021b\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\5\7\1\u021c\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\5\7\1\u021d\6\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\10\7\1\u021e\3\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\4\7\1\u021f\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\4\7\1\u0220\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+    "\2\0\1\7\1\0\4\7\1\u0221\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\4\7\1\u0222"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\4\7\1\u0223\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\10\7\1\u0224\3\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\4\7\1\u0130\7\7\3\0\6\7\2\0\3\7\2\0"+
+    "\5\7\1\u0225\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\2\7\1\u0226\11\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\1\7\1\u0227\12\7\3\0"+
+    "\6\7\2\0\3\7\2\0\10\7\1\u0228\3\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\12\7\1\u0229\1\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\5\7\1\u022a\6\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\2\7\1\u022b\11\7\3\0"+
+    "\6\7\2\0\3\7\2\0\12\7\1\u010a\1\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\4\7\1\u022c\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\3\7\1\u022d\10\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\3\7"+
+    "\1\u022e\10\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\10\7\1\u022f\3\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\7\7\1\u0230\4\7\3\0\6\7\2\0\3\7"+
+    "\2\0\2\7\1\u010a\11\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\6\7\1\u0231\5\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\1\u0232"+
+    "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\10\7\1\u0233\3\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\7\7\1\u0234\4\7\3\0"+
+    "\6\7\2\0\1\7\1\u0235\1\7\2\0\2\7\1\u0219"+
+    "\11\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\12\7\1\u0236\1\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\1\u0237\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\6\7\1\u0238\5\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\10\7\1\u0239\3\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\4\7\1\u023a\7\7\3\0\6\7"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\4\7"+
+    "\1\u023b\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\1\u01d2\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\6\7\1\u023c\5\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\6\7\1\300\5\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\4\7\1\u023d\7\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\4\7\1\u023e\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\10\7\1\u023f\3\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\6\7\1\u0240\5\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\2\7\1\u0241\11\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\10\7\1\u022d\3\7\3\0\6\7\2\0\3\7\2\0"+
+    "\5\7\1\u0217\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\3\7\1\u0242\10\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\5\7\1\u0243\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\3\7\1\u0244\10\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\5\7\1\u0245\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\13\7\1\u0246\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\13\7"+
+    "\1\u0247\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\5\7\1\u0248\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u0249"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\6\7\1\u024a\5\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\13\7\1\170"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\7\7\1\u0130\4\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+    "\1\0\4\7\1\u024b\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\6\7\1\u024c\5\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\3\7\1\u0219\10\7\3\0\6\7\2\0\3\7\2\0"+
+    "\5\7\1\u024d\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\u010a\13\7\3\0\6\7\2\0\3\7\2\0\3\7"+
+    "\1\u024e\10\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\u024f\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\1\7\1\u0250\12\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\3\7\1\u0251\10\7"+
+    "\3\0\6\7\2\0\1\u0252\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\12\7\1\u0253\1\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\10\7\1\u0254\3\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\1\7\1\u0255"+
+    "\1\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\4\7\1\u010c\7\7\3\0\6\7\2\0\3\7\2\0"+
+    "\5\7\1\117\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\3\7\2\0\5\7\1\u01d9\6\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\4\7\1\u0256\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\11\7\1\u0257\2\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\7\7"+
+    "\1\u0258\4\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\4\7"+
+    "\1\u0259\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\1\7\1\u025a\12\7\3\0\6\7\2\0"+
+    "\3\7\2\0\5\7\1\u025b\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\1\7\1\u025c"+
+    "\12\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\5\7\1\216\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u025d"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\12\7\1\u025e\1\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\4\7\1\u025f"+
+    "\7\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\12\7\1\u0260\1\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\12\7\1\u0261"+
+    "\1\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\1\120\2\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\12\7\1\u0262\1\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\1\7\1\u0263\12\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\13\7\1\u0264\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+    "\14\7\2\0\1\7\1\0\4\7\1\u0265\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\5\7\1\u0266\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\12\7"+
+    "\1\u0267\1\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\3\7\2\0\13\7\1\u0268\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\6\7\1\u010a\5\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\7\7\1\u0269"+
+    "\4\7\3\0\6\7\2\0\3\7\2\0\2\7\1\u026a"+
+    "\11\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\1\7\1\220"+
+    "\12\7\3\0\6\7\2\0\3\7\2\0\3\7\1\u026b"+
+    "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\4\7\1\u026c\7\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\3\7\1\u026d"+
+    "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\10\7\1\u0158\3\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u026e"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\3\7\2\0\3\7\1\u026f\10\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\1\u0270\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\6\7\1\u025c\5\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\3\7\2\0\1\7\1\u0271\12\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\2\7\1\u025d\11\7"+
+    "\3\0\6\7\2\0\3\7\2\0\4\7\1\u0272\7\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\10\7\1\216\3\7"+
+    "\3\0\6\7\2\0\3\7\2\0\1\7\1\u0156\12\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+    "\2\0\5\7\1\u0273\6\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[43128];
+    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 =
+    "\1\1\2\0\2\11\10\1\2\11\14\1\1\11\3\1"+
+    "\1\11\17\1\1\11\3\1\1\11\15\1\1\11\3\0"+
+    "\72\1\4\0\37\1\1\11\4\0\6\1\3\0\106\1"+
+    "\2\0\1\11\45\1\4\0\3\1\2\0\51\1\2\0"+
+    "\31\1\1\0\1\1\1\0\1\1\2\0\62\1\2\0"+
+    "\1\1\1\0\314\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[627];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public ClojureTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			/*case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;*/
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+		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 ClojureTokenMaker(java.io.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 ClojureTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 164) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 14: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 25: break;
+        case 6: 
+          { addNullToken(); return firstToken;
+          }
+        case 26: break;
+        case 18: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 27: break;
+        case 9: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 28: break;
+        case 16: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 29: break;
+        case 17: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 30: break;
+        case 19: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 31: break;
+        case 21: 
+          { addToken(Token.VARIABLE);
+          }
+        case 32: break;
+        case 8: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 33: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 34: break;
+        case 13: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 35: break;
+        case 20: 
+          { addToken(Token.FUNCTION);
+          }
+        case 36: break;
+        case 22: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 37: break;
+        case 2: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 38: break;
+        case 23: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 39: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 40: break;
+        case 24: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 41: break;
+        case 15: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 42: break;
+        case 7: 
+          { start = zzMarkedPos-1; yybegin(STRING);
+          }
+        case 43: break;
+        case 3: 
+          { start = zzMarkedPos-1; yybegin(EOL_COMMENT);
+          }
+        case 44: break;
+        case 5: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 45: break;
+        case 4: 
+          { addToken(Token.OPERATOR);
+          }
+        case 46: break;
+        case 12: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 47: break;
+        case 10: 
+          { 
+          }
+        case 48: 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 628: break;
+            case STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 629: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 630: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.flex
new file mode 100644
index 0000000..7286beb
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.flex
@@ -0,0 +1,562 @@
+/*
+ * 7/28/2009
+ *
+ * DelphiTokenMaker.java - Scanner for the Delphi programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Delphi programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated DelphiTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class DelphiTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Token type specific to DelphiTokenMaker; denotes a line ending
+	 * with an unterminated "(*" comment.
+	 */
+	public static final int INTERNAL_MLC2			= -1;
+
+	/**
+	 * Token type specific to DelphiTokenMaker; denotes a line ending
+	 * with an unterminated "{$" compiler directive.
+	 */
+	public static final int INTERNAL_COMPILER_DIRECTIVE	= -2;
+
+	/**
+	 * Token type specific to DelphiTokenMaker; denotes a line ending
+	 * with an unterminated "(*$" compiler directive.
+	 */
+	public static final int INTERNAL_COMPILER_DIRECTIVE2	= -3;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public DelphiTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case INTERNAL_MLC2:
+				state = MLC2;
+				start = text.offset;
+				break;
+			case INTERNAL_COMPILER_DIRECTIVE:
+				state = COMPILER_DIRECTIVE;
+				start = text.offset;
+				break;
+			case INTERNAL_COMPILER_DIRECTIVE2:
+				state = COMPILER_DIRECTIVE2;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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])
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({LetterOrUnderscore}|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit})
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+UnclosedStringLiteral		= ([\'][^\']*)
+StringLiteral				= ({UnclosedStringLiteral}[\'])
+EscapeSequence				= ("#"{Digit}*)
+
+MLCBegin					= "{"
+MLCEnd						= "}"
+MLC2Begin					= "(*"
+MLC2End						= "*)"
+CompilerDirective1Begin		= ({MLCBegin}"$")
+CompilerDirective2Begin		= ({MLC2Begin}"$")
+LineCommentBegin			= "//"
+
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral				= ({IntegerHelper1}[lL]?)
+HexLiteral				= ({IntegerHelper2}[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					= ([\;,.])
+
+Operator					= ([\^\@\:\=\<\>\+\-\/\*])
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier			= ({NonSeparator}+)
+
+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 MLC2
+%state COMPILER_DIRECTIVE
+%state COMPILER_DIRECTIVE2
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"array" |
+	"as" |
+	"at" |
+	"asm" |
+	"begin" |
+	"case" |
+	"class" |
+	"const" |
+	"constructor" |
+	"destructor" |
+	"dispinterface" |
+	"div" |
+	"do" |
+	"downto" |
+	"else" |
+	"end" |
+	"except" |
+	"exports" |
+	"file" |
+	"final" |
+	"finalization" |
+	"finally" |
+	"for" |
+	"function" |
+	"goto" |
+	"if" |
+	"implementation" |
+	"in" |
+	"inherited" |
+	"initialization" |
+	"inline" |
+	"interface" |
+	"is" |
+	"label" |
+	"mod" |
+	"not" |
+	"object" |
+	"of" |
+	"on" |
+	"or" |
+	"out" |
+	"packed" |
+	"procedure" |
+	"program" |
+	"property" |
+	"raise" |
+	"record" |
+	"repeat" |
+	"resourcestring" |
+	"set" |
+	"sealed" |
+	"shl" |
+	"shr" |
+	"static" |
+	"string" |
+	"then" |
+	"threadvar" |
+	"to" |
+	"try" |
+	"type" |
+	"unit" |
+	"unsafe" |
+	"until" |
+	"uses" |
+	"var" |
+	"while" |
+	"with" |
+	"xor" 					{ addToken(Token.RESERVED_WORD); }
+
+	/* Directives. */
+	"absolute" |
+	"abstract" |
+	"assembler" |
+	"automated" |
+	"cdecl" |
+	"contains" |
+	"default" |
+	"deprecated" |
+	"dispid" |
+	"dynamic" |
+	"export" |
+	"external" |
+	"far" |
+	"forward" |
+	"implements" |
+	"index" |
+	"library" |
+	"local" |
+	"message" |
+	"name" |
+	"namespaces" |
+	"near" |
+	"nil" |
+	"nodefault" |
+	"overload" |
+	"override" |
+	"package" |
+	"pascal" |
+	"platform" |
+	"private" |
+	"protected" |
+	"public" |
+	"published" |
+	"read" |
+	"readonly" |
+	"register" |
+	"reintroduce" |
+	"requires" |
+	"resident" |
+	"safecall" |
+	"self" |
+	"stdcall" |
+	"stored" |
+	"varargs" |
+	"virtual" |
+	"write" |
+	"writeonly"				{ addToken(Token.FUNCTION); }
+
+	/* Data types. */
+	"shortint" |
+	"byte" |
+	"char" |
+	"smallint" |
+	"integer" |
+	"word" |
+	"longint" |
+	"cardinal" |
+	"boolean" |
+	"bytebool" |
+	"wordbool" |
+	"longbool" |
+	"real" |
+	"single" |
+	"double" |
+	"extended" |
+	"comp" |
+	"currency" |
+	"pointer"					{ addToken(Token.DATA_TYPE); }
+
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{EscapeSequence}				{ addToken(Token.PREPROCESSOR); }
+
+	/* Comment literals. */
+	{CompilerDirective1Begin}	{start = zzMarkedPos-2; yybegin(COMPILER_DIRECTIVE); }
+	{CompilerDirective2Begin}	{start = zzMarkedPos-3; yybegin(COMPILER_DIRECTIVE2); }
+	{MLCBegin}					{ start = zzMarkedPos-1; yybegin(MLC); }
+	{MLC2Begin}						{ start = zzMarkedPos-2; yybegin(MLC2); }
+	{LineCommentBegin}				{ start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	{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); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+
+<MLC> {
+
+	[^hwf\n\}]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.COMMENT_MULTILINE); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<MLC2> {
+
+	[^hwf\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_MLC2); return firstToken; }
+	{MLC2End}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_MLC2); return firstToken; }
+
+}
+
+
+<COMPILER_DIRECTIVE> {
+	[^\n\}]+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE); return firstToken; }
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.PREPROCESSOR); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE); return firstToken; }
+}
+
+
+<COMPILER_DIRECTIVE2> {
+	[^\n\*]+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE2); return firstToken; }
+	{MLC2End}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.PREPROCESSOR); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE2); return firstToken; }
+}
+
+
+
+<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; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.java
new file mode 100644
index 0000000..62ae77f
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.java
@@ -0,0 +1,1631 @@
+/* The following code was generated by JFlex 1.4.1 on 8/19/09 10:23 AM */
+
+/*
+ * 7/28/2009
+ *
+ * DelphiTokenMaker.java - Scanner for the Delphi programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Delphi programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated DelphiTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class DelphiTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int COMPILER_DIRECTIVE = 3;
+  public static final int EOL_COMMENT = 5;
+  public static final int YYINITIAL = 0;
+  public static final int COMPILER_DIRECTIVE2 = 4;
+  public static final int MLC = 1;
+  public static final int MLC2 = 2;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\13\1\12\1\0\1\13\1\7\22\0\1\13\1\42\1\7"+
+    "\1\10\1\11\1\42\1\42\1\14\1\17\1\21\1\20\1\27\1\42"+
+    "\1\27\1\30\1\22\1\4\7\6\2\3\1\45\1\42\1\44\1\46"+
+    "\1\44\1\42\1\43\3\5\1\25\1\26\1\25\5\1\1\24\13\1"+
+    "\1\23\2\1\1\41\1\0\1\41\1\44\1\2\1\0\1\36\1\55"+
+    "\1\60\1\62\1\34\1\35\1\56\1\47\1\51\1\66\1\67\1\37"+
+    "\1\54\1\57\1\61\1\50\1\70\1\32\1\40\1\31\1\33\1\63"+
+    "\1\52\1\64\1\53\1\65\1\15\1\7\1\16\1\42\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 =
+    "\6\0\1\1\1\2\2\3\1\2\1\4\1\5\1\6"+
+    "\1\7\1\10\1\11\1\12\1\11\1\12\11\2\1\12"+
+    "\14\2\1\13\1\14\1\15\4\13\1\16\2\13\1\17"+
+    "\1\20\1\13\1\21\2\13\1\22\3\13\1\23\1\3"+
+    "\1\24\1\23\1\24\1\23\1\25\1\23\1\26\1\27"+
+    "\1\30\1\31\3\2\1\32\15\2\1\32\20\2\1\32"+
+    "\31\2\1\32\3\2\4\0\1\33\1\34\4\0\1\24"+
+    "\1\0\2\25\1\35\22\2\1\36\2\2\1\32\73\2"+
+    "\1\32\1\2\10\0\1\37\1\2\1\40\1\36\56\2"+
+    "\1\40\2\2\1\36\16\2\2\0\1\41\2\0\1\42"+
+    "\13\2\1\32\40\2\1\32\10\2\4\0\10\2\1\36"+
+    "\65\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[437];
+    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\71\0\162\0\253\0\344\0\u011d\0\u0156\0\u018f"+
+    "\0\u01c8\0\u0201\0\u023a\0\u0273\0\u023a\0\u02ac\0\u02e5\0\u031e"+
+    "\0\u0357\0\u023a\0\u023a\0\u0390\0\u03c9\0\u0402\0\u043b\0\u0474"+
+    "\0\u04ad\0\u04e6\0\u051f\0\u0558\0\u0591\0\u0156\0\u05ca\0\u0603"+
+    "\0\u063c\0\u0675\0\u06ae\0\u06e7\0\u0720\0\u0759\0\u0792\0\u07cb"+
+    "\0\u0804\0\u083d\0\u0876\0\u023a\0\u023a\0\u08af\0\u08e8\0\u0921"+
+    "\0\u095a\0\u023a\0\u0993\0\u09cc\0\u023a\0\u023a\0\u0a05\0\u023a"+
+    "\0\u0a3e\0\u0a77\0\u023a\0\u0ab0\0\u0ae9\0\u0b22\0\u0b5b\0\u0b5b"+
+    "\0\u0b5b\0\u0b94\0\u0bcd\0\u0c06\0\u0c3f\0\u0c78\0\u023a\0\u023a"+
+    "\0\u0cb1\0\u023a\0\u0cea\0\u0d23\0\u0d5c\0\u018f\0\u0d95\0\u0dce"+
+    "\0\u0e07\0\u0e40\0\u0e79\0\u0eb2\0\u0eeb\0\u0f24\0\u0f5d\0\u0f96"+
+    "\0\u0fcf\0\u1008\0\u1041\0\u107a\0\u10b3\0\u10ec\0\u1125\0\u115e"+
+    "\0\u1197\0\u11d0\0\u1209\0\u1242\0\u127b\0\u12b4\0\u12ed\0\u1326"+
+    "\0\u135f\0\u1398\0\u13d1\0\u140a\0\u1443\0\u147c\0\u14b5\0\u14ee"+
+    "\0\u1527\0\u1560\0\u1599\0\u15d2\0\u160b\0\u1644\0\u167d\0\u16b6"+
+    "\0\u16ef\0\u1728\0\u1761\0\u179a\0\u17d3\0\u180c\0\u1845\0\u187e"+
+    "\0\u18b7\0\u18f0\0\u1929\0\u1962\0\u199b\0\u19d4\0\u1a0d\0\u1a46"+
+    "\0\u1a7f\0\u1ab8\0\u1af1\0\u1b2a\0\u1b63\0\u1b9c\0\u023a\0\u023a"+
+    "\0\u1bd5\0\u1c0e\0\u1c47\0\u1c80\0\u1cb9\0\u1cf2\0\u0b5b\0\u1d2b"+
+    "\0\u023a\0\u1d64\0\u1d9d\0\u1dd6\0\u1e0f\0\u1e48\0\u1e81\0\u1eba"+
+    "\0\u1ef3\0\u1f2c\0\u1f65\0\u1f9e\0\u1fd7\0\u2010\0\u2049\0\u2082"+
+    "\0\u20bb\0\u20f4\0\u212d\0\u018f\0\u2166\0\u219f\0\u21d8\0\u2211"+
+    "\0\u224a\0\u2283\0\u22bc\0\u22f5\0\u232e\0\u2367\0\u23a0\0\u23d9"+
+    "\0\u2412\0\u244b\0\u2484\0\u24bd\0\u24f6\0\u252f\0\u2568\0\u25a1"+
+    "\0\u25da\0\u2613\0\u264c\0\u2685\0\u26be\0\u26f7\0\u2730\0\u2769"+
+    "\0\u27a2\0\u27db\0\u2814\0\u284d\0\u2886\0\u28bf\0\u28f8\0\u2931"+
+    "\0\u296a\0\u29a3\0\u29dc\0\u2a15\0\u2a4e\0\u2a87\0\u2ac0\0\u2af9"+
+    "\0\u2b32\0\u2b6b\0\u2ba4\0\u2bdd\0\u2c16\0\u2c4f\0\u2c88\0\u2cc1"+
+    "\0\u2cfa\0\u2d33\0\u2d6c\0\u2da5\0\u2dde\0\u2e17\0\u2e50\0\u2e89"+
+    "\0\u2ec2\0\u2efb\0\u2f34\0\u2f6d\0\u2fa6\0\u2fdf\0\u3018\0\u3051"+
+    "\0\u308a\0\u30c3\0\u30fc\0\u3135\0\u018f\0\u316e\0\u018f\0\u31a7"+
+    "\0\u31e0\0\u3219\0\u3252\0\u328b\0\u32c4\0\u32fd\0\u3336\0\u336f"+
+    "\0\u33a8\0\u33e1\0\u341a\0\u3453\0\u348c\0\u34c5\0\u34fe\0\u3537"+
+    "\0\u3570\0\u35a9\0\u35e2\0\u361b\0\u3654\0\u368d\0\u36c6\0\u36ff"+
+    "\0\u3738\0\u3771\0\u37aa\0\u37e3\0\u381c\0\u3855\0\u388e\0\u38c7"+
+    "\0\u3900\0\u3939\0\u3972\0\u39ab\0\u39e4\0\u3a1d\0\u3a56\0\u3a8f"+
+    "\0\u3ac8\0\u3b01\0\u3b3a\0\u3b73\0\u3bac\0\u3be5\0\u3c1e\0\u3c57"+
+    "\0\u3c90\0\u3cc9\0\u3d02\0\u3d3b\0\u3d74\0\u3dad\0\u3de6\0\u3e1f"+
+    "\0\u3e58\0\u3e91\0\u3eca\0\u3f03\0\u3f3c\0\u3f75\0\u3fae\0\u3fe7"+
+    "\0\u4020\0\u4059\0\u4092\0\u40cb\0\u4104\0\u413d\0\u4176\0\u41af"+
+    "\0\u41e8\0\u4221\0\u425a\0\u4293\0\u42cc\0\u4305\0\u433e\0\u4377"+
+    "\0\u43b0\0\u43e9\0\u4422\0\u445b\0\u4494\0\u44cd\0\u4506\0\u453f"+
+    "\0\u4578\0\u45b1\0\u45ea\0\u4623\0\u465c\0\u4695\0\u46ce\0\u4707"+
+    "\0\u4740\0\u4779\0\u47b2\0\u47eb\0\u4824\0\u485d\0\u4896\0\u48cf"+
+    "\0\u4908\0\u4941\0\u497a\0\u49b3\0\u49ec\0\u4a25\0\u4a5e\0\u4a97"+
+    "\0\u4ad0\0\u4b09\0\u3eca\0\u4b42\0\u4b7b\0\u4bb4\0\u4bed\0\u4c26"+
+    "\0\u4c5f\0\u4c98\0\u4cd1\0\u4d0a\0\u4092\0\u4d43\0\u413d\0\u4d7c"+
+    "\0\u4db5\0\u4dee\0\u4e27\0\u4e60\0\u4e99\0\u4ed2\0\u4f0b\0\u1fd7"+
+    "\0\u4f44\0\u4f7d\0\u4fb6\0\u4fef\0\u5028\0\u5061\0\u509a\0\u50d3"+
+    "\0\u510c\0\u5145\0\u517e\0\u51b7\0\u51f0\0\u5229\0\u5262\0\u529b"+
+    "\0\u52d4\0\u530d\0\u5346\0\u537f\0\u53b8\0\u53f1\0\u542a\0\u5463"+
+    "\0\u549c\0\u54d5\0\u550e\0\u5547\0\u5580\0\u55b9\0\u55f2\0\u562b"+
+    "\0\u5664\0\u569d\0\u56d6\0\u570f\0\u5748\0\u5781\0\u57ba\0\u57f3"+
+    "\0\u582c\0\u5865\0\u589e\0\u58d7\0\u5910\0\u5949\0\u5982\0\u59bb"+
+    "\0\u59f4\0\u5a2d\0\u5a66\0\u5a9f\0\u5ad8";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[437];
+    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\7\2\10\1\11\1\12\1\10\1\11\1\13\1\14"+
+    "\1\10\1\15\1\16\1\17\1\20\1\13\1\21\1\22"+
+    "\1\23\1\24\4\10\1\22\1\25\1\26\1\27\1\30"+
+    "\1\31\1\32\1\33\1\34\1\35\1\23\1\13\1\36"+
+    "\3\22\1\10\1\37\1\40\1\41\1\10\1\42\1\43"+
+    "\1\44\1\45\1\46\1\47\1\50\1\51\1\52\4\10"+
+    "\12\53\1\54\3\53\1\55\16\53\1\56\11\53\1\57"+
+    "\2\53\1\60\16\53\12\61\1\62\5\61\1\63\14\61"+
+    "\1\56\11\61\1\57\2\61\1\60\16\61\12\64\1\65"+
+    "\3\64\1\66\52\64\12\67\1\70\5\67\1\71\50\67"+
+    "\12\72\1\73\22\72\1\74\11\72\1\75\2\72\1\76"+
+    "\16\72\7\7\1\0\2\7\11\0\4\7\2\0\10\7"+
+    "\2\0\1\7\3\0\23\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\22\10"+
+    "\3\77\2\11\1\77\1\11\1\0\2\77\11\0\1\77"+
+    "\1\100\1\101\1\102\1\0\1\103\3\77\1\102\1\101"+
+    "\1\77\1\100\1\77\2\0\1\77\3\0\13\77\1\101"+
+    "\11\77\1\104\1\105\1\77\1\105\1\0\2\77\11\0"+
+    "\1\106\1\100\1\101\1\102\1\0\1\103\3\77\1\102"+
+    "\1\101\1\77\1\100\1\77\2\0\1\77\3\0\13\77"+
+    "\1\101\1\77\1\106\4\77\71\0\3\7\2\14\1\7"+
+    "\1\14\1\0\2\7\11\0\4\7\2\0\10\7\2\0"+
+    "\1\7\3\0\22\7\13\0\1\16\55\0\14\17\1\107"+
+    "\54\17\11\0\1\110\77\0\1\111\72\0\1\112\51\0"+
+    "\2\103\1\0\1\103\62\0\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\10\1\113\6\10\2\0"+
+    "\1\7\3\0\1\114\3\10\1\115\5\10\1\116\7\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\3\10\1\117\1\10\1\120\2\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\7\10\1\121\2\0\1\7\3\0\10\10\1\122"+
+    "\11\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\6\10\1\123\1\10\2\0\1\7\3\0\10\10"+
+    "\1\124\4\10\1\125\4\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\2\10\1\126\2\10\1\127"+
+    "\2\10\2\0\1\7\3\0\2\10\1\130\7\10\1\131"+
+    "\7\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\116\1\132\1\133\4\10\1\134\2\0\1\7"+
+    "\3\0\6\10\1\135\13\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\5\10\1\136\2\10\2\0"+
+    "\1\7\3\0\2\10\1\137\7\10\1\140\7\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\141"+
+    "\2\10\1\142\1\10\1\143\2\10\2\0\1\7\3\0"+
+    "\1\144\1\10\1\145\2\10\1\146\14\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\147"+
+    "\1\150\2\10\1\151\1\152\1\10\2\0\1\7\3\0"+
+    "\12\10\1\153\7\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\4\10\1\116\2\10\1\116\2\0"+
+    "\1\7\3\0\5\10\1\154\2\10\1\155\11\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+    "\1\156\6\10\2\0\1\7\3\0\1\157\1\10\1\160"+
+    "\7\10\1\161\7\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\3\10\1\162\4\10\2\0\1\7"+
+    "\3\0\12\10\1\124\7\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\163\4\10\2\0"+
+    "\1\7\3\0\4\10\1\164\5\10\1\165\7\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\12\10\1\166\7\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\167"+
+    "\1\10\1\170\2\10\2\0\1\7\3\0\2\10\1\171"+
+    "\7\10\1\172\7\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\2\10\1\173\2\10\1\174\1\175"+
+    "\1\10\2\0\1\7\3\0\1\176\11\10\1\177\1\200"+
+    "\6\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\10\1\116\1\201\1\10\1\116\3\10\2\0"+
+    "\1\7\3\0\6\10\1\202\1\10\1\116\3\10\1\203"+
+    "\5\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\3\10\1\204\4\10\2\0\1\7\3\0\2\10"+
+    "\1\205\1\10\1\206\5\10\1\207\7\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\210"+
+    "\2\10\2\0\1\7\3\0\2\10\1\211\17\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\12\10\1\212\7\10\12\53\1\0"+
+    "\3\53\1\0\16\53\1\0\11\53\1\0\2\53\1\0"+
+    "\16\53\31\0\1\213\17\0\1\214\50\0\1\215\111\0"+
+    "\1\216\16\0\12\61\1\0\5\61\1\0\14\61\1\0"+
+    "\11\61\1\0\2\61\1\0\16\61\21\0\1\217\47\0"+
+    "\12\64\1\0\3\64\1\0\52\64\12\67\1\0\5\67"+
+    "\1\0\50\67\21\0\1\220\47\0\12\72\1\0\22\72"+
+    "\1\0\11\72\1\0\2\72\1\0\16\72\31\0\1\221"+
+    "\17\0\1\222\50\0\1\223\111\0\1\224\16\0\7\77"+
+    "\1\0\2\77\11\0\4\77\2\0\10\77\2\0\1\77"+
+    "\3\0\25\77\2\225\1\77\1\225\1\0\2\77\11\0"+
+    "\4\77\1\226\1\0\10\77\2\0\1\77\3\0\25\77"+
+    "\2\103\1\77\1\103\1\0\2\77\11\0\2\77\1\101"+
+    "\1\102\2\0\3\77\1\102\1\101\3\77\2\0\1\77"+
+    "\3\0\13\77\1\101\11\77\2\104\1\77\1\104\1\0"+
+    "\2\77\11\0\2\77\1\101\1\102\1\0\1\103\3\77"+
+    "\1\102\1\101\3\77\2\0\1\77\3\0\13\77\1\101"+
+    "\11\77\1\104\1\105\1\77\1\105\1\0\2\77\11\0"+
+    "\1\77\1\227\1\101\1\102\1\0\1\103\3\77\1\102"+
+    "\1\101\1\77\1\227\1\77\2\0\1\77\3\0\13\77"+
+    "\1\101\11\77\4\230\1\0\2\77\11\0\2\77\2\230"+
+    "\2\0\3\77\3\230\2\77\2\0\1\77\3\0\6\77"+
+    "\1\230\2\77\1\230\1\77\1\230\6\77\11\0\1\231"+
+    "\57\0\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\2\10\1\232\5\10\2\0\1\7\3\0\4\10"+
+    "\1\116\15\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\233\1\10\1\234\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\1\10"+
+    "\1\235\20\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\5\10\1\236\1\10\1\237\2\0\1\7"+
+    "\3\0\1\10\1\240\1\241\4\10\1\242\1\10\1\243"+
+    "\7\10\1\244\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\2\10\1\123"+
+    "\17\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\3\10\1\245\4\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\246\6\10\1\247\2\0\1\7\3\0\2\10\1\201"+
+    "\17\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\7\10\1\235\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\13\10\1\116\6\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\250\7\10"+
+    "\2\0\1\7\3\0\1\10\1\251\7\10\1\252\10\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\10\10\1\253\11\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+    "\1\254\4\10\1\255\1\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\6\10\1\235\1\10\2\0\1\7\3\0\10\10\1\256"+
+    "\11\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\10\1\257\6\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\10\1\260\6\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\261"+
+    "\7\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\7\10\1\262\2\0"+
+    "\1\7\3\0\5\10\1\116\14\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\7\10\1\263\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\6\10"+
+    "\1\264\13\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\6\10\1\265"+
+    "\13\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\10\10\2\0\1\7\3\0\10\10\1\266\1\267"+
+    "\10\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\10\1\270\3\10\1\271\2\10\2\0\1\7"+
+    "\3\0\12\10\1\272\1\273\6\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\116\4\10\1\274"+
+    "\1\275\1\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\4\10\1\276"+
+    "\3\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\10\1\116\4\10"+
+    "\1\116\1\10\2\0\1\7\3\0\12\10\1\277\7\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\10\10\1\300\11\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\5\10"+
+    "\1\301\2\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\2\10\1\302\7\10\1\303\7\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\6\10\1\304\13\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\7\10\1\305"+
+    "\2\0\1\7\3\0\11\10\1\306\10\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\307"+
+    "\2\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\2\10\1\310\17\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\1\10\1\311\20\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\312\5\10\1\313\1\10\2\0"+
+    "\1\7\3\0\1\314\1\10\1\315\10\10\1\316\6\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\2\10\1\317\17\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\2\10\1\320\17\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\321\7\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\10\1\322\6\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\7\10\1\323\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\10\10\2\0\1\7\3\0\7\10\1\324\12\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\325\7\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\12\10\1\326\7\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\327\7\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\5\10\1\330\2\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\5\10\1\331"+
+    "\14\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\6\10\1\254\1\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\116\7\10\2\0\1\7\3\0\13\10\1\332\6\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\10\1\333\6\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+    "\1\334\5\10\1\235\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\5\10"+
+    "\1\335\2\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\336"+
+    "\2\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\5\10\1\337\2\10\1\340\11\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\341"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\116\7\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\17\10"+
+    "\1\342\2\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\3\10\1\343\4\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\4\10\1\344\2\10\1\345\2\0\1\7\3\0"+
+    "\1\10\1\346\20\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\7\10\1\347\2\0\1\7\3\0"+
+    "\14\10\1\116\5\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\10\10"+
+    "\1\350\11\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\2\10\1\351\5\10\2\0\1\7\3\0"+
+    "\3\10\1\352\16\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\10\1\353\6\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\354\6\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\10\1\116\6\10\2\0\1\7\3\0\22\10"+
+    "\50\0\1\355\57\0\1\356\62\0\1\357\111\0\1\360"+
+    "\66\0\1\361\57\0\1\362\62\0\1\363\111\0\1\364"+
+    "\16\0\3\77\2\225\1\77\1\225\1\0\2\77\11\0"+
+    "\2\77\1\101\1\77\2\0\4\77\1\101\3\77\2\0"+
+    "\1\77\3\0\13\77\1\101\6\77\3\0\2\225\1\0"+
+    "\1\225\62\0\3\77\4\230\1\0\2\77\11\0\1\77"+
+    "\1\227\2\230\2\0\3\77\3\230\1\227\1\77\2\0"+
+    "\1\77\3\0\6\77\1\230\2\77\1\230\1\77\1\230"+
+    "\6\77\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\3\10\1\365\4\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\3\10\1\366\4\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\10\10\1\116\11\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\116"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\6\10\1\367\1\10"+
+    "\2\0\1\7\3\0\13\10\1\370\6\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\2\10\1\371\7\10\1\372\7\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\3\10"+
+    "\1\373\4\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\10\10\1\374\11\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\2\10\1\375\17\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\12\10\1\376\7\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\2\10\1\377\5\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\7\10\1\116\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\2\10\1\u0100\17\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\5\10"+
+    "\1\u0101\2\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u0102"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\12\10\1\u0103\7\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\u0104\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\11\10"+
+    "\1\u0105\10\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\7\10\1\232\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\5\10\1\u0106\2\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\3\10\1\u0107\16\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\u0108"+
+    "\2\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\12\10\1\u0109\7\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\u010a\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\u010b\7\10\2\0\1\7\3\0"+
+    "\12\10\1\u010c\7\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\3\10\1\u0100\4\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\u010d\6\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\10\10\2\0\1\7\3\0\7\10\1\u010e\12\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\5\10\1\171\2\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\2\10\1\u010f\17\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\u0110\7\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\10\1\u0111\6\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\11\10"+
+    "\1\u0112\10\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\6\10\1\u0113\1\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\4\10\1\254\3\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\3\10\1\273\4\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+    "\1\u0114\6\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\7\10\1\u0115\12\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\6\10\1\u0116\1\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\14\10\1\u0117\5\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\u0118\7\10\2\0\1\7\3\0"+
+    "\1\10\1\u0119\5\10\1\u011a\1\10\1\u011b\10\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\6\10"+
+    "\1\u011c\1\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\11\10\1\267\10\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\20\10\1\u011d\1\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\u011e\7\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\10\10\1\u011f"+
+    "\11\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\6\10\1\u0120\1\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\3\10\1\u0121\4\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\2\10\1\u0122\17\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u0123"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\u0124\7\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\3\10\1\u0125\4\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\u0126\7\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\6\10\1\235\1\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\1\116\21\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\13\10\1\u0127\6\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\7\10\1\u0128\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\2\10\1\234"+
+    "\17\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\3\10\1\u0127\4\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\6\10\1\u0129\1\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\12\10\1\116\7\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\254"+
+    "\6\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\3\10\1\u012a\4\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\u012b\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\10\1\u012c\6\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\13\10\1\u012d"+
+    "\6\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\7\10\1\245\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+    "\1\367\6\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\1\10\1\367\20\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\u012e\6\10\1\u012f"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\11\10\1\171\10\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\3\10\1\u0130\4\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\u0131\6\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\5\10\1\u0132\2\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\u0133\7\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\u0134"+
+    "\6\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\1\10\1\u0135\20\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\5\10\1\u0136\2\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\6\10"+
+    "\1\u0115\13\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\10\10\1\166"+
+    "\11\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\5\10\1\u0137\2\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\u0138\7\10\2\0\1\7\3\0\22\10\45\0\1\u0139"+
+    "\57\0\1\355\104\0\1\u013a\50\0\1\u013b\105\0\1\u013c"+
+    "\57\0\1\361\104\0\1\u013d\50\0\1\u013e\40\0\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\5\10"+
+    "\1\u013f\2\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\12\10\1\u0140\7\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\13\10\1\u0141\6\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\2\10\1\u0142\5\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\5\10\1\201\2\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\u0143\7\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\7\10\1\u0144\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\124"+
+    "\6\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\2\10\1\u0145\17\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\6\10\1\116\1\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\4\10\1\235\3\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\u0146\6\10\2\0\1\7\3\0"+
+    "\10\10\1\u0147\11\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\10\1\u0148\6\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\1\10\1\201"+
+    "\20\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\u0149\7\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\6\10"+
+    "\1\u014a\1\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\u014b"+
+    "\2\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\4\10\1\116\15\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\5\10\1\u014c\14\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\5\10"+
+    "\1\u014d\14\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\u014e\6\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\6\10\1\u014f\1\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\5\10\1\u0150\2\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\2\10\1\u0151\3\10\1\u0152\13\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\10\10\1\u0153\11\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\2\10\1\u0154\17\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u0155"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\5\10\1\u0156\2\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\124\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\u0157\7\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\6\10\1\u0158\1\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\6\10\1\u0157\1\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\5\10"+
+    "\1\u0159\2\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u015a"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\3\10\1\u015b\4\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\10\1\u015c\6\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\3\10\1\u015d\4\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\2\10\1\u015e"+
+    "\17\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\3\10\1\124\1\10\1\u015f\2\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\4\10\1\u0160\3\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\u0161\7\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\3\10"+
+    "\1\u0162\4\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\u0163"+
+    "\6\10\2\0\1\7\3\0\7\10\1\u0161\12\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\10\10\1\235\11\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\u0164"+
+    "\6\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\2\10\1\u0165\17\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\15\10\1\254\4\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\3\10\1\370\4\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\6\10\1\u0152"+
+    "\13\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\5\10\1\u015f\2\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\3\10\1\u0166\4\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\7\10"+
+    "\1\u0167\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\4\10\1\344\3\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\u0168\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\2\10"+
+    "\1\u0169\17\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\5\10\1\u016a\2\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\u016b\7\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\11\10\1\201\10\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\u016c"+
+    "\4\10\1\u016d\1\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\2\10"+
+    "\1\u016e\5\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\u016f"+
+    "\6\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\3\10\1\u0170\4\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\2\10\1\u0171\17\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\5\10"+
+    "\1\u0172\14\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\u0173\6\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\2\10\1\267\5\10\2\0\1\7\3\0\22\10"+
+    "\22\0\1\u0174\106\0\1\355\4\0\1\u0139\24\0\1\u013b"+
+    "\1\u0175\4\u013b\1\0\1\u0175\1\u013b\2\0\1\u0175\2\0"+
+    "\3\u0175\5\u013b\2\u0175\10\u013b\3\u0175\1\0\2\u0175\22\u013b"+
+    "\22\0\1\u0176\106\0\1\361\4\0\1\u013c\24\0\1\u013e"+
+    "\1\u0177\4\u013e\1\0\1\u0177\1\u013e\2\0\1\u0177\2\0"+
+    "\3\u0177\5\u013e\2\u0177\10\u013e\3\u0177\1\0\2\u0177\22\u013e"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\13\10\1\u0178\6\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\10\10\1\u0179\11\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u017a"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\10\1\u017b\6\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\10\1\u017c\6\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\u017d\7\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\10\1\u017e\6\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\10\10\1\267\11\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\13\10\1\u017f\6\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\u0180\7\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\2\10\1\u0181\17\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\6\10\1\u0108\1\10\2\0\1\7"+
+    "\3\0\2\10\1\u0182\17\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\10\1\u0155\6\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\5\10\1\u0183\2\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\6\10\1\u0184"+
+    "\13\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\5\10\1\u0185\2\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\2\10\1\u0159\5\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+    "\1\u0186\6\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\10\10\1\u0187\11\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\12\10\1\u0188\7\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\7\10\1\116\12\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\11\10"+
+    "\1\116\10\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\13\10\1\254"+
+    "\6\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\6\10\1\171\1\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\2\10\1\u0151\17\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\3\10"+
+    "\1\367\4\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\u0189\7\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\11\10\1\u0183\10\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\10\1\u018a\6\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\5\10\1\u018b\2\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\10\10\2\0\1\7\3\0\13\10\1\u018c\6\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\7\10\1\u018d\2\0\1\7\3\0\11\10\1\254\10\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\7\10\1\u0189\12\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\12\10\1\u018e\7\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\336"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\5\10\1\u018f\14\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\4\10\1\u0190\3\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\2\10"+
+    "\1\u0191\17\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\5\10\1\u0192\2\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\5\10\1\u0193\2\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\1\10\1\u0194\20\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\10\10\1\u0195\11\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\10\10\1\u0196\11\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\2\10\1\u0197\17\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\2\10\1\u0198\17\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\12\10"+
+    "\1\u0199\7\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\6\10\1\u019a\1\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\2\10\1\u019b\5\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\11\10\1\u014c\10\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\10\10\1\u019c\2\10\1\254\6\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\2\10\1\u019d\17\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\7\10\1\u019e\12\10\22\0\1\u013b"+
+    "\70\0\1\u013e\46\0\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\14\10"+
+    "\1\u019f\5\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\6\10\1\u0186\1\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\10\10\2\0\1\7\3\0\10\10\1\u019a\11\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\11\10\1\u01a0\10\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\12\10\1\u01a1\7\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\330"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\3\10\1\u019e\4\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\u01a2\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\12\10"+
+    "\1\234\7\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\16\10\1\u01a3"+
+    "\3\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\u0111\7\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\6\10"+
+    "\1\u017d\1\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\11\10\1\u019a\10\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\4\10\1\254\15\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\367\7\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\12\10\1\u01a4"+
+    "\7\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\3\10\1\254\4\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\u0108\7\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\5\10\1\116\14\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\2\10\1\u01a5\5\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\1\u0111\21\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\u01a6\6\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\3\10\1\u01a7\4\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\5\10\1\u01a8\2\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\u0113"+
+    "\7\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\6\10\1\u01a9\1\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\10\10\1\367\11\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\5\10\1\u01aa\2\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\11\10\1\u01ab"+
+    "\10\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\5\10\1\u01a4\2\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\10\10\1\u019e\11\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\13\10\1\u0189\6\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\u0155"+
+    "\2\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\254\7\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\11\10"+
+    "\1\u01ac\10\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\u01ad\7\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\11\10\1\254\10\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\7\10"+
+    "\1\254\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\5\10\1\212\2\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\u01ae\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\13\10"+
+    "\1\u01af\6\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\13\10\1\367"+
+    "\6\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\5\10\1\u0105\2\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\6\10\1\367\1\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+    "\1\235\6\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\5\10\1\254\14\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\10\10\1\u01b0\11\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\11\10\1\235\10\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\2\10"+
+    "\1\u0182\17\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\11\10\1\u017e"+
+    "\10\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\10\10\2\0\1\7\3\0\4\10\1\367\15\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\52\7\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u01b1"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\7\10\1\u01b2\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\2\10\1\u01b3\5\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\u01b4\7\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\10\1\u0163\6\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\u01b5"+
+    "\7\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\11\10\1\u0189\10\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\5\10\1\u0105\1\10\1\254"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\10\1\270\6\10\2\0"+
+    "\1\7\3\0\22\10";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[23313];
+    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 =
+    "\6\0\4\1\1\11\1\1\1\11\4\1\2\11\30\1"+
+    "\2\11\4\1\1\11\2\1\2\11\1\1\1\11\2\1"+
+    "\1\11\13\1\2\11\1\1\1\11\100\1\4\0\2\11"+
+    "\4\0\1\1\1\0\2\1\1\11\123\1\10\0\104\1"+
+    "\2\0\1\1\2\0\66\1\4\0\76\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[437];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Token type specific to DelphiTokenMaker; denotes a line ending
+	 * with an unterminated "(*" comment.
+	 */
+	public static final int INTERNAL_MLC2			= -1;
+
+	/**
+	 * Token type specific to DelphiTokenMaker; denotes a line ending
+	 * with an unterminated "{$" compiler directive.
+	 */
+	public static final int INTERNAL_COMPILER_DIRECTIVE	= -2;
+
+	/**
+	 * Token type specific to DelphiTokenMaker; denotes a line ending
+	 * with an unterminated "(*$" compiler directive.
+	 */
+	public static final int INTERNAL_COMPILER_DIRECTIVE2	= -3;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public DelphiTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case INTERNAL_MLC2:
+				state = MLC2;
+				start = text.offset;
+				break;
+			case INTERNAL_COMPILER_DIRECTIVE:
+				state = COMPILER_DIRECTIVE;
+				start = text.offset;
+				break;
+			case INTERNAL_COMPILER_DIRECTIVE2:
+				state = COMPILER_DIRECTIVE2;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+		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 DelphiTokenMaker(java.io.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 DelphiTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 158) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 15: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE); return firstToken;
+          }
+        case 35: break;
+        case 4: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 36: break;
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 37: break;
+        case 27: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 38: break;
+        case 6: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 39: break;
+        case 21: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 40: break;
+        case 20: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 41: break;
+        case 26: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 42: break;
+        case 16: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.PREPROCESSOR);
+          }
+        case 43: break;
+        case 9: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 44: break;
+        case 17: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE2); return firstToken;
+          }
+        case 45: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 46: break;
+        case 18: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 47: break;
+        case 25: 
+          { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+          }
+        case 48: break;
+        case 30: 
+          { addToken(Token.FUNCTION);
+          }
+        case 49: break;
+        case 7: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 50: break;
+        case 14: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_MLC2); return firstToken;
+          }
+        case 51: break;
+        case 32: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 52: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 53: break;
+        case 31: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 54: break;
+        case 22: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 55: break;
+        case 34: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 56: break;
+        case 29: 
+          { start = zzMarkedPos-3; yybegin(COMPILER_DIRECTIVE2);
+          }
+        case 57: break;
+        case 24: 
+          { start = zzMarkedPos-2; yybegin(MLC2);
+          }
+        case 58: break;
+        case 33: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 59: break;
+        case 19: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 60: break;
+        case 28: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.PREPROCESSOR);
+          }
+        case 61: break;
+        case 13: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.COMMENT_MULTILINE);
+          }
+        case 62: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 63: break;
+        case 10: 
+          { addToken(Token.OPERATOR);
+          }
+        case 64: break;
+        case 8: 
+          { start = zzMarkedPos-1; yybegin(MLC);
+          }
+        case 65: break;
+        case 23: 
+          { start = zzMarkedPos-2; yybegin(COMPILER_DIRECTIVE);
+          }
+        case 66: break;
+        case 11: 
+          { 
+          }
+        case 67: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 68: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case COMPILER_DIRECTIVE: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE); return firstToken;
+            }
+            case 438: break;
+            case EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+            }
+            case 439: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 440: break;
+            case COMPILER_DIRECTIVE2: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE2); return firstToken;
+            }
+            case 441: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 442: break;
+            case MLC2: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_MLC2); return firstToken;
+            }
+            case 443: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.flex
new file mode 100644
index 0000000..0c15fe8
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.flex
@@ -0,0 +1,345 @@
+/*
+ * 04/12/2012
+ *
+ * DtdTokenMaker.java - Generates tokens for DTD syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for DTD files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>XMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+%%
+
+%public
+%class DtdTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed XML tag; thus a new line is beginning still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG_START					= -1;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed DOCTYPE element.
+	 */
+	public static final int INTERNAL_INTAG_ELEMENT					= -2;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed, locally-defined DTD in a DOCTYPE element.
+	 */
+	public static final int INTERNAL_INTAG_ATTLIST			= -3;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed comment.  The state to return to when this comment ends is
+	 * embedded in the token type as well.
+	 */
+	public static final int INTERNAL_IN_COMMENT			= -(1<<11);
+
+	/**
+	 * The state we were in prior to the current one.  This is used to know
+	 * what state to resume after an MLC ends.
+	 */
+	private int prevState;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public DtdTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Always returns <tt>false</tt>, as you never want "mark occurrences"
+	 * working in XML files.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	/**
+	 * 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;
+		prevState = YYINITIAL;
+
+		// Start off in the proper state.
+		int state = YYINITIAL;
+		switch (initialTokenType) {
+			case INTERNAL_INTAG_START:
+				state = INTAG_START;
+				break;
+			case INTERNAL_INTAG_ELEMENT:
+				state = INTAG_ELEMENT;
+				break;
+			case INTERNAL_INTAG_ATTLIST:
+				state = INTAG_ATTLIST;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_COMMENT - prevState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_COMMENT:
+							state = COMMENT;
+							break;
+					}
+					prevState = -initialTokenType&0xff;
+				}
+				else { // Shouldn't happen
+					state = YYINITIAL;
+				}
+		}
+
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.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;
+	}
+
+
+%}
+
+Whitespace			= ([ \t\f])
+LineTerminator			= ([\n])
+UnclosedString		= ([\"][^\"]*)
+UnclosedChar		= ([\'][^\']*)
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ([A-Za-z_0-9\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$A-Za-z0-9])
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state COMMENT
+%state INTAG_START
+%state INTAG_ELEMENT
+%state INTAG_ATTLIST
+
+%%
+
+<YYINITIAL> {
+	([^ \t\f<]+)				{ /* Not really valid */ addToken(Token.IDENTIFIER); }
+	"<!--"						{ start = zzStartRead; prevState = zzLexicalState; yybegin(COMMENT); }
+	"<!"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG_START); }
+	"<"							{ addToken(Token.IDENTIFIER); }
+	{Whitespace}+				{ addToken(Token.WHITESPACE); }
+	{LineTerminator} |
+	<<EOF>>						{ addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+	[^hwf\n\-]+					{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]						{}
+	"-->"						{ int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE); start = temp; yybegin(prevState); }
+	"-"							{}
+	{LineTerminator} |
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_COMMENT - prevState); return firstToken; }
+}
+
+<INTAG_START> {
+	("ELEMENT")					{ addToken(Token.MARKUP_TAG_NAME); yybegin(INTAG_ELEMENT); }
+	("ATTLIST")					{ addToken(Token.MARKUP_TAG_NAME); yybegin(INTAG_ATTLIST); }
+	([^ \t\f>]+)				{ addToken(Token.IDENTIFIER); }
+	{Whitespace}+				{ addToken(Token.WHITESPACE); }
+	(">")						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	<<EOF>>						{ addEndToken(INTERNAL_INTAG_START); return firstToken; }
+}
+
+<INTAG_ELEMENT> {
+	([^ \t\f>]+)				{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}+				{ addToken(Token.WHITESPACE); }
+	(">")						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	<<EOF>>						{ addEndToken(INTERNAL_INTAG_ELEMENT); return firstToken; }
+}
+
+<INTAG_ATTLIST> {
+	("CDATA"|"#IMPLIED"|"#REQUIRED")	{ addToken(Token.MARKUP_PROCESSING_INSTRUCTION); }
+	([^ \t\f>\"\']+)			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	({UnclosedString}[\"]?)		{ addToken(Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	({UnclosedChar}[\']?)		{ addToken(Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	{Whitespace}+				{ addToken(Token.WHITESPACE); }
+	(">")						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	<<EOF>>						{ addEndToken(INTERNAL_INTAG_ATTLIST); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.java
new file mode 100644
index 0000000..26dbe3d
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.java
@@ -0,0 +1,828 @@
+/* The following code was generated by JFlex 1.4.1 on 4/14/12 10:23 AM */
+
+/*
+ * 04/12/2012
+ *
+ * DtdTokenMaker.java - Generates tokens for DTD syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for DTD files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>XMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+
+public class DtdTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int INTAG_START = 2;
+  public static final int INTAG_ELEMENT = 3;
+  public static final int YYINITIAL = 0;
+  public static final int INTAG_ATTLIST = 4;
+  public static final int COMMENT = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\1\1\2\1\0\1\1\23\0\1\1\1\24\1\3\1\41"+
+    "\1\7\1\5\1\5\1\4\5\5\1\25\1\22\1\6\12\7\1\20"+
+    "\1\5\1\23\1\5\1\26\2\5\1\34\1\7\1\37\1\40\1\27"+
+    "\3\7\1\35\2\7\1\30\1\31\1\32\1\7\1\42\1\44\1\43"+
+    "\1\36\1\33\1\45\5\7\1\5\1\0\1\5\1\0\1\5\1\0"+
+    "\4\7\1\17\1\14\1\7\1\10\1\15\2\7\1\16\3\7\1\12"+
+    "\2\7\1\13\1\11\2\7\1\21\3\7\3\0\1\5\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 =
+    "\5\0\1\1\1\2\1\3\1\4\1\5\4\4\1\3"+
+    "\1\6\2\3\2\7\2\10\2\7\1\11\5\0\2\3"+
+    "\1\10\3\7\5\0\1\12\2\3\3\7\1\13\2\0"+
+    "\1\14\2\3\3\7\2\0\2\3\1\15\2\7\2\3"+
+    "\2\7\1\16\1\17\1\7";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[70];
+    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\46\0\114\0\162\0\230\0\276\0\344\0\u010a"+
+    "\0\u0130\0\u0156\0\u017c\0\u01a2\0\u01c8\0\u01ee\0\u0214\0\u0156"+
+    "\0\u023a\0\u0260\0\u0286\0\u02ac\0\u02d2\0\u02f8\0\u031e\0\u0344"+
+    "\0\u036a\0\u0390\0\u03b6\0\u03dc\0\u0402\0\u0428\0\u044e\0\u0474"+
+    "\0\u0156\0\u049a\0\u04c0\0\u04e6\0\u050c\0\u0532\0\u0558\0\u057e"+
+    "\0\u05a4\0\u0156\0\u05ca\0\u05f0\0\u0616\0\u063c\0\u0662\0\u0156"+
+    "\0\u0688\0\u06ae\0\u06d4\0\u06fa\0\u0720\0\u0746\0\u076c\0\u0792"+
+    "\0\u07b8\0\u06d4\0\u07de\0\u0804\0\u02ac\0\u082a\0\u0850\0\u0876"+
+    "\0\u089c\0\u08c2\0\u08e8\0\u0214\0\u0214\0\u090e";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[70];
+    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\6\1\7\21\6\1\10\22\6\2\11\1\12\5\11"+
+    "\1\13\3\11\1\14\4\11\1\15\3\11\1\16\20\11"+
+    "\1\17\1\7\24\17\1\20\1\21\4\17\1\22\11\17"+
+    "\1\23\1\7\24\23\1\20\17\23\1\24\1\7\1\24"+
+    "\1\25\1\26\21\24\1\20\10\24\1\27\1\24\1\30"+
+    "\4\24\1\6\1\0\21\6\1\0\22\6\1\0\1\7"+
+    "\70\0\1\31\21\0\2\11\1\0\5\11\1\0\3\11"+
+    "\1\0\4\11\1\0\3\11\1\0\20\11\57\0\1\32"+
+    "\45\0\1\33\3\0\1\34\51\0\1\35\51\0\1\36"+
+    "\20\0\1\17\1\0\24\17\1\0\20\17\1\0\24\17"+
+    "\1\0\1\17\1\37\16\17\1\0\24\17\1\0\4\17"+
+    "\1\40\12\17\1\23\1\0\24\23\1\0\17\23\1\24"+
+    "\1\0\1\24\2\0\21\24\1\0\17\24\3\25\1\41"+
+    "\42\25\4\26\1\41\41\26\1\24\1\0\1\24\2\0"+
+    "\21\24\1\0\11\24\1\42\6\24\1\0\1\24\2\0"+
+    "\21\24\1\0\6\24\1\43\5\24\1\44\2\24\25\0"+
+    "\1\45\31\0\1\46\46\0\1\47\51\0\1\50\50\0"+
+    "\1\51\52\0\1\52\17\0\1\17\1\0\24\17\1\0"+
+    "\1\53\17\17\1\0\24\17\1\0\4\17\1\54\12\17"+
+    "\1\24\1\0\1\24\2\0\21\24\1\0\5\24\1\55"+
+    "\12\24\1\0\1\24\2\0\21\24\1\0\2\24\1\56"+
+    "\15\24\1\0\1\24\2\0\21\24\1\0\1\57\16\24"+
+    "\25\0\1\60\32\0\1\61\53\0\1\62\44\0\1\47"+
+    "\50\0\1\63\23\0\1\17\1\0\24\17\1\0\2\17"+
+    "\1\64\15\17\1\0\24\17\1\0\1\17\1\65\15\17"+
+    "\1\24\1\0\1\24\2\0\21\24\1\0\4\24\1\66"+
+    "\13\24\1\0\1\24\2\0\21\24\1\0\13\24\1\67"+
+    "\4\24\1\0\1\24\2\0\21\24\1\0\15\24\1\70"+
+    "\1\24\13\0\1\47\4\0\1\62\33\0\1\71\43\0"+
+    "\2\72\12\63\1\72\1\63\1\72\1\0\2\72\1\0"+
+    "\12\63\1\72\4\63\1\17\1\0\24\17\1\0\1\73"+
+    "\17\17\1\0\24\17\1\0\6\17\1\74\10\17\1\24"+
+    "\1\0\1\24\2\0\21\24\1\0\5\24\1\75\12\24"+
+    "\1\0\1\24\2\0\21\24\1\0\1\24\1\76\16\24"+
+    "\1\0\1\24\2\0\21\24\1\0\16\24\1\77\6\0"+
+    "\1\63\37\0\1\17\1\0\24\17\1\0\3\17\1\100"+
+    "\14\17\1\0\24\17\1\0\7\17\1\101\7\17\1\24"+
+    "\1\0\1\24\2\0\21\24\1\0\6\24\1\102\11\24"+
+    "\1\0\1\24\2\0\21\24\1\0\6\24\1\103\10\24"+
+    "\1\17\1\0\24\17\1\0\4\17\1\104\13\17\1\0"+
+    "\24\17\1\0\4\17\1\105\12\17\1\24\1\0\1\24"+
+    "\2\0\21\24\1\0\1\106\17\24\1\0\1\24\2\0"+
+    "\21\24\1\0\14\24\1\102\3\24\1\0\1\24\2\0"+
+    "\21\24\1\0\11\24\1\75\5\24";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[2356];
+    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 =
+    "\5\0\4\1\1\11\5\1\1\11\11\1\5\0\2\1"+
+    "\1\11\3\1\5\0\1\11\5\1\1\11\2\0\6\1"+
+    "\2\0\14\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[70];
+    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;
+
+  /* user code: */
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed XML tag; thus a new line is beginning still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG_START					= -1;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed DOCTYPE element.
+	 */
+	public static final int INTERNAL_INTAG_ELEMENT					= -2;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed, locally-defined DTD in a DOCTYPE element.
+	 */
+	public static final int INTERNAL_INTAG_ATTLIST			= -3;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed comment.  The state to return to when this comment ends is
+	 * embedded in the token type as well.
+	 */
+	public static final int INTERNAL_IN_COMMENT			= -(1<<11);
+
+	/**
+	 * The state we were in prior to the current one.  This is used to know
+	 * what state to resume after an MLC ends.
+	 */
+	private int prevState;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public DtdTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Always returns <tt>false</tt>, as you never want "mark occurrences"
+	 * working in XML files.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	/**
+	 * 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;
+		prevState = YYINITIAL;
+
+		// Start off in the proper state.
+		int state = YYINITIAL;
+		switch (initialTokenType) {
+			case INTERNAL_INTAG_START:
+				state = INTAG_START;
+				break;
+			case INTERNAL_INTAG_ELEMENT:
+				state = INTAG_ELEMENT;
+				break;
+			case INTERNAL_INTAG_ATTLIST:
+				state = INTAG_ATTLIST;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_COMMENT - prevState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_COMMENT:
+							state = COMMENT;
+							break;
+					}
+					prevState = -initialTokenType&0xff;
+				}
+				else { // Shouldn't happen
+					state = YYINITIAL;
+				}
+		}
+
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 DtdTokenMaker(java.io.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 DtdTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 138) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 3: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 16: break;
+        case 12: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 17: break;
+        case 2: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 18: break;
+        case 1: 
+          { /* Not really valid */ addToken(Token.IDENTIFIER);
+          }
+        case 19: break;
+        case 9: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG_START);
+          }
+        case 20: break;
+        case 6: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL);
+          }
+        case 21: break;
+        case 11: 
+          { start = zzStartRead; prevState = zzLexicalState; yybegin(COMMENT);
+          }
+        case 22: break;
+        case 7: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 23: break;
+        case 10: 
+          { int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE); start = temp; yybegin(prevState);
+          }
+        case 24: break;
+        case 15: 
+          { addToken(Token.MARKUP_TAG_NAME); yybegin(INTAG_ATTLIST);
+          }
+        case 25: break;
+        case 14: 
+          { addToken(Token.MARKUP_TAG_NAME); yybegin(INTAG_ELEMENT);
+          }
+        case 26: break;
+        case 13: 
+          { addToken(Token.MARKUP_PROCESSING_INSTRUCTION);
+          }
+        case 27: break;
+        case 4: 
+          { 
+          }
+        case 28: break;
+        case 5: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_COMMENT - prevState); return firstToken;
+          }
+        case 29: break;
+        case 8: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 30: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case INTAG_START: {
+              addEndToken(INTERNAL_INTAG_START); return firstToken;
+            }
+            case 71: break;
+            case INTAG_ELEMENT: {
+              addEndToken(INTERNAL_INTAG_ELEMENT); return firstToken;
+            }
+            case 72: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 73: break;
+            case INTAG_ATTLIST: {
+              addEndToken(INTERNAL_INTAG_ATTLIST); return firstToken;
+            }
+            case 74: break;
+            case COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_COMMENT - prevState); return firstToken;
+            }
+            case 75: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.flex
new file mode 100644
index 0000000..b4f1c81
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.flex
@@ -0,0 +1,480 @@
+/*
+ * 03/23/2005
+ *
+ * FortranTokenMaker.java - Scanner for the Fortran programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Fortran programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated FortranTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+%%
+
+%public
+%class FortranTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  We must have this here as there is no default,
+	 * no-parameter constructor generated by JFlex.
+	 */
+	public FortranTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+	}
+
+
+%}
+
+LineTerminator			= (\n)
+WhiteSpace			= ([ \t\f])
+
+Column1CommentBegin		= ([C\*])
+Column1Comment2Begin	= (D)
+AnywhereCommentBegin	= (\!)
+
+Identifier			= ([A-Za-z0-9_$]+)
+
+StringDelimiter		= (\")
+CharDelimiter			= (\')
+
+Operators1			= ("<"|">"|"<="|">="|"&"|"/="|"==")
+Operators2			= (\.(lt|gt|eq|ne|le|ge|and|or)\.)
+Operator				= ({Operators1}|{Operators2})
+
+Boolean				= (\.(true|false)\.)
+
+%state STRING
+%state CHAR
+
+%%
+
+/* Keywords */
+<YYINITIAL> "INCLUDE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "PROGRAM"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MODULE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SUBROUTINE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FUNCTION"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CONTAINS"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "USE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CALL"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "RETURN"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IMPLICIT"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "EXPLICIT"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "NONE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DATA"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "PARAMETER"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ALLOCATE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ALLOCATABLE"			{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ALLOCATED"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DEALLOCATE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "INTEGER"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "REAL"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DOUBLE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "PRECISION"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "COMPLEX"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LOGICAL"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CHARACTER"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DIMENSION"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "KIND"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CASE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SELECT"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DEFAULT"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CONTINUE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CYCLE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DO"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "WHILE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ELSE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IF"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ELSEIF"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "THEN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ELSEWHERE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "END"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ENDIF"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ENDDO"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FORALL"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "WHERE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "EXIT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "GOTO"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "PAUSE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "STOP"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "BACKSPACE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CLOSE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ENDFILE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "INQUIRE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "OPEN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "PRINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "READ"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "REWIND"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "WRITE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FORMAT"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AIMAG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMAX0"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMIN0"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ANINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CEILING"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CMPLX"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CONJG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DBLE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DCMPLX"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DFLOAT"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DIM"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DPROD"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FLOAT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FLOOR"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IFIX"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IMAG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "INT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LOGICAL"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MODULO"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "NINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "REAL"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SIGN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SNGL"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "TRANSFER"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ZEXT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ABS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ACOS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AIMAG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ALOG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ALOG10"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMAX0"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMAX1"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMIN0"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMIN1"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMOD"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ANINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ASIN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ATAN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ATAN2"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CABS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CCOS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CHAR"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CLOG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CMPLX"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CONJG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "COS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "COSH"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CSIN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CSQRT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DABS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DACOS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DASIN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DATAN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DATAN2"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DBLE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DCOS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DCOSH"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DDIM"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DEXP"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DIM"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DLOG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DLOG10"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DMAX1"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DMIN1"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DMOD"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DNINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DPROD"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DREAL"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DSIGN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DSIN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DSINH"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DSQRT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DTAN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DTANH"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "EXP"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FLOAT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IABS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ICHAR"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IDIM"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IDINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IDNINT"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IFIX"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "INDEX"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "INT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ISIGN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LEN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LGE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LGT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LLE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LLT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LOG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LOG10"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MAX"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MAX0"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MAX1"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MIN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MIN0"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MIN1"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MOD"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "NINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "REAL"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SIGN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SIN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SINH"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SNGL"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SQRT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "TAN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "TANH"					{ addToken(Token.RESERVED_WORD); }
+
+<YYINITIAL> {
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character Literals. */
+	{CharDelimiter}				{ start = zzMarkedPos-1; yybegin(CHAR); }
+	{StringDelimiter}				{ start = zzMarkedPos-1; yybegin(STRING); }
+
+	/* Comment Literals. */
+	/* Note that we cannot combine these as JFLex doesn't like combining an */
+	/* expression containing the beginning-of-line character '^'. */
+	{Column1CommentBegin}	{
+							// Since we change zzStartRead, we have the unfortunate
+							// side-effect of not being able to use the '^' operator.
+							// So we must check whether we're really at the beginning
+							// of the line ourselves...
+							if (zzStartRead==s.offset) {
+								addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL);
+								addNullToken();
+								return firstToken;
+							}
+							else {
+								addToken(Token.IDENTIFIER);
+							}
+						}
+	{Column1Comment2Begin}	{
+							// Since we change zzStartRead, we have the unfortunate
+							// side-effect of not being able to use the '^' operator.
+							// So we must check whether we're really at the beginning
+							// of the line ourselves...
+							if (zzStartRead==s.offset) {
+								addToken(zzStartRead,zzEndRead, Token.COMMENT_DOCUMENTATION);
+								addNullToken();
+								return firstToken;
+							}
+							else {
+								addToken(Token.IDENTIFIER);
+							}
+						}
+	{AnywhereCommentBegin}	{ addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Boolean literals. */
+	{Boolean}						{ addToken(Token.LITERAL_BOOLEAN); }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	/* Ended with a line not in a string or char literal. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+<CHAR> {
+	[^\'\n]*						{}
+	\'							{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+	\n							{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+}
+
+<STRING> {
+	[^\"\n]*						{}
+	\"							{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	\n							{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.java
new file mode 100644
index 0000000..01fa97c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.java
@@ -0,0 +1,1011 @@
+/* The following code was generated by JFlex 1.4.1 on 10/16/06 10:31 AM */
+
+/*
+ * 03/23/2005
+ *
+ * FortranTokenMaker.java - Scanner for the Fortran programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Fortran programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated FortranTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+
+public class FortranTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int STRING = 1;
+  public static final int YYINITIAL = 0;
+  public static final int CHAR = 2;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\2\1\1\1\0\1\2\23\0\1\2\1\5\1\10\1\0"+
+    "\1\6\1\0\1\14\1\11\2\0\1\3\3\0\1\16\1\15\1\45"+
+    "\1\50\1\51\7\6\2\0\1\12\1\13\1\12\2\0\1\25\1\37"+
+    "\1\7\1\4\1\22\1\31\1\21\1\41\1\33\1\46\1\42\1\17"+
+    "\1\36\1\24\1\26\1\35\1\23\1\27\1\32\1\20\1\30\1\6"+
+    "\1\44\1\40\1\43\1\47\4\0\1\6\1\0\1\25\1\37\1\34"+
+    "\1\4\1\22\1\31\1\21\1\41\1\33\1\46\1\42\1\17\1\36"+
+    "\1\24\1\26\1\35\1\23\1\27\1\32\1\20\1\30\1\6\1\44"+
+    "\1\40\1\43\1\47\uff85\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 =
+    "\1\0\2\1\1\2\1\3\1\4\1\5\1\6\1\7"+
+    "\1\2\1\5\1\10\1\11\1\12\1\2\1\12\24\2"+
+    "\1\1\1\13\1\14\1\1\1\15\1\16\7\2\1\17"+
+    "\20\2\7\0\41\2\1\17\27\2\1\17\10\2\1\17"+
+    "\3\2\4\0\2\17\3\2\2\17\20\2\1\17\10\2"+
+    "\2\17\3\2\1\17\2\2\1\17\6\2\1\17\2\0"+
+    "\3\2\1\17\4\2\1\17\26\2\1\0\20\2\1\20"+
+    "\12\2\1\17";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[257];
+    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\52\0\124\0\176\0\176\0\250\0\176\0\322"+
+    "\0\176\0\374\0\u0126\0\176\0\176\0\u0150\0\u0150\0\176"+
+    "\0\u017a\0\u01a4\0\u01ce\0\u01f8\0\u0222\0\u024c\0\u0276\0\u02a0"+
+    "\0\u02ca\0\u02f4\0\u031e\0\u0348\0\u0372\0\u0126\0\u039c\0\u03c6"+
+    "\0\u03f0\0\u041a\0\u0444\0\u046e\0\u0498\0\176\0\176\0\u04c2"+
+    "\0\176\0\176\0\u04ec\0\u0516\0\u0540\0\u056a\0\u0594\0\u05be"+
+    "\0\u05e8\0\u0612\0\u063c\0\u0666\0\u0690\0\u06ba\0\u06e4\0\u070e"+
+    "\0\u0738\0\u0762\0\u078c\0\u07b6\0\u07e0\0\u080a\0\u0834\0\u085e"+
+    "\0\u0888\0\u08b2\0\u08dc\0\u0906\0\u0930\0\u095a\0\u0984\0\u09ae"+
+    "\0\u09d8\0\u0a02\0\u0a2c\0\u0a56\0\u0a80\0\u0aaa\0\u0ad4\0\u0afe"+
+    "\0\u0b28\0\u0b52\0\u0b7c\0\u0ba6\0\u0bd0\0\u0bfa\0\u0c24\0\u0c4e"+
+    "\0\u0c78\0\u0ca2\0\u0ccc\0\u0cf6\0\u0d20\0\u0d4a\0\u0d74\0\u0d9e"+
+    "\0\u0dc8\0\u0df2\0\u0e1c\0\u0e46\0\u0e70\0\u0e9a\0\u0ec4\0\u0eee"+
+    "\0\u0f18\0\u0f42\0\u0f6c\0\u0f96\0\u0fc0\0\u0fea\0\u1014\0\u103e"+
+    "\0\u1068\0\u1092\0\u10bc\0\u10e6\0\u1110\0\u113a\0\u1164\0\u118e"+
+    "\0\u11b8\0\u11e2\0\u120c\0\u1236\0\u1260\0\u128a\0\u12b4\0\u12de"+
+    "\0\u1308\0\u1332\0\u135c\0\u1386\0\u13b0\0\u13da\0\u1404\0\u142e"+
+    "\0\u1458\0\u1482\0\u14ac\0\u14d6\0\u1500\0\u152a\0\u1554\0\u157e"+
+    "\0\u15a8\0\u15d2\0\u15fc\0\374\0\u1626\0\u1650\0\u167a\0\u16a4"+
+    "\0\u16ce\0\u16f8\0\u1722\0\u174c\0\u1776\0\u17a0\0\u17ca\0\u17f4"+
+    "\0\u181e\0\u1848\0\u1872\0\u189c\0\u18c6\0\u18f0\0\u191a\0\u1944"+
+    "\0\u196e\0\u1998\0\u19c2\0\u19ec\0\u1a16\0\u1a40\0\u1a6a\0\u16f8"+
+    "\0\u1a94\0\u1abe\0\u1ae8\0\u1b12\0\u1b3c\0\u1b66\0\u1b90\0\u1bba"+
+    "\0\u1be4\0\u1c0e\0\u1c38\0\u174c\0\u1c62\0\u1c8c\0\u1cb6\0\u1ce0"+
+    "\0\u1d0a\0\u1d34\0\u1d5e\0\u1d88\0\u1db2\0\u1ddc\0\u1e06\0\u1e30"+
+    "\0\u1e5a\0\u1e84\0\u1eae\0\u1ed8\0\u1f02\0\u1f2c\0\u1b12\0\u1f56"+
+    "\0\u1f80\0\u1faa\0\u1fd4\0\u1ffe\0\u2028\0\u2052\0\u207c\0\u20a6"+
+    "\0\u20d0\0\u20fa\0\u2124\0\u214e\0\u2178\0\u21a2\0\u21cc\0\u21f6"+
+    "\0\u2220\0\u224a\0\u2274\0\u229e\0\u22c8\0\u22f2\0\u231c\0\u2346"+
+    "\0\u2370\0\u239a\0\u23c4\0\u23ee\0\u2418\0\u2442\0\u246c\0\u2496"+
+    "\0\u24c0\0\u24ea\0\u2514\0\u253e\0\u2568\0\176\0\u2592\0\u25bc"+
+    "\0\u25e6\0\u2610\0\u263a\0\u2664\0\u268e\0\u26b8\0\u26e2\0\u270c"+
+    "\0\u13da";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[257];
+    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\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13"+
+    "\1\14\1\15\1\16\1\17\1\20\1\17\1\21\1\22"+
+    "\1\23\1\24\1\25\1\12\1\26\1\27\1\30\1\31"+
+    "\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41"+
+    "\2\12\1\42\1\12\1\43\2\12\1\44\2\12\1\45"+
+    "\1\46\6\45\1\47\41\45\1\50\1\51\7\50\1\52"+
+    "\40\50\54\0\1\6\53\0\1\53\1\0\1\12\1\54"+
+    "\7\0\1\55\1\56\1\12\1\57\1\12\1\60\1\61"+
+    "\1\62\1\63\1\12\1\64\1\65\1\66\1\54\1\67"+
+    "\1\70\1\71\12\12\4\0\1\12\1\0\2\12\7\0"+
+    "\33\12\4\0\1\12\1\0\1\12\1\72\7\0\1\73"+
+    "\2\12\1\74\2\12\1\75\1\76\3\12\1\77\1\12"+
+    "\1\72\1\12\1\100\2\12\1\101\1\12\1\102\6\12"+
+    "\13\0\1\20\55\0\1\103\1\104\1\103\1\105\1\0"+
+    "\1\106\1\107\1\110\2\0\1\111\24\0\1\12\1\0"+
+    "\2\12\7\0\1\112\1\12\1\112\1\113\3\12\1\114"+
+    "\23\12\4\0\1\12\1\0\2\12\7\0\6\12\1\115"+
+    "\1\12\1\116\11\12\1\117\10\12\4\0\1\12\1\0"+
+    "\2\12\7\0\7\12\1\120\23\12\4\0\1\12\1\0"+
+    "\2\12\7\0\1\121\4\12\1\122\13\12\1\123\11\12"+
+    "\4\0\1\12\1\0\2\12\7\0\7\12\1\124\4\12"+
+    "\1\125\16\12\4\0\1\12\1\0\1\12\1\72\7\0"+
+    "\1\126\1\127\3\12\1\60\5\12\1\130\1\131\1\72"+
+    "\1\12\1\132\1\133\12\12\4\0\1\12\1\0\2\12"+
+    "\7\0\16\12\1\117\14\12\4\0\1\12\1\0\2\12"+
+    "\7\0\3\12\1\134\27\12\4\0\1\12\1\0\2\12"+
+    "\7\0\13\12\1\135\17\12\4\0\1\12\1\0\2\12"+
+    "\7\0\1\136\6\12\1\137\1\12\1\140\21\12\4\0"+
+    "\1\12\1\0\2\12\7\0\1\12\1\141\1\12\1\142"+
+    "\1\143\1\144\3\12\1\145\2\12\1\146\16\12\4\0"+
+    "\1\147\1\0\1\12\1\150\7\0\5\12\1\151\1\152"+
+    "\3\12\1\153\1\154\1\12\1\150\1\12\1\155\13\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\156\1\12"+
+    "\1\157\22\12\4\0\1\12\1\0\2\12\7\0\6\12"+
+    "\1\160\1\161\4\12\1\162\16\12\4\0\1\12\1\0"+
+    "\2\12\7\0\6\12\1\163\24\12\4\0\1\12\1\0"+
+    "\2\12\7\0\14\12\1\164\16\12\4\0\1\12\1\0"+
+    "\2\12\7\0\10\12\1\165\11\12\1\166\10\12\4\0"+
+    "\1\12\1\0\2\12\7\0\3\12\1\167\27\12\1\45"+
+    "\1\0\6\45\1\0\41\45\1\50\1\0\7\50\1\0"+
+    "\40\50\4\0\1\12\1\0\2\12\7\0\14\12\1\170"+
+    "\16\12\4\0\1\12\1\0\2\12\7\0\7\12\1\171"+
+    "\7\12\1\100\13\12\4\0\1\12\1\0\2\12\7\0"+
+    "\7\12\1\172\23\12\4\0\1\12\1\0\2\12\7\0"+
+    "\6\12\1\115\24\12\4\0\1\12\1\0\2\12\7\0"+
+    "\6\12\1\173\3\12\1\174\6\12\1\175\11\12\4\0"+
+    "\1\12\1\0\2\12\7\0\14\12\1\125\16\12\4\0"+
+    "\1\12\1\0\1\12\1\72\7\0\1\12\1\176\11\12"+
+    "\1\130\1\12\1\72\2\12\1\133\12\12\4\0\1\12"+
+    "\1\0\2\12\7\0\11\12\1\177\21\12\4\0\1\12"+
+    "\1\0\2\12\7\0\3\12\1\200\27\12\4\0\1\12"+
+    "\1\0\2\12\7\0\1\201\32\12\4\0\1\12\1\0"+
+    "\2\12\7\0\4\12\1\143\7\12\1\146\16\12\4\0"+
+    "\1\12\1\0\2\12\7\0\5\12\1\202\11\12\1\203"+
+    "\13\12\4\0\1\12\1\0\2\12\7\0\10\12\1\204"+
+    "\22\12\4\0\1\12\1\0\2\12\7\0\6\12\1\205"+
+    "\1\206\4\12\1\207\16\12\4\0\1\12\1\0\2\12"+
+    "\7\0\1\135\32\12\4\0\1\12\1\0\2\12\7\0"+
+    "\7\12\1\133\23\12\4\0\1\12\1\0\2\12\7\0"+
+    "\7\12\1\210\23\12\4\0\1\12\1\0\2\12\7\0"+
+    "\14\12\1\211\16\12\4\0\1\12\1\0\2\12\7\0"+
+    "\1\212\12\12\1\135\4\12\1\133\12\12\4\0\1\12"+
+    "\1\0\2\12\7\0\5\12\1\213\5\12\1\214\3\12"+
+    "\1\215\13\12\4\0\1\12\1\0\2\12\7\0\4\12"+
+    "\1\143\7\12\1\113\16\12\4\0\1\12\1\0\2\12"+
+    "\7\0\16\12\1\216\14\12\4\0\1\12\1\0\2\12"+
+    "\7\0\6\12\1\217\24\12\4\0\1\12\1\0\1\12"+
+    "\1\71\7\0\15\12\1\71\15\12\20\0\1\220\1\0"+
+    "\1\220\56\0\1\221\45\0\1\220\50\0\1\220\53\0"+
+    "\1\222\54\0\1\220\47\0\1\223\30\0\1\12\1\0"+
+    "\2\12\7\0\1\12\1\224\1\12\1\224\27\12\4\0"+
+    "\1\12\1\0\2\12\7\0\5\12\1\224\25\12\4\0"+
+    "\1\12\1\0\2\12\7\0\2\12\1\225\30\12\4\0"+
+    "\1\12\1\0\2\12\7\0\5\12\1\214\25\12\4\0"+
+    "\1\12\1\0\2\12\7\0\6\12\1\226\24\12\4\0"+
+    "\1\12\1\0\2\12\7\0\3\12\1\113\27\12\4\0"+
+    "\1\12\1\0\2\12\7\0\1\12\1\227\31\12\4\0"+
+    "\1\12\1\0\2\12\7\0\13\12\1\230\17\12\4\0"+
+    "\1\231\1\0\2\12\7\0\33\12\4\0\1\12\1\0"+
+    "\2\12\7\0\14\12\1\202\1\12\1\232\14\12\4\0"+
+    "\1\12\1\0\2\12\7\0\5\12\1\135\25\12\4\0"+
+    "\1\12\1\0\2\12\7\0\5\12\1\202\25\12\4\0"+
+    "\1\12\1\0\2\12\7\0\1\233\6\12\1\172\23\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\234\24\12"+
+    "\4\0\1\12\1\0\2\12\7\0\14\12\1\113\16\12"+
+    "\4\0\1\12\1\0\2\12\7\0\5\12\1\202\11\12"+
+    "\1\235\13\12\4\0\1\12\1\0\2\12\7\0\6\12"+
+    "\1\236\1\206\4\12\1\237\16\12\4\0\1\12\1\0"+
+    "\2\12\7\0\13\12\1\224\17\12\4\0\1\12\1\0"+
+    "\2\12\7\0\1\12\1\240\4\12\1\241\16\12\1\42"+
+    "\5\12\4\0\1\12\1\0\2\12\7\0\3\12\1\224"+
+    "\27\12\4\0\1\12\1\0\2\12\7\0\7\12\1\242"+
+    "\23\12\4\0\1\12\1\0\2\12\7\0\10\12\1\243"+
+    "\22\12\4\0\1\12\1\0\2\12\7\0\5\12\1\244"+
+    "\25\12\4\0\1\12\1\0\2\12\7\0\7\12\1\175"+
+    "\23\12\4\0\1\12\1\0\2\12\7\0\1\245\32\12"+
+    "\4\0\1\12\1\0\2\12\7\0\10\12\1\202\22\12"+
+    "\4\0\1\12\1\0\2\12\7\0\2\12\1\212\30\12"+
+    "\4\0\1\12\1\0\2\12\7\0\20\12\1\246\12\12"+
+    "\4\0\1\12\1\0\2\12\7\0\2\12\1\113\2\12"+
+    "\1\214\25\12\4\0\1\12\1\0\2\12\7\0\5\12"+
+    "\1\60\6\12\1\247\16\12\4\0\1\12\1\0\2\12"+
+    "\7\0\22\12\1\250\10\12\4\0\1\251\1\0\1\12"+
+    "\1\252\7\0\1\12\1\253\2\12\1\254\10\12\1\252"+
+    "\15\12\4\0\1\12\1\0\2\12\7\0\20\12\1\133"+
+    "\12\12\4\0\1\12\1\0\2\12\7\0\14\12\1\255"+
+    "\16\12\4\0\1\12\1\0\2\12\7\0\14\12\1\256"+
+    "\16\12\4\0\1\12\1\0\2\12\7\0\6\12\1\257"+
+    "\7\12\1\260\14\12\4\0\1\12\1\0\2\12\7\0"+
+    "\10\12\1\261\1\32\21\12\4\0\1\12\1\0\2\12"+
+    "\7\0\3\12\1\262\3\12\1\263\4\12\1\125\16\12"+
+    "\4\0\1\12\1\0\2\12\7\0\21\12\1\264\11\12"+
+    "\4\0\1\265\1\0\2\12\7\0\33\12\4\0\1\12"+
+    "\1\0\2\12\7\0\5\12\1\264\25\12\4\0\1\12"+
+    "\1\0\1\12\1\266\7\0\15\12\1\266\15\12\4\0"+
+    "\1\12\1\0\2\12\7\0\5\12\1\206\25\12\4\0"+
+    "\1\12\1\0\2\12\7\0\14\12\1\267\16\12\4\0"+
+    "\1\12\1\0\2\12\7\0\3\12\1\270\10\12\1\71"+
+    "\16\12\4\0\1\12\1\0\2\12\7\0\21\12\1\202"+
+    "\11\12\4\0\1\12\1\0\2\12\7\0\17\12\1\224"+
+    "\13\12\4\0\1\12\1\0\2\12\7\0\13\12\1\214"+
+    "\17\12\4\0\1\12\1\0\2\12\7\0\2\12\1\271"+
+    "\30\12\4\0\1\12\1\0\2\12\7\0\1\272\32\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\273\24\12"+
+    "\4\0\1\12\1\0\2\12\7\0\16\12\1\224\14\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\274\24\12"+
+    "\4\0\1\12\1\0\2\12\7\0\20\12\1\71\12\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\212\24\12"+
+    "\4\0\1\12\1\0\2\12\7\0\7\12\1\275\23\12"+
+    "\4\0\1\12\1\0\2\12\7\0\1\12\1\224\31\12"+
+    "\4\0\1\12\1\0\2\12\7\0\3\12\1\276\27\12"+
+    "\4\0\1\12\1\0\2\12\7\0\7\12\1\206\23\12"+
+    "\4\0\1\12\1\0\2\12\7\0\21\12\1\277\11\12"+
+    "\4\0\1\224\1\0\2\12\7\0\33\12\4\0\1\12"+
+    "\1\0\2\12\7\0\5\12\1\277\25\12\4\0\1\12"+
+    "\1\0\2\12\7\0\2\12\1\224\10\12\1\135\17\12"+
+    "\4\0\1\12\1\0\2\12\7\0\1\300\32\12\4\0"+
+    "\1\12\1\0\2\12\7\0\1\224\32\12\4\0\1\12"+
+    "\1\0\2\12\7\0\1\12\1\301\25\12\1\257\3\12"+
+    "\4\0\1\12\1\0\2\12\7\0\22\12\1\224\10\12"+
+    "\4\0\1\12\1\0\2\12\7\0\16\12\1\302\14\12"+
+    "\4\0\1\12\1\0\2\12\7\0\1\255\32\12\4\0"+
+    "\1\12\1\0\2\12\7\0\10\12\1\303\22\12\16\0"+
+    "\1\20\63\0\1\304\25\0\1\220\64\0\1\305\36\0"+
+    "\1\12\1\0\2\12\7\0\14\12\1\306\14\12\1\307"+
+    "\1\12\4\0\1\12\1\0\2\12\7\0\5\12\1\310"+
+    "\25\12\4\0\1\12\1\0\2\12\7\0\7\12\1\224"+
+    "\23\12\4\0\1\12\1\0\2\12\7\0\3\12\1\311"+
+    "\27\12\4\0\1\227\1\0\2\12\7\0\12\12\1\312"+
+    "\1\12\1\313\16\12\4\0\1\12\1\0\2\12\7\0"+
+    "\1\314\32\12\4\0\1\12\1\0\2\12\7\0\7\12"+
+    "\1\315\23\12\4\0\1\12\1\0\2\12\7\0\5\12"+
+    "\1\316\25\12\4\0\1\12\1\0\2\12\7\0\6\12"+
+    "\1\257\24\12\4\0\1\12\1\0\2\12\7\0\21\12"+
+    "\1\317\11\12\4\0\1\12\1\0\2\12\7\0\5\12"+
+    "\1\317\25\12\4\0\1\12\1\0\2\12\7\0\11\12"+
+    "\1\320\21\12\4\0\1\224\1\0\2\12\7\0\1\224"+
+    "\32\12\4\0\1\12\1\0\2\12\7\0\6\12\1\202"+
+    "\1\321\23\12\4\0\1\12\1\0\2\12\7\0\6\12"+
+    "\1\322\10\12\1\275\13\12\4\0\1\12\1\0\1\12"+
+    "\1\323\7\0\15\12\1\323\15\12\4\0\1\12\1\0"+
+    "\2\12\7\0\3\12\1\324\27\12\4\0\1\12\1\0"+
+    "\2\12\7\0\10\12\1\325\22\12\4\0\1\12\1\0"+
+    "\2\12\7\0\5\12\1\202\11\12\1\224\13\12\4\0"+
+    "\1\12\1\0\2\12\7\0\6\12\1\321\24\12\4\0"+
+    "\1\12\1\0\2\12\7\0\3\12\1\255\27\12\4\0"+
+    "\1\12\1\0\2\12\7\0\1\326\32\12\4\0\1\12"+
+    "\1\0\2\12\7\0\3\12\1\327\27\12\4\0\1\12"+
+    "\1\0\2\12\7\0\11\12\1\330\21\12\4\0\1\12"+
+    "\1\0\2\12\7\0\21\12\1\224\11\12\4\0\1\12"+
+    "\1\0\2\12\7\0\2\12\1\113\30\12\4\0\1\12"+
+    "\1\0\2\12\7\0\2\12\1\224\30\12\4\0\1\12"+
+    "\1\0\2\12\7\0\6\12\1\331\24\12\4\0\1\12"+
+    "\1\0\1\12\1\332\7\0\15\12\1\332\15\12\4\0"+
+    "\1\12\1\0\2\12\7\0\2\12\1\333\30\12\4\0"+
+    "\1\12\1\0\2\12\7\0\26\12\1\224\2\12\1\224"+
+    "\1\12\4\0\1\12\1\0\2\12\7\0\11\12\1\334"+
+    "\21\12\4\0\1\12\1\0\2\12\7\0\23\12\1\335"+
+    "\7\12\4\0\1\12\1\0\2\12\7\0\1\12\1\135"+
+    "\31\12\4\0\1\12\1\0\2\12\7\0\10\12\1\135"+
+    "\22\12\4\0\1\12\1\0\2\12\7\0\31\12\1\307"+
+    "\1\12\4\0\1\12\1\0\2\12\7\0\1\336\32\12"+
+    "\4\0\1\12\1\0\2\12\7\0\11\12\1\337\21\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\202\24\12"+
+    "\4\0\1\12\1\0\2\12\7\0\5\12\1\340\25\12"+
+    "\4\0\1\12\1\0\2\12\7\0\31\12\1\224\1\12"+
+    "\4\0\1\12\1\0\2\12\7\0\14\12\1\341\16\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\342\5\12"+
+    "\1\343\16\12\4\0\1\12\1\0\2\12\7\0\1\251"+
+    "\32\12\4\0\1\12\1\0\2\12\7\0\6\12\1\344"+
+    "\24\12\22\0\1\345\61\0\1\304\23\0\1\12\1\0"+
+    "\1\12\1\200\7\0\15\12\1\200\15\12\4\0\1\12"+
+    "\1\0\2\12\7\0\26\12\1\224\4\12\4\0\1\12"+
+    "\1\0\2\12\7\0\13\12\1\346\17\12\4\0\1\12"+
+    "\1\0\2\12\7\0\14\12\1\313\10\12\1\347\5\12"+
+    "\4\0\1\12\1\0\2\12\7\0\14\12\1\71\16\12"+
+    "\4\0\1\12\1\0\2\12\7\0\12\12\1\224\20\12"+
+    "\4\0\1\12\1\0\2\12\7\0\14\12\1\350\16\12"+
+    "\4\0\1\12\1\0\1\12\1\351\7\0\15\12\1\351"+
+    "\15\12\4\0\1\12\1\0\2\12\7\0\32\12\1\224"+
+    "\4\0\1\12\1\0\2\12\7\0\10\12\1\113\22\12"+
+    "\4\0\1\12\1\0\2\12\7\0\10\12\1\224\22\12"+
+    "\4\0\1\12\1\0\2\12\7\0\1\212\32\12\4\0"+
+    "\1\12\1\0\2\12\7\0\1\12\1\352\31\12\4\0"+
+    "\1\12\1\0\1\12\1\202\7\0\15\12\1\202\15\12"+
+    "\4\0\1\12\1\0\2\12\7\0\7\12\1\353\23\12"+
+    "\4\0\1\12\1\0\2\12\7\0\11\12\1\354\21\12"+
+    "\4\0\1\12\1\0\2\12\7\0\2\12\1\355\30\12"+
+    "\4\0\1\12\1\0\2\12\7\0\14\12\1\270\16\12"+
+    "\4\0\1\12\1\0\2\12\7\0\17\12\1\356\13\12"+
+    "\4\0\1\12\1\0\2\12\7\0\14\12\1\340\16\12"+
+    "\4\0\1\12\1\0\2\12\7\0\10\12\1\357\22\12"+
+    "\4\0\1\12\1\0\2\12\7\0\1\360\32\12\4\0"+
+    "\1\12\1\0\2\12\7\0\13\12\1\361\17\12\4\0"+
+    "\1\12\1\0\2\12\7\0\7\12\1\362\23\12\4\0"+
+    "\1\12\1\0\2\12\7\0\1\202\32\12\4\0\1\12"+
+    "\1\0\2\12\7\0\13\12\1\352\17\12\4\0\1\12"+
+    "\1\0\2\12\7\0\5\12\1\257\25\12\4\0\1\12"+
+    "\1\0\2\12\7\0\14\12\1\363\16\12\4\0\1\12"+
+    "\1\0\2\12\7\0\5\12\1\364\25\12\4\0\1\12"+
+    "\1\0\1\12\1\365\7\0\15\12\1\365\15\12\16\0"+
+    "\1\366\37\0\1\12\1\0\2\12\7\0\12\12\1\355"+
+    "\20\12\4\0\1\12\1\0\2\12\7\0\22\12\1\367"+
+    "\10\12\4\0\1\12\1\0\1\12\1\370\7\0\15\12"+
+    "\1\370\15\12\4\0\1\12\1\0\2\12\7\0\6\12"+
+    "\1\371\24\12\4\0\1\12\1\0\2\12\7\0\14\12"+
+    "\1\372\16\12\4\0\1\12\1\0\2\12\7\0\11\12"+
+    "\1\373\21\12\4\0\1\135\1\0\2\12\7\0\33\12"+
+    "\4\0\1\12\1\0\2\12\7\0\3\12\1\321\27\12"+
+    "\4\0\1\12\1\0\2\12\7\0\3\12\1\365\27\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\170\24\12"+
+    "\4\0\1\12\1\0\2\12\7\0\3\12\1\224\3\12"+
+    "\1\224\23\12\4\0\1\12\1\0\2\12\7\0\16\12"+
+    "\1\374\14\12\4\0\1\12\1\0\1\12\1\375\7\0"+
+    "\15\12\1\375\15\12\4\0\1\12\1\0\2\12\7\0"+
+    "\5\12\1\133\25\12\4\0\1\12\1\0\2\12\7\0"+
+    "\11\12\1\135\21\12\4\0\1\12\1\0\2\12\7\0"+
+    "\1\12\1\355\31\12\4\0\1\12\1\0\2\12\7\0"+
+    "\3\12\1\270\27\12\4\0\1\12\1\0\2\12\7\0"+
+    "\14\12\1\202\16\12\4\0\1\12\1\0\2\12\7\0"+
+    "\1\12\1\376\31\12\4\0\1\12\1\0\2\12\7\0"+
+    "\7\12\1\113\23\12\4\0\1\12\1\0\2\12\7\0"+
+    "\1\12\1\377\31\12\4\0\1\12\1\0\2\12\7\0"+
+    "\6\12\1\u0100\24\12\4\0\1\12\1\0\2\12\7\0"+
+    "\6\12\1\267\24\12\4\0\1\12\1\0\2\12\7\0"+
+    "\3\12\1\u0101\2\12\1\177\24\12\4\0\1\12\1\0"+
+    "\2\12\7\0\14\12\1\124\16\12\4\0\1\12\1\0"+
+    "\1\12\1\135\7\0\15\12\1\135\15\12";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[10038];
+    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 =
+    "\1\0\2\1\2\11\1\1\1\11\1\1\1\11\2\1"+
+    "\2\11\2\1\1\11\25\1\2\11\1\1\2\11\30\1"+
+    "\7\0\106\1\4\0\60\1\2\0\37\1\1\0\20\1"+
+    "\1\11\13\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[257];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  We must have this here as there is no default,
+	 * no-parameter constructor generated by JFlex.
+	 */
+	public FortranTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+		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 FortranTokenMaker(java.io.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 FortranTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 168) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 15: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 17: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 18: break;
+        case 4: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 19: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 20: break;
+        case 13: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+          }
+        case 21: break;
+        case 10: 
+          { addToken(Token.OPERATOR);
+          }
+        case 22: break;
+        case 5: 
+          { // Since we change zzStartRead, we have the unfortunate
+							// side-effect of not being able to use the '^' operator.
+							// So we must check whether we're really at the beginning
+							// of the line ourselves...
+							if (zzStartRead==s.offset) {
+								addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL);
+								addNullToken();
+								return firstToken;
+							}
+							else {
+								addToken(Token.IDENTIFIER);
+							}
+          }
+        case 23: break;
+        case 16: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 24: break;
+        case 8: 
+          { start = zzMarkedPos-1; yybegin(STRING);
+          }
+        case 25: break;
+        case 7: 
+          { addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 26: break;
+        case 6: 
+          { // Since we change zzStartRead, we have the unfortunate
+							// side-effect of not being able to use the '^' operator.
+							// So we must check whether we're really at the beginning
+							// of the line ourselves...
+							if (zzStartRead==s.offset) {
+								addToken(zzStartRead,zzEndRead, Token.COMMENT_DOCUMENTATION);
+								addNullToken();
+								return firstToken;
+							}
+							else {
+								addToken(Token.IDENTIFIER);
+							}
+          }
+        case 27: break;
+        case 9: 
+          { start = zzMarkedPos-1; yybegin(CHAR);
+          }
+        case 28: break;
+        case 14: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+          }
+        case 29: break;
+        case 12: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 30: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 31: break;
+        case 1: 
+          { 
+          }
+        case 32: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 258: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 259: break;
+            case CHAR: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+            }
+            case 260: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.flex
new file mode 100644
index 0000000..dfb7cfc
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.flex
@@ -0,0 +1,888 @@
+/*
+ * 09/28/2007
+ *
+ * GroovyTokenMaker.java - Scanner for the Groovy programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Groovy programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated GroovyTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class GroovyTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public GroovyTokenMaker() {
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = MULTILINE_STRING_DOUBLE;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = MULTILINE_STRING_SINGLE;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Returns whether a regular expression token can follow the specified
+	 * token.
+	 *
+	 * @param t The token to check, which may be <code>null</code>.
+	 * @return Whether a regular expression token may follow this one.
+	 */
+	private static final boolean regexCanFollow(Token t) {
+		char ch;
+		return t==null ||
+				//t.isOperator() ||
+				(t.textCount==1 && (
+					(ch=t.text[t.textOffset])=='=' ||
+					ch=='(' ||
+					ch==',' ||
+					ch=='?' ||
+					ch==':' ||
+					ch=='['
+				)) ||
+				/* Operators "==", "===", "!=", "!==", etc. */
+				(t.type==Token.OPERATOR &&
+					((ch=t.text[t.textOffset+t.textCount-1])=='=' || ch=='~'));
+	}
+
+
+	/**
+	 * 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(java.io.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]
+BinaryDigit						= ([0-1])
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+AnyCharacterButApostropheOrBackSlash	= ([^\\'])
+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}[\'])
+
+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")
+Regex						= ([~]?"/"([^\*\\/]|\\.)([^/\\]|\\.)*"/")
+
+Separator					= ([\(\)\{\}\[\]])
+Separator2				= ([\;,.])
+
+NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator			= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+GroovyOperator				= ("=~")
+Operator					= ({NonAssignmentOperator}|{AssignmentOperator}|{GroovyOperator})
+
+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}+)
+
+// Variables in strings
+VariableStart				= ([\$])
+BracedVariable				= ({VariableStart}\{[^\}]+\})
+UnbracedVariable			= ({VariableStart}{Identifier})
+Variable					= ({BracedVariable}|{UnbracedVariable})
+
+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 MULTILINE_STRING_DOUBLE
+%state MULTILINE_STRING_SINGLE
+%state STRING_DOUBLE
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"abstract" |
+	"break" |
+	"case" |
+	"catch" |
+	"class" |
+	"continue" |
+	"default" |
+	"do" |
+	"else" |
+	"enum" |
+	"extends" |
+	"final" |
+	"finally" |
+	"for" |
+	"if" |
+	"it" |
+	"implements" |
+	"import" |
+	"instanceof" |
+	"interface" |
+	"native" |
+	"new" |
+	"null" |
+	"package" |
+	"private" |
+	"protected" |
+	"public" |
+	"static" |
+	"strictfp" |
+	"super" |
+	"switch" |
+	"synchronized" |
+	"this" |
+	"throw" |
+	"throws" |
+	"transient" |
+	"try" |
+	"void" |
+	"volatile" |
+	"while"				{ addToken(Token.RESERVED_WORD); }
+	"return"			{ addToken(Token.RESERVED_WORD_2); }
+
+	/* Groovy keywords */
+	"as" |
+	"assert" |
+	"def" |
+	"mixin" |
+	"property" |
+	"test" |
+	"using" |
+	"in"				{ addToken(Token.RESERVED_WORD); }
+
+	/* Data types. */
+	"boolean" |
+	"byte" |
+	"char" |
+	"double" |
+	"float" |
+	"int" |
+	"long" |
+	"short"					{ addToken(Token.DATA_TYPE); }
+
+	/* Booleans. */
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+	/* java.lang classes */
+	"Appendable" |
+	"AutoCloseable" |
+	"CharSequence" |
+	"Cloneable" |
+	"Comparable" |
+	"Iterable" |
+	"Readable" |
+	"Runnable" |
+	"Thread.UncaughtExceptionHandler" |
+	"Boolean" |
+	"Byte" |
+	"Character" |
+	"Character.Subset" | 
+	"Character.UnicodeBlock" | 
+	"Class" |
+	"ClassLoader" |
+	"Compiler" |
+	"Double" |
+	"Enum" |
+	"Float" |
+	"InheritableThreadLocal" |
+	"Integer" |
+	"Long" |
+	"Math" |
+	"Number" |
+	"Object" |
+	"Package" |
+	"Process" |
+	"ProcessBuilder" |
+	"ProcessBuilder.Redirect" |
+	"Runtime" |
+	"RuntimePermission" |
+	"SecurityManager" |
+	"Short" |
+	"StackTraceElement" |
+	"StrictMath" |
+	"String" |
+	"StringBuffer" |
+	"StringBuilder" |
+	"System" |
+	"Thread" |
+	"ThreadGroup" |
+	"ThreadLocal" |
+	"Throwable" |
+	"Void" |
+	"Character.UnicodeScript" |
+	"ProcessBuilder.Redirect.Type" |
+	"Thread.State" |
+	"ArithmeticException" |
+	"ArrayIndexOutOfBoundsException" |
+	"ArrayStoreException" |
+	"ClassCastException" |
+	"ClassNotFoundException" |
+	"CloneNotSupportedException" |
+	"EnumConstantNotPresentException" |
+	"Exception" |
+	"IllegalAccessException" |
+	"IllegalArgumentException" |
+	"IllegalMonitorStateException" |
+	"IllegalStateException" |
+	"IllegalThreadStateException" |
+	"IndexOutOfBoundsException" |
+	"InstantiationException" |
+	"InterruptedException" |
+	"NegativeArraySizeException" |
+	"NoSuchFieldException" |
+	"NoSuchMethodException" |
+	"NullPointerException" |
+	"NumberFormatException" |
+	"RuntimeException" |
+	"SecurityException" |
+	"StringIndexOutOfBoundsException" |
+	"TypeNotPresentException" |
+	"UnsupportedOperationException" |
+	"AbstractMethodError" |
+	"AssertionError" |
+	"ClassCircularityError" |
+	"ClassFormatError" |
+	"Error" |
+	"ExceptionInInitializerError" |
+	"IllegalAccessError" |
+	"IncompatibleClassChangeError" |
+	"InstantiationError" |
+	"InternalError" |
+	"LinkageError" |
+	"NoClassDefFoundError" |
+	"NoSuchFieldError" |
+	"NoSuchMethodError" |
+	"OutOfMemoryError" |
+	"StackOverflowError" |
+	"ThreadDeath" |
+	"UnknownError" |
+	"UnsatisfiedLinkError" |
+	"UnsupportedClassVersionError" |
+	"VerifyError" |
+	"VirtualMachineError" |
+
+	/* java.io classes*/
+    "Closeable" |
+    "DataInput" |
+    "DataOutput" |
+    "Externalizable" |
+    "FileFilter" |
+    "FilenameFilter" |
+    "Flushable" |
+    "ObjectInput" |
+    "ObjectInputValidation" |
+    "ObjectOutput" |
+    "ObjectStreamConstants" |
+    "Serializable" |
+
+    "BufferedInputStream" |
+    "BufferedOutputStream" |
+    "BufferedReader" |
+    "BufferedWriter" |
+    "ByteArrayInputStream" |
+    "ByteArrayOutputStream" |
+    "CharArrayReader" |
+    "CharArrayWriter" |
+    "Console" |
+    "DataInputStream" |
+    "DataOutputStream" |
+    "File" |
+    "FileDescriptor" |
+    "FileInputStream" |
+    "FileOutputStream" |
+    "FilePermission" |
+    "FileReader" |
+    "FileWriter" |
+    "FilterInputStream" |
+    "FilterOutputStream" |
+    "FilterReader" |
+    "FilterWriter" |
+    "InputStream" |
+    "InputStreamReader" |
+    "LineNumberInputStream" |
+    "LineNumberReader" |
+    "ObjectInputStream" |
+    "ObjectInputStream.GetField" |
+    "ObjectOutputStream" |
+    "ObjectOutputStream.PutField" |
+    "ObjectStreamClass" |
+    "ObjectStreamField" |
+    "OutputStream" |
+    "OutputStreamWriter" |
+    "PipedInputStream" |
+    "PipedOutputStream" |
+    "PipedReader" |
+    "PipedWriter" |
+    "PrintStream" |
+    "PrintWriter" |
+    "PushbackInputStream" |
+    "PushbackReader" |
+    "RandomAccessFile" |
+    "Reader" |
+    "SequenceInputStream" |
+    "SerializablePermission" |
+    "StreamTokenizer" |
+    "StringBufferInputStream" |
+    "StringReader" |
+    "StringWriter" |
+    "Writer" |
+
+    "CharConversionException" |
+    "EOFException" |
+    "FileNotFoundException" |
+    "InterruptedIOException" |
+    "InvalidClassException" |
+    "InvalidObjectException" |
+    "IOException" |
+    "NotActiveException" |
+    "NotSerializableException" |
+    "ObjectStreamException" |
+    "OptionalDataException" |
+    "StreamCorruptedException" |
+    "SyncFailedException" |
+    "UnsupportedEncodingException" |
+    "UTFDataFormatException" |
+    "WriteAbortedException" |
+
+    "IOError" |
+
+	/* java.util classes */
+    "Collection" |
+    "Comparator" |
+    "Deque" |
+    "Enumeration" |
+    "EventListener" |
+    "Formattable" |
+    "Iterator" |
+    "List" |
+    "ListIterator" |
+    "Map" |
+    "Map.Entry" |
+    "NavigableMap" |
+    "NavigableSet" |
+    "Observer" |
+    "Queue" |
+    "RandomAccess" |
+    "Set" |
+    "SortedMap" |
+    "SortedSet" |
+
+    "AbstractCollection" |
+    "AbstractList" |
+    "AbstractMap" |
+    "AbstractMap.SimpleEntry" |
+    "AbstractMap.SimpleImmutableEntry" |
+    "AbstractQueue" |
+    "AbstractSequentialList" |
+    "AbstractSet" |
+    "ArrayDeque" |
+    "ArrayList" |
+    "Arrays" |
+    "BitSet" |
+    "Calendar" |
+    "Collections" |
+    "Currency" |
+    "Date" |
+    "Dictionary" |
+    "EnumMap" |
+    "EnumSet" |
+    "EventListenerProxy" |
+    "EventObject" |
+    "FormattableFlags" |
+    "Formatter" |
+    "GregorianCalendar" |
+    "HashMap" |
+    "HashSet" |
+    "Hashtable" |
+    "IdentityHashMap" |
+    "LinkedHashMap" |
+    "LinkedHashSet" |
+    "LinkedList" |
+    "ListResourceBundle" |
+    "Locale" |
+    "Locale.Builder" |
+    "Objects" |
+    "Observable" |
+    "PriorityQueue" |
+    "Properties" |
+    "PropertyPermission" |
+    "PropertyResourceBundle" |
+    "Random" |
+    "ResourceBundle" |
+    "ResourceBundle.Control" |
+    "Scanner" |
+    "ServiceLoader" |
+    "SimpleTimeZone" |
+    "Stack" |
+    "StringTokenizer" |
+    "Timer" |
+    "TimerTask" |
+    "TimeZone" |
+    "TreeMap" |
+    "TreeSet" |
+    "UUID" |
+    "Vector" |
+    "WeakHashMap" |
+
+    "Formatter.BigDecimalLayoutForm" |
+    "Locale.Category" |
+
+    "ConcurrentModificationException" |
+    "DuplicateFormatFlagsException" |
+    "EmptyStackException" |
+    "FormatFlagsConversionMismatchException" |
+    "FormatterClosedException" |
+    "IllegalFormatCodePointException" |
+    "IllegalFormatConversionException" |
+    "IllegalFormatException" |
+    "IllegalFormatFlagsException" |
+    "IllegalFormatPrecisionException" |
+    "IllegalFormatWidthException" |
+    "IllformedLocaleException" |
+    "InputMismatchException" |
+    "InvalidPropertiesFormatException" |
+    "MissingFormatArgumentException" |
+    "MissingFormatWidthException" |
+    "MissingResourceException" |
+    "NoSuchElementException" |
+    "TooManyListenersException" |
+    "UnknownFormatConversionException" |
+    "UnknownFormatFlagsException" |
+
+    "ServiceConfigurationError" 		{ addToken(Token.FUNCTION); }
+
+	/* Commonly used methods added to Object class */
+	"addShutdownHook" |
+	"any" |
+	"asBoolean" |
+	"asType" |
+	"collect" |
+	"dump" |
+	"each" |
+	"eachWithIndex" |
+	"every" |
+	"find" |
+	"findAll" |
+	"findIndexOf" |
+	"findIndexValues" |
+	"findLastIndexOf" |
+	"getAt" |
+	"getMetaClass" |
+	"getMetaPropertyValues" |
+	"getProperties" |
+	"grep" |
+	"hasProperty" |
+	"identity" |
+	"inject" |
+	"inspect" |
+	"invokeMethod" |
+	"is" |
+	"isCase" |
+	"iterator" |
+	"metaClass" |
+	"print" |
+	"printf" |
+	"println" |
+	"putAt" |
+	"respondsTo" |
+	"setMetaClass" |
+	"sleep" |
+	"split" |
+	"sprintf" |
+	"toString" |
+	"use" |
+	"with" 			{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* Multiline string literals. */
+	\"\"\"						{ start = zzMarkedPos-3; yybegin(MULTILINE_STRING_DOUBLE); }
+	\'\'\'						{ start = zzMarkedPos-3; yybegin(MULTILINE_STRING_SINGLE); }
+
+
+	/* String/Character literals. */
+	{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{ErrorCharLiteral}				{ addToken(Token.ERROR_CHAR); }
+	\"								{ start = zzMarkedPos-1; yybegin(STRING_DOUBLE); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+	{DocCommentBegin}				{ start = zzMarkedPos-3; yybegin(DOCCOMMENT); }
+	{LineCommentBegin}.*			{ addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+	/* Regular expressions. */
+	{Regex}	{
+				boolean highlightedAsRegex = false;
+				if (zzBuffer[zzStartRead]=='~' || firstToken==null) {
+					addToken(Token.REGEX);
+					highlightedAsRegex = true;
+				}
+				else {
+					// If this is *likely* to be a regex, based on
+					// the previous token, highlight it as such.
+					Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+					if (regexCanFollow(t)) {
+						addToken(Token.REGEX);
+						highlightedAsRegex = true;
+					}
+				}
+				// If it doesn't *appear* to be a regex, highlight it as
+				// individual tokens.
+				if (!highlightedAsRegex) {
+					int temp = zzStartRead + 1;
+					addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+					zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+				}
+			}
+
+	/* Annotations. */
+	{Annotation}					{ addToken(Token.ANNOTATION); }
+
+	/* Separators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{BinaryLiteral}					{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<MLC> {
+
+	[^hwf\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<DOCCOMMENT> {
+
+	[^hwf\@\{\n\<\*]+			{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
+	[hwf]						{}
+
+	"@"{BlockTag}				{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	"@"							{}
+	"{@"{InlineTag}[^\}]*"}"	{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	"{"							{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken; }
+	"<"[/]?({Letter}[^\>]*)?">"	{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.PREPROCESSOR); start = zzMarkedPos; }
+	\<							{}
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION); }
+	\*							{}
+	<<EOF>>						{ yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken; }
+
+}
+
+
+<MULTILINE_STRING_DOUBLE> {
+	[^\"\\\$\n]*				{}
+	\\.?						{ /* Skip escaped chars, handles case: '\"""'. */ }
+	\"\"\"					{ yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{Variable}				{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	{VariableStart}			{}
+	\"						{}
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+
+<MULTILINE_STRING_SINGLE> {
+	[^\'\\\n]*				{}
+	\\.?						{ /* Skip escaped chars, handles case: "\'''". */ }
+	\'\'\'					{ yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.LITERAL_CHAR); }
+	\'						{}
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+}
+
+<STRING_DOUBLE> {
+	[^\n\\\$\"]+		{}
+	\n					{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	{Variable}			{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	{VariableStart}		{}
+	\"					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); return firstToken; }
+}
+
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.java
new file mode 100644
index 0000000..ae909e5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.java
@@ -0,0 +1,5269 @@
+/* The following code was generated by JFlex 1.4.1 on 11/11/12 7:19 PM */
+
+/*
+ * 09/28/2007
+ *
+ * GroovyTokenMaker.java - Scanner for the Groovy programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Groovy programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated GroovyTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class GroovyTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int MULTILINE_STRING_DOUBLE = 3;
+  public static final int DOCCOMMENT = 2;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 1;
+  public static final int STRING_DOUBLE = 5;
+  public static final int MULTILINE_STRING_SINGLE = 4;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\22\1\21\1\0\1\22\1\16\22\0\1\22\1\53\1\13"+
+    "\1\17\1\20\1\53\1\55\1\10\2\44\1\24\1\46\1\45\1\33"+
+    "\1\34\1\23\1\4\1\5\2\7\4\7\2\3\1\56\1\45\1\47"+
+    "\1\50\1\52\1\54\1\100\1\102\1\26\1\6\1\67\1\32\1\31"+
+    "\1\116\1\110\1\105\2\1\1\25\1\111\1\112\1\113\1\115\1\121"+
+    "\1\74\1\103\1\106\1\107\1\117\1\120\1\30\1\1\1\122\1\44"+
+    "\1\12\1\44\1\51\1\2\1\0\1\40\1\27\1\63\1\61\1\37"+
+    "\1\15\1\72\1\57\1\65\1\114\1\75\1\41\1\66\1\14\1\60"+
+    "\1\62\1\104\1\36\1\42\1\35\1\11\1\71\1\70\1\64\1\73"+
+    "\1\101\1\76\1\51\1\77\1\43\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 =
+    "\3\0\2\1\1\0\1\2\1\3\2\4\1\3\1\5"+
+    "\1\3\1\6\2\3\1\2\1\7\1\10\2\11\5\3"+
+    "\1\11\7\3\1\11\1\12\1\3\6\11\13\3\1\13"+
+    "\16\3\2\1\1\14\5\1\1\15\7\1\1\16\2\1"+
+    "\1\17\2\1\1\20\1\21\1\22\1\23\1\24\1\2"+
+    "\2\25\1\26\1\4\1\25\1\26\2\25\1\27\2\25"+
+    "\5\3\1\5\1\30\1\5\1\0\1\3\1\0\7\3"+
+    "\2\0\1\31\1\32\1\11\36\3\1\33\12\3\2\0"+
+    "\1\11\3\3\1\33\7\3\3\33\1\34\21\3\1\13"+
+    "\56\3\2\0\1\35\4\0\1\36\2\0\1\37\16\0"+
+    "\1\16\1\0\1\40\2\0\1\20\1\22\1\2\1\4"+
+    "\1\26\1\0\2\27\1\4\1\27\10\3\1\30\1\41"+
+    "\1\5\1\42\1\5\1\0\1\34\1\3\1\43\5\3"+
+    "\1\44\1\45\64\3\1\33\13\3\1\46\27\3\1\2"+
+    "\46\3\1\34\30\3\33\0\1\47\2\0\1\50\1\2"+
+    "\2\25\12\3\1\42\1\5\1\0\4\3\1\34\1\51"+
+    "\3\3\1\34\3\3\1\34\2\3\1\46\4\3\2\34"+
+    "\6\3\1\52\5\3\1\34\53\3\1\2\51\3\1\0"+
+    "\32\3\2\0\1\53\2\0\1\54\15\0\1\55\11\0"+
+    "\1\40\1\2\2\3\1\34\10\3\1\5\1\0\1\33"+
+    "\40\3\1\33\17\3\1\34\22\3\1\2\11\3\1\34"+
+    "\27\3\1\34\6\3\1\0\32\3\34\0\1\2\14\3"+
+    "\1\5\1\0\4\3\1\34\33\3\1\56\31\3\1\34"+
+    "\1\2\11\3\1\34\26\3\1\34\10\3\1\0\2\3"+
+    "\1\34\10\3\1\34\13\3\23\0\12\3\1\0\2\3"+
+    "\1\0\46\3\1\34\2\3\1\2\40\3\1\0\11\3"+
+    "\1\0\23\3\1\34\7\3\5\0\1\55\4\0\14\3"+
+    "\2\0\101\3\2\0\7\3\1\0\33\3\11\0\4\3"+
+    "\1\34\6\3\2\0\5\3\1\34\10\3\1\34\11\3"+
+    "\1\34\45\3\2\0\6\3\1\34\25\3\5\0\4\3"+
+    "\1\0\2\3\1\34\2\3\2\0\3\3\1\0\55\3"+
+    "\2\0\27\3\5\0\3\3\2\0\3\3\2\0\3\3"+
+    "\1\0\1\34\14\3\1\34\14\3\1\34\12\3\2\0"+
+    "\14\3\1\34\4\3\2\0\2\3\2\0\3\3\2\0"+
+    "\3\3\1\0\10\3\1\34\3\3\1\0\1\3\1\34"+
+    "\2\3\1\34\16\3\1\0\13\3\1\34\3\3\1\34"+
+    "\4\3\2\0\2\3\1\0\2\3\1\0\2\3\1\34"+
+    "\10\3\1\0\12\3\1\0\21\3\2\0\3\3\1\0"+
+    "\5\3\1\34\1\3\1\0\12\3\1\0\14\3\1\34"+
+    "\2\0\3\3\1\0\4\3\1\0\1\3\1\0\11\3"+
+    "\1\0\11\3\2\0\2\3\1\0\2\3\1\0\1\3"+
+    "\1\0\7\3\1\0\6\3\2\0\1\3\1\0\1\3"+
+    "\1\0\1\3\1\0\4\3\1\0\3\3\1\34\1\3"+
+    "\3\0\1\3\1\0\1\3\1\0\1\3\1\0\2\3"+
+    "\1\0\3\3\1\0\1\34\3\0\1\3\1\0\1\3"+
+    "\2\0\2\3\1\0\2\3\5\0\1\3\1\0\1\3"+
+    "\2\0\1\3\6\0\1\3\1\0\1\3\16\0\1\34"+
+    "\23\0";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[1876];
+    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\123\0\246\0\371\0\u014c\0\u019f\0\u01f2\0\u0245"+
+    "\0\u0298\0\u02eb\0\u033e\0\u0391\0\u03e4\0\u0437\0\u048a\0\u04dd"+
+    "\0\u0530\0\u0530\0\u0583\0\u05d6\0\u0629\0\u067c\0\u06cf\0\u0722"+
+    "\0\u0775\0\u07c8\0\u081b\0\u086e\0\u08c1\0\u0914\0\u0967\0\u09ba"+
+    "\0\u0a0d\0\u0a60\0\u0ab3\0\u0530\0\u0530\0\u0b06\0\u0b59\0\u0bac"+
+    "\0\u0bff\0\u0530\0\u0c52\0\u0ca5\0\u0cf8\0\u0d4b\0\u0d9e\0\u0df1"+
+    "\0\u0e44\0\u0e97\0\u0eea\0\u0f3d\0\u0f90\0\u0fe3\0\u1036\0\u1089"+
+    "\0\u10dc\0\u112f\0\u1182\0\u11d5\0\u1228\0\u127b\0\u12ce\0\u1321"+
+    "\0\u1374\0\u13c7\0\u141a\0\u146d\0\u14c0\0\u1513\0\u1566\0\u0530"+
+    "\0\u15b9\0\u160c\0\u165f\0\u16b2\0\u1705\0\u0530\0\u1758\0\u17ab"+
+    "\0\u17fe\0\u1851\0\u18a4\0\u18f7\0\u194a\0\u199d\0\u19f0\0\u1a43"+
+    "\0\u0530\0\u1a96\0\u1ae9\0\u1b3c\0\u0530\0\u1b8f\0\u0530\0\u0530"+
+    "\0\u1be2\0\u1c35\0\u1c88\0\u1c35\0\u1c35\0\u1cdb\0\u1d2e\0\u1d81"+
+    "\0\u1dd4\0\u1e27\0\u1e7a\0\u1ecd\0\u1f20\0\u1f73\0\u1fc6\0\u2019"+
+    "\0\u206c\0\u20bf\0\u2112\0\u2165\0\u21b8\0\u220b\0\u225e\0\u22b1"+
+    "\0\u2304\0\u2357\0\u23aa\0\u23fd\0\u2450\0\u24a3\0\u24f6\0\u2549"+
+    "\0\u259c\0\u25ef\0\u24f6\0\u2642\0\u2695\0\u26e8\0\u273b\0\u278e"+
+    "\0\u27e1\0\u2834\0\u2887\0\u28da\0\u292d\0\u2980\0\u29d3\0\u2a26"+
+    "\0\u2a79\0\u2acc\0\u2b1f\0\u2b72\0\u2bc5\0\u2c18\0\u2c6b\0\u2cbe"+
+    "\0\u2d11\0\u2d64\0\u2db7\0\u2e0a\0\u2e5d\0\u2eb0\0\u2f03\0\u2f56"+
+    "\0\u2fa9\0\u2ffc\0\u304f\0\u30a2\0\u30f5\0\u3148\0\u319b\0\u31ee"+
+    "\0\u3241\0\u3294\0\u32e7\0\u333a\0\u338d\0\u0629\0\u33e0\0\u3433"+
+    "\0\u3486\0\u34d9\0\u352c\0\u357f\0\u35d2\0\u3625\0\u3678\0\u36cb"+
+    "\0\u371e\0\u3771\0\u37c4\0\u0245\0\u3817\0\u386a\0\u38bd\0\u3910"+
+    "\0\u3963\0\u39b6\0\u3a09\0\u3a5c\0\u3aaf\0\u3b02\0\u3b55\0\u3ba8"+
+    "\0\u3bfb\0\u3c4e\0\u3ca1\0\u3cf4\0\u3d47\0\u3d9a\0\u3ded\0\u3e40"+
+    "\0\u3e93\0\u3ee6\0\u3f39\0\u3f8c\0\u3fdf\0\u4032\0\u4085\0\u40d8"+
+    "\0\u412b\0\u417e\0\u41d1\0\u4224\0\u4277\0\u42ca\0\u431d\0\u4370"+
+    "\0\u43c3\0\u4416\0\u4469\0\u44bc\0\u450f\0\u4562\0\u45b5\0\u4608"+
+    "\0\u465b\0\u46ae\0\u4701\0\u4754\0\u47a7\0\u47fa\0\u484d\0\u48a0"+
+    "\0\u48f3\0\u4946\0\u4999\0\u49ec\0\u4a3f\0\u4a92\0\u4ae5\0\u4b38"+
+    "\0\u4b8b\0\u4bde\0\u4c31\0\u4c84\0\u4cd7\0\u4d2a\0\u4d7d\0\u4dd0"+
+    "\0\u0530\0\u4e23\0\u4e76\0\u4ec9\0\u4f1c\0\u0530\0\u4f6f\0\u4fc2"+
+    "\0\u0530\0\u5015\0\u5068\0\u50bb\0\u510e\0\u5161\0\u51b4\0\u5207"+
+    "\0\u525a\0\u52ad\0\u5300\0\u5353\0\u53a6\0\u53f9\0\u544c\0\u0530"+
+    "\0\u549f\0\u54f2\0\u5545\0\u5598\0\u0530\0\u0530\0\u55eb\0\u563e"+
+    "\0\u5691\0\u56e4\0\u5737\0\u1c35\0\u578a\0\u57dd\0\u5830\0\u5883"+
+    "\0\u58d6\0\u5929\0\u597c\0\u59cf\0\u5a22\0\u5a75\0\u0530\0\u0530"+
+    "\0\u5ac8\0\u21b8\0\u5b1b\0\u5b6e\0\u0245\0\u5bc1\0\u0530\0\u5c14"+
+    "\0\u5c67\0\u5cba\0\u5d0d\0\u5d60\0\u0530\0\u5db3\0\u5e06\0\u5e59"+
+    "\0\u5eac\0\u5eff\0\u5f52\0\u5fa5\0\u5ff8\0\u604b\0\u609e\0\u60f1"+
+    "\0\u6144\0\u6197\0\u61ea\0\u623d\0\u6290\0\u62e3\0\u6336\0\u6389"+
+    "\0\u63dc\0\u642f\0\u6482\0\u64d5\0\u6528\0\u657b\0\u65ce\0\u6621"+
+    "\0\u6674\0\u66c7\0\u671a\0\u676d\0\u67c0\0\u6813\0\u6866\0\u68b9"+
+    "\0\u690c\0\u695f\0\u69b2\0\u6a05\0\u6a58\0\u6aab\0\u6afe\0\u6b51"+
+    "\0\u6ba4\0\u6bf7\0\u6c4a\0\u6c9d\0\u6cf0\0\u6d43\0\u6d96\0\u6de9"+
+    "\0\u6e3c\0\u6e8f\0\u6ee2\0\u6f35\0\u6f88\0\u6fdb\0\u702e\0\u7081"+
+    "\0\u70d4\0\u7127\0\u717a\0\u71cd\0\u7220\0\u7273\0\u72c6\0\u7319"+
+    "\0\u736c\0\u73bf\0\u7412\0\u7465\0\u74b8\0\u750b\0\u755e\0\u75b1"+
+    "\0\u7604\0\u7657\0\u76aa\0\u76fd\0\u7750\0\u77a3\0\u77f6\0\u7849"+
+    "\0\u789c\0\u78ef\0\u7942\0\u7995\0\u79e8\0\u7a3b\0\u7a8e\0\u7ae1"+
+    "\0\u7b34\0\u7b87\0\u7bda\0\u7c2d\0\u7c80\0\u7cd3\0\u7d26\0\u7d79"+
+    "\0\u7dcc\0\u7e1f\0\u7e72\0\u7ec5\0\u7f18\0\u7f6b\0\u7fbe\0\u8011"+
+    "\0\u8064\0\u80b7\0\u810a\0\u815d\0\u81b0\0\u8203\0\u8256\0\u82a9"+
+    "\0\u82fc\0\u834f\0\u83a2\0\u83f5\0\u8448\0\u849b\0\u84ee\0\u8541"+
+    "\0\u8594\0\u85e7\0\u863a\0\u868d\0\u86e0\0\u8733\0\u8786\0\u87d9"+
+    "\0\u882c\0\u887f\0\u88d2\0\u8925\0\u8978\0\u89cb\0\u8a1e\0\u8a71"+
+    "\0\u8ac4\0\u8b17\0\u8b6a\0\u8bbd\0\u8c10\0\u8c63\0\u8cb6\0\u8d09"+
+    "\0\u8d5c\0\u8daf\0\u8e02\0\u8e55\0\u8ea8\0\u8efb\0\u8f4e\0\u8fa1"+
+    "\0\u8ff4\0\u9047\0\u909a\0\u90ed\0\u9140\0\u9193\0\u91e6\0\u9239"+
+    "\0\u928c\0\u92df\0\u9332\0\u9385\0\u93d8\0\u942b\0\u947e\0\u94d1"+
+    "\0\u9524\0\u9577\0\u95ca\0\u961d\0\u9670\0\u96c3\0\u9716\0\u9769"+
+    "\0\u97bc\0\u0530\0\u980f\0\u9862\0\u0530\0\u98b5\0\u578a\0\u9908"+
+    "\0\u995b\0\u99ae\0\u9a01\0\u9a54\0\u9aa7\0\u9afa\0\u9b4d\0\u9ba0"+
+    "\0\u9bf3\0\u9c46\0\u0530\0\u9c99\0\u9cec\0\u9d3f\0\u9d92\0\u9de5"+
+    "\0\u9e38\0\u9e8b\0\u0530\0\u9ede\0\u9f31\0\u9f84\0\u9fd7\0\ua02a"+
+    "\0\ua07d\0\ua0d0\0\ua123\0\ua176\0\ua1c9\0\u0245\0\ua21c\0\ua26f"+
+    "\0\ua2c2\0\ua315\0\ua368\0\ua3bb\0\ua40e\0\ua461\0\ua4b4\0\ua507"+
+    "\0\ua55a\0\ua5ad\0\u0245\0\ua600\0\ua653\0\ua6a6\0\ua6f9\0\ua74c"+
+    "\0\ua79f\0\ua7f2\0\ua845\0\ua898\0\ua8eb\0\ua93e\0\ua991\0\ua9e4"+
+    "\0\uaa37\0\uaa8a\0\uaadd\0\uab30\0\uab83\0\uabd6\0\uac29\0\uac7c"+
+    "\0\uaccf\0\uad22\0\uad75\0\uadc8\0\uae1b\0\uae6e\0\uaec1\0\uaf14"+
+    "\0\uaf67\0\uafba\0\ub00d\0\ub060\0\ub0b3\0\ub106\0\ub159\0\ub1ac"+
+    "\0\ub1ff\0\ub252\0\ub2a5\0\ub2f8\0\ub34b\0\ub39e\0\ub3f1\0\ub444"+
+    "\0\ub497\0\ub4ea\0\ub53d\0\ub590\0\ub5e3\0\ub636\0\ub689\0\ub6dc"+
+    "\0\ub72f\0\ub782\0\ub7d5\0\ub828\0\ub87b\0\ub8ce\0\ub921\0\ub974"+
+    "\0\ub9c7\0\uba1a\0\uba6d\0\ubac0\0\ubb13\0\ubb66\0\ubbb9\0\ubc0c"+
+    "\0\ubc5f\0\ubcb2\0\ubd05\0\ubd58\0\ubdab\0\ubdfe\0\ube51\0\ubea4"+
+    "\0\ubef7\0\ubf4a\0\ubf9d\0\ubff0\0\uc043\0\uc096\0\uc0e9\0\uc13c"+
+    "\0\uc18f\0\uc1e2\0\uc235\0\uc288\0\uc2db\0\uc32e\0\uc381\0\uc3d4"+
+    "\0\uc427\0\uc47a\0\uc4cd\0\uc520\0\uc573\0\uc5c6\0\uc619\0\uc66c"+
+    "\0\uc6bf\0\uc712\0\uc765\0\uc7b8\0\uc80b\0\uc85e\0\uc8b1\0\uc904"+
+    "\0\uc957\0\uc9aa\0\uc9fd\0\uca50\0\ucaa3\0\ucaf6\0\ucb49\0\ucb9c"+
+    "\0\ucbef\0\ucc42\0\ucc95\0\ucce8\0\ucd3b\0\ucd8e\0\ucde1\0\uce34"+
+    "\0\uce87\0\uceda\0\ucf2d\0\ucf80\0\ucfd3\0\ud026\0\ud079\0\ud0cc"+
+    "\0\ud11f\0\ud172\0\ud1c5\0\ud218\0\u0530\0\ud26b\0\ud2be\0\ud311"+
+    "\0\ud364\0\ud3b7\0\ud40a\0\ud45d\0\ud4b0\0\ud503\0\u0530\0\ud556"+
+    "\0\ud5a9\0\ud5fc\0\ud64f\0\ud6a2\0\ud6f5\0\ud748\0\ud79b\0\ud7ee"+
+    "\0\ud841\0\ud894\0\ud8e7\0\ud93a\0\ud98d\0\ud9e0\0\uda33\0\uda86"+
+    "\0\udad9\0\udb2c\0\udb7f\0\udbd2\0\udc25\0\udc78\0\udccb\0\udd1e"+
+    "\0\udd71\0\uddc4\0\ude17\0\ude6a\0\udebd\0\udf10\0\udf63\0\udfb6"+
+    "\0\ue009\0\ue05c\0\ue0af\0\ue102\0\ue155\0\ue1a8\0\ue1fb\0\ue24e"+
+    "\0\ue2a1\0\ue2f4\0\ue347\0\ue39a\0\ue3ed\0\ue440\0\u6674\0\ue493"+
+    "\0\ue4e6\0\ue539\0\ue58c\0\ue5df\0\ue632\0\ue685\0\ue6d8\0\ue72b"+
+    "\0\ue77e\0\ue7d1\0\ue824\0\ue877\0\ue8ca\0\ue91d\0\ue970\0\ue9c3"+
+    "\0\uea16\0\uea69\0\ueabc\0\ueb0f\0\ueb62\0\uebb5\0\uec08\0\uec5b"+
+    "\0\uecae\0\ued01\0\ued54\0\ueda7\0\uedfa\0\uee4d\0\ueea0\0\ueef3"+
+    "\0\uef46\0\uef99\0\uefec\0\uf03f\0\uf092\0\uf0e5\0\uf138\0\uf18b"+
+    "\0\uf1de\0\uf231\0\uf284\0\uf2d7\0\uf32a\0\uf37d\0\uf3d0\0\uf423"+
+    "\0\uf476\0\uf4c9\0\uf51c\0\uf56f\0\uf5c2\0\uf615\0\uf668\0\uf6bb"+
+    "\0\uf70e\0\uf761\0\uf7b4\0\uf807\0\uf85a\0\uf8ad\0\uf900\0\uf953"+
+    "\0\uf9a6\0\uf9f9\0\ufa4c\0\ufa9f\0\ufaf2\0\ufb45\0\ufb98\0\ufbeb"+
+    "\0\ufc3e\0\ufc91\0\ufce4\0\ufd37\0\ufd8a\0\ufddd\0\ufe30\0\ufe83"+
+    "\0\ufed6\0\uff29\0\uff7c\0\uffcf\1\42\1\165\1\310\1\u011b"+
+    "\1\u016e\1\u01c1\1\u0214\1\u0267\1\u02ba\1\u030d\1\u0360\1\u03b3"+
+    "\1\u0406\1\u0459\1\u04ac\1\u04ff\1\u0552\1\u05a5\0\ucce8\1\u05f8"+
+    "\0\ucde1\1\u064b\1\u069e\1\u06f1\1\u0744\1\u0797\1\u07ea\1\u083d"+
+    "\1\u0890\1\u08e3\1\u0936\1\u0989\1\u09dc\1\u0a2f\1\u0a82\1\u0ad5"+
+    "\1\u0b28\1\u0b7b\1\u0bce\1\u0c21\1\u0c74\1\u0cc7\1\u0d1a\1\u0d6d"+
+    "\1\u0dc0\1\u0e13\1\u0e66\1\u0eb9\1\u0f0c\1\u0f5f\1\u0fb2\1\u1005"+
+    "\1\u1058\1\u10ab\1\u10fe\1\u1151\1\u11a4\1\u11f7\1\u124a\1\u129d"+
+    "\1\u12f0\1\u1343\1\u1396\1\u13e9\1\u143c\1\u148f\1\u14e2\1\u1535"+
+    "\1\u1588\0\u3817\1\u15db\1\u162e\1\u1681\1\u16d4\1\u1727\1\u177a"+
+    "\1\u17cd\1\u1820\1\u1873\1\u18c6\1\u1919\1\u196c\1\u19bf\1\u1a12"+
+    "\1\u1a65\1\u1ab8\1\u1b0b\1\u1b5e\1\u1bb1\1\u1c04\1\u1c57\1\u1caa"+
+    "\0\u0245\1\u1cfd\1\u1d50\1\u1da3\1\u1df6\1\u1e49\1\u1e9c\1\u1eef"+
+    "\1\u1f42\1\u1f95\1\u1fe8\1\u203b\1\u208e\1\u20e1\1\u2134\1\u2187"+
+    "\1\u21da\1\u222d\1\u2280\1\u22d3\1\u2326\1\u2379\1\u23cc\1\u241f"+
+    "\1\u2472\1\u24c5\1\u2518\1\u256b\1\u25be\1\u2611\1\u2664\1\u26b7"+
+    "\1\u270a\1\u275d\1\u27b0\1\u2803\1\u2856\1\u28a9\1\u28fc\1\u294f"+
+    "\1\u29a2\1\u29f5\1\u2a48\1\u2a9b\1\u2aee\1\u2b41\1\u2b94\1\u2be7"+
+    "\1\u2c3a\1\u2c8d\1\u2ce0\1\u2d33\1\u2d86\1\u2dd9\1\u2e2c\1\u2e7f"+
+    "\1\u2ed2\1\u2f25\1\u2f78\1\u2fcb\1\u301e\1\u3071\1\u30c4\1\u3117"+
+    "\1\u316a\1\u31bd\1\u3210\1\u3263\1\u32b6\1\u3309\1\u335c\1\u33af"+
+    "\1\u3402\1\u3455\1\u34a8\1\u34fb\1\u354e\1\u35a1\1\u35f4\1\u3647"+
+    "\1\u369a\1\u36ed\1\u3740\1\u3793\1\u37e6\1\u3839\1\u388c\1\u38df"+
+    "\1\u3932\1\u3985\1\u39d8\1\u3a2b\1\u3a7e\1\u3ad1\1\u3b24\1\u3b77"+
+    "\1\u3bca\1\u3c1d\1\u3c70\1\u3cc3\1\u3d16\1\u3d69\1\u3dbc\1\u3e0f"+
+    "\1\u3e62\1\u3eb5\1\u3f08\1\u3f5b\1\u3fae\1\u4001\1\u4054\1\u40a7"+
+    "\1\u40fa\1\u414d\1\u41a0\1\u41f3\1\u4246\1\u4299\1\u42ec\1\u433f"+
+    "\1\u4392\1\u43e5\1\u4438\1\u448b\1\u44de\1\u4531\1\u4584\1\u45d7"+
+    "\1\u462a\1\u467d\1\u46d0\1\u4723\1\u4776\1\u47c9\1\u481c\1\u486f"+
+    "\1\u48c2\1\u4915\1\u4968\1\u49bb\1\u4a0e\1\u4a61\1\u4ab4\1\u4b07"+
+    "\1\u4b5a\1\u4bad\1\u4c00\1\u4c53\1\u4ca6\1\u4cf9\1\u4d4c\1\u4d9f"+
+    "\1\u4df2\1\u4e45\1\u4e98\1\u4eeb\1\u4f3e\1\u4f91\1\u4fe4\1\u5037"+
+    "\1\u508a\1\u50dd\1\u5130\1\u5183\1\u51d6\1\u5229\1\u527c\1\u52cf"+
+    "\1\u5322\1\u5375\1\u53c8\1\u541b\1\u546e\1\u54c1\1\u5514\1\u5567"+
+    "\1\u55ba\1\u560d\1\u5660\1\u56b3\1\u5706\1\u5759\1\u57ac\1\u57ff"+
+    "\1\u5852\1\u58a5\1\u58f8\1\u594b\1\u599e\1\u59f1\1\u5a44\1\u5a97"+
+    "\1\u5aea\1\u5b3d\1\u5b90\1\u5be3\1\u5c36\1\u5c89\1\u5cdc\1\u5d2f"+
+    "\1\u5d82\1\u5dd5\1\u5e28\1\u5e7b\1\u5ece\1\u5f21\1\u5f74\1\u5fc7"+
+    "\1\u601a\1\u3402\1\u606d\1\u60c0\1\u6113\1\u6166\1\u61b9\1\u620c"+
+    "\1\u625f\1\u62b2\1\u6305\1\u6358\1\u63ab\1\u63fe\1\u6451\1\u64a4"+
+    "\1\u64f7\1\u654a\1\u659d\1\u65f0\1\u6643\1\u6696\1\u66e9\1\u673c"+
+    "\1\u678f\1\u67e2\1\u6835\1\u6888\1\u68db\1\u692e\1\u6981\1\u69d4"+
+    "\1\u6a27\1\u6a7a\1\u6acd\1\u6b20\1\u6b73\1\u6bc6\1\u6c19\1\u6c6c"+
+    "\1\u6cbf\1\u6d12\1\u6d65\1\u6db8\1\u6e0b\1\u6e5e\1\u6eb1\1\u6f04"+
+    "\1\u6f57\1\u6faa\1\u6ffd\1\u7050\1\u70a3\1\u70f6\1\u7149\1\u719c"+
+    "\1\u71ef\1\u7242\1\u7295\1\u72e8\1\u733b\1\u738e\1\u73e1\1\u7434"+
+    "\1\u7487\1\u74da\1\u752d\1\u7580\1\u75d3\1\u7626\1\u7679\1\u76cc"+
+    "\1\u771f\1\u7772\1\u77c5\1\u7818\1\u786b\1\u78be\1\u7911\1\u7964"+
+    "\1\u79b7\1\u7a0a\1\u7a5d\1\u7ab0\1\u7b03\1\u7b56\1\u7ba9\1\u7bfc"+
+    "\1\u7c4f\1\u7ca2\1\u7cf5\1\u7d48\1\u7d9b\1\u7dee\1\u7e41\1\u7e94"+
+    "\1\u7ee7\1\u7f3a\1\u7f8d\1\u7fe0\1\u8033\1\u8086\1\u80d9\1\u812c"+
+    "\1\u817f\1\u81d2\1\u8225\1\u8278\1\u82cb\1\u831e\1\u8371\1\u83c4"+
+    "\1\u8417\1\u846a\1\u84bd\1\u8510\1\u8563\1\u85b6\1\u8609\1\u865c"+
+    "\1\u86af\1\u8702\1\u8755\1\u87a8\1\u87fb\1\u884e\1\u88a1\1\u88f4"+
+    "\1\u8947\1\u899a\1\u89ed\1\u8a40\1\u8a93\1\u8ae6\1\u8b39\1\u8b8c"+
+    "\1\u8bdf\1\u8c32\1\u8c85\1\u8cd8\1\u8d2b\1\u8d7e\1\u8dd1\1\u8e24"+
+    "\1\u8e77\1\u8eca\1\u8f1d\1\u8f70\1\u8fc3\1\u9016\1\u9069\1\u90bc"+
+    "\1\u910f\1\u9162\1\u91b5\1\u9208\1\u925b\1\u92ae\1\u9301\1\u9354"+
+    "\1\u93a7\1\u93fa\1\u944d\1\u94a0\1\u94f3\1\u9546\1\u9599\1\u95ec"+
+    "\1\u963f\1\u9692\1\u96e5\1\u9738\1\u978b\1\u97de\1\u9831\1\u9884"+
+    "\1\u98d7\1\u992a\1\u997d\1\u99d0\1\u9a23\1\u9a76\1\u9ac9\1\u9b1c"+
+    "\1\u9b6f\1\u9bc2\1\u9c15\1\u9c68\1\u9cbb\1\u9d0e\1\u9d61\1\u9db4"+
+    "\1\u9e07\1\u9e5a\1\u9ead\1\u9f00\1\u9f53\1\u9fa6\1\u9ff9\1\ua04c"+
+    "\1\ua09f\1\ua0f2\1\u9c15\1\ua145\1\ua198\1\ua1eb\1\ua23e\1\ua291"+
+    "\1\ua2e4\1\ua337\1\ua38a\1\ua3dd\1\ua430\1\ua483\1\ua4d6\1\ua529"+
+    "\1\ua57c\1\ua5cf\1\ua622\1\ua675\1\ua6c8\1\ua71b\1\ua76e\1\ua7c1"+
+    "\1\ua814\1\ua867\1\ua8ba\1\ua90d\1\ua960\1\ua9b3\1\uaa06\1\uaa59"+
+    "\1\uaaac\1\uaaff\1\uab52\1\uaba5\1\uabf8\1\uac4b\1\uac9e\1\uacf1"+
+    "\1\uad44\1\uad97\1\uadea\1\uae3d\1\uae90\1\uaee3\1\uaf36\1\uaf89"+
+    "\0\u0530\1\uafdc\1\ub02f\1\ub082\1\ub0d5\1\ub128\1\ub17b\1\ub1ce"+
+    "\1\ub221\1\ub274\1\ub2c7\1\ub31a\1\ub36d\1\ub3c0\1\ub413\1\ub466"+
+    "\1\ub4b9\1\ub50c\1\ub55f\1\ub5b2\1\ub605\1\ub658\1\ub6ab\1\ub6fe"+
+    "\1\ub751\1\ub7a4\1\ub7f7\1\ub84a\1\ub89d\1\ub8f0\1\ub943\1\ub996"+
+    "\1\ub9e9\1\uba3c\1\u79b7\1\uba8f\1\ubae2\1\ubb35\1\ubb88\1\ubbdb"+
+    "\1\ubc2e\1\ubc81\1\ubcd4\1\ubd27\1\ubd7a\1\ubdcd\1\ube20\1\ube73"+
+    "\1\ubec6\1\ubf19\1\ubf6c\1\ubfbf\1\uc012\1\uc065\1\uc0b8\1\uc10b"+
+    "\1\uc15e\1\uc1b1\1\uc204\1\uc257\1\uc2aa\1\uc2fd\1\uc350\1\uc3a3"+
+    "\1\uc3f6\1\uc449\1\uc49c\1\uc4ef\1\uc542\1\uc595\1\uc5e8\1\uc63b"+
+    "\1\uc68e\1\uc6e1\1\uc734\1\uc787\1\uc7da\1\uc82d\1\uc880\1\uc8d3"+
+    "\1\uc926\1\uc979\1\uc9cc\1\uca1f\1\uca72\1\ucac5\1\ucb18\1\ucb6b"+
+    "\1\ucbbe\1\ucc11\1\ucc64\1\uccb7\1\ucd0a\1\ucd5d\1\ucdb0\1\uce03"+
+    "\1\uce56\1\ucea9\1\ucefc\1\ucf4f\1\ucfa2\1\ucff5\1\ud048\1\ud09b"+
+    "\1\ud0ee\1\ud141\1\ud194\1\ud1e7\1\ud23a\1\ud28d\1\ud2e0\1\ud333"+
+    "\1\ud386\1\ud3d9\1\ud42c\1\ud47f\1\ud4d2\1\ud525\1\ud578\1\ud5cb"+
+    "\1\ud61e\1\ud671\1\ud6c4\1\ud717\1\ud76a\1\ud7bd\1\ud810\1\ud863"+
+    "\1\ud8b6\1\ud909\1\ud95c\1\ud9af\1\uda02\1\uda55\1\udaa8\1\udafb"+
+    "\1\udb4e\1\udba1\1\udbf4\1\udc47\1\udc9a\1\udced\1\udd40\1\udd93"+
+    "\1\udde6\1\ude39\1\ude8c\1\udedf\1\udf32\1\udf85\1\udfd8\1\ue02b"+
+    "\1\ue07e\1\ue0d1\1\ue124\1\ue177\1\ue1ca\1\ue21d\1\ue270\1\ue2c3"+
+    "\1\ue316\1\ue369\1\ue3bc\1\ue40f\1\ue462\1\ue4b5\1\ue508\1\ue55b"+
+    "\1\ue5ae\1\ue601\1\ue654\1\ue6a7\1\ue6fa\1\ue74d\1\ue7a0\1\ue7f3"+
+    "\1\ue846\1\ue899\1\ue8ec\1\ue93f\1\ue992\1\ue9e5\1\uea38\1\uea8b"+
+    "\1\ueade\1\ueb31\1\ueb84\1\uebd7\1\uec2a\1\uec7d\1\uecd0\1\ued23"+
+    "\1\ued76\1\uedc9\1\uee1c\1\uee6f\1\ueec2\1\uef15\1\uef68\1\uefbb"+
+    "\1\uf00e\1\uf061\1\uf0b4\1\uf107\1\uf15a\1\uf1ad\1\uf200\1\uf253"+
+    "\1\uf2a6\1\uf2f9\1\uf34c\1\uf39f\1\uf3f2\1\uf445\1\uf498\1\uf4eb"+
+    "\1\uf53e\1\u7fe0\1\uf591\1\uf5e4\1\uf637\1\uf68a\1\uf6dd\1\uf730"+
+    "\1\uf783\1\uf7d6\1\uf829\1\uf87c\1\uf8cf\1\uf922\1\uf975\1\uf9c8"+
+    "\1\ufa1b\1\ufa6e\1\ufac1\1\ufb14\1\ufb67\1\ufbba\1\ufc0d\1\ufc60"+
+    "\1\ufcb3\1\ufd06\1\ufd59\1\ufdac\1\ufdff\1\ufe52\1\ufea5\1\ufef8"+
+    "\1\uff4b\1\uff9e\1\ufff1\2\104\2\227\2\352\2\u013d\2\u0190"+
+    "\2\u01e3\2\u0236\2\u0289\2\u02dc\2\u032f\2\u0382\2\u03d5\2\u0428"+
+    "\2\u047b\2\u04ce\2\u0521\2\u0574\2\u05c7\2\u061a\2\u066d\2\u06c0"+
+    "\2\u0713\2\u0766\2\u07b9\2\u080c\2\u085f\2\u08b2\2\u0905\2\u0958"+
+    "\2\u09ab\2\u09fe\2\u0a51\2\u0aa4\2\u0af7\2\u0b4a\2\u0b9d\2\u0bf0"+
+    "\2\u0c43\2\u0c96\2\u0ce9\2\u0d3c\2\u0d8f\2\u0de2\2\u0e35\2\u0e88"+
+    "\2\u0edb\2\u0f2e\2\u0f81\2\u0fd4\2\u1027\2\u107a\2\u10cd\2\u1120"+
+    "\2\u1173\2\u11c6\2\u1219\2\u126c\2\u12bf\2\u1312\2\u1365\2\u13b8"+
+    "\2\u140b\2\u145e\2\u14b1\2\u1504\2\u1557\2\u15aa\2\u15fd\2\u1650"+
+    "\2\u16a3\2\u16f6\2\u1749\2\u179c\2\u17ef\2\u1842\2\u1895\2\u18e8"+
+    "\2\u193b\2\u198e\2\u19e1\2\u1a34\2\u1a87\2\u1ada\2\u1b2d\2\u1b80"+
+    "\2\u1bd3\2\u1c26\2\u1c79\2\u1ccc\2\u1d1f\2\u1d72\2\u1dc5\2\u1e18"+
+    "\2\u1e6b\2\u1ebe\2\u1f11\2\u1f64\2\u1fb7\2\u200a\2\u205d\2\u20b0"+
+    "\2\u2103\2\u2156\2\u21a9\2\u21fc\2\u224f\2\u22a2\2\u22f5\2\u2348"+
+    "\2\u239b\2\u23ee\2\u2441\2\u2494\2\u24e7\2\u253a\2\u258d\2\u25e0"+
+    "\2\u2633\2\u2686\2\u26d9\2\u272c\2\u277f\2\u27d2\2\u2825\2\u2878"+
+    "\2\u28cb\2\u291e\2\u2971\2\u29c4\2\u2a17\2\u2a6a\2\u2abd\2\u2b10"+
+    "\2\u2b63\2\u2bb6\2\u2c09\2\u2c5c\2\u2caf\2\u2d02\2\u2d55\2\u2da8"+
+    "\2\u2dfb\2\u2e4e\2\u2ea1\2\u2ef4\2\u2f47\2\u2f9a\2\u2fed\2\u3040"+
+    "\2\u3093\2\u30e6\2\u3139\2\u318c\2\u31df\2\u3232\2\u3285\2\u32d8"+
+    "\2\u332b\2\u337e\2\u33d1\2\u3424\2\u3477\2\u34ca\2\u351d\2\u3570"+
+    "\2\u35c3\2\u3616\2\u3669\2\u36bc\2\u370f\2\u3762\2\u37b5\2\u3808"+
+    "\2\u385b\2\u38ae\2\u3901\2\u3954\2\u39a7\2\u39fa\2\u3a4d\2\u3aa0"+
+    "\2\u3af3\2\u3b46\2\u3b99\2\u3bec\2\u3c3f\2\u3c92\2\u3ce5\2\u3d38"+
+    "\2\u3d8b\2\u3dde\2\u3e31\2\u3e84\2\u3ed7\2\u3f2a\2\u3f7d\2\u3fd0"+
+    "\2\u4023\2\u4076\2\u40c9\2\u411c\2\u416f\2\u41c2\2\u4215\2\u4268"+
+    "\2\u42bb\2\u430e\2\u4361\2\u43b4\2\u4407\2\u445a\2\u44ad\2\u4500"+
+    "\2\u4553\2\u45a6\2\u45f9\2\u464c\2\u469f\2\u46f2\2\u4745\2\u4798"+
+    "\2\u47eb\2\u483e\2\u4891\2\u48e4\2\u4937\2\u498a\2\u49dd\2\u4a30"+
+    "\2\u4a83\2\u4ad6\2\u4b29\2\u4b7c\2\u4bcf\2\u4c22\2\u4c75\2\u4cc8"+
+    "\2\u4d1b\2\u4d6e\2\u4dc1\2\u4e14\2\u4e67\2\u4eba\2\u4f0d\2\u4f60"+
+    "\2\u4fb3\2\u5006\2\u5059\2\u50ac";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[1876];
+    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\7\2\10\1\11\1\12\1\11\1\13\1\11\1\14"+
+    "\1\15\1\7\1\16\1\17\1\20\1\21\1\7\1\10"+
+    "\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\10"+
+    "\1\31\1\32\1\33\1\34\1\35\1\36\1\37\1\40"+
+    "\1\41\1\42\1\43\1\44\1\45\1\46\1\47\1\50"+
+    "\1\25\1\51\1\25\1\52\1\53\1\52\1\54\1\10"+
+    "\1\55\1\56\1\57\1\10\1\60\1\61\1\62\1\63"+
+    "\1\64\1\65\1\10\1\66\1\10\2\44\1\67\1\10"+
+    "\1\70\1\71\1\10\1\72\1\73\1\74\1\75\1\76"+
+    "\1\77\1\100\1\10\1\101\1\102\1\103\1\104\1\105"+
+    "\1\10\15\106\1\107\3\106\1\110\2\106\1\111\32\106"+
+    "\1\112\10\106\1\113\32\106\15\114\1\115\3\114\1\116"+
+    "\2\114\1\117\22\114\1\120\7\114\1\121\10\114\1\122"+
+    "\5\114\1\123\1\114\1\124\22\114\12\125\1\126\1\127"+
+    "\4\125\1\130\1\131\101\125\10\132\1\133\1\132\1\134"+
+    "\6\132\1\135\101\132\12\125\1\136\1\137\4\125\1\130"+
+    "\1\140\101\125\10\7\1\0\2\7\1\0\2\7\1\0"+
+    "\2\7\4\0\6\7\2\0\6\7\14\0\17\7\2\0"+
+    "\24\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\2\142\1\143\3\11\1\142\1\11"+
+    "\1\0\2\142\1\0\1\142\1\144\1\0\2\142\4\0"+
+    "\1\145\3\142\1\144\1\146\1\0\1\147\2\142\1\146"+
+    "\1\142\1\145\1\142\14\0\2\142\1\144\5\142\1\144"+
+    "\6\142\2\0\25\142\1\150\1\151\2\152\1\142\1\152"+
+    "\1\0\2\142\1\0\1\142\1\144\1\0\2\142\4\0"+
+    "\1\145\2\153\1\154\1\144\1\146\1\0\1\147\2\142"+
+    "\1\146\1\142\1\145\1\142\14\0\2\142\1\144\2\142"+
+    "\1\154\2\142\1\144\6\142\2\0\23\142\1\7\7\10"+
+    "\1\0\1\155\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\156\1\157\1\10\14\0"+
+    "\1\160\1\161\15\10\2\0\1\7\22\10\10\162\1\163"+
+    "\1\162\1\164\6\162\1\165\101\162\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\5\10\1\166\14\0\17\10\2\0\1\7"+
+    "\22\10\13\0\1\167\107\0\1\7\7\10\1\0\1\170"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\171\1\172\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+    "\1\173\1\174\1\10\14\0\1\10\1\175\4\10\1\176"+
+    "\10\10\2\0\1\7\22\10\145\0\1\23\100\0\12\177"+
+    "\1\200\10\177\1\201\1\202\23\177\1\203\52\177\50\0"+
+    "\1\52\52\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\1\10\1\204\4\10\1\205\10\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\206\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\10\1\207\4\10\1\210\5\10\1\211\2\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\212\4\10\14\0\1\10\1\213\12\10\1\214\2\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\215\1\10\14\0\1\10\1\216\4\10\1\217"+
+    "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\1\220\1\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\221\4\10\14\0\5\10\1\222"+
+    "\1\10\1\223\2\10\1\224\4\10\2\0\1\7\12\10"+
+    "\1\225\7\10\33\0\1\52\14\0\1\52\55\0\3\147"+
+    "\1\0\1\147\113\0\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\10\1\226\1\227\3\10\14\0\1\230\1\231\15\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\232\3\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\233\1\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\234"+
+    "\1\235\1\10\14\0\5\10\1\236\4\10\1\237\4\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\1\240\1\10\1\0\1\7\1\10\4\0\2\10"+
+    "\1\241\3\10\2\0\5\10\1\242\14\0\2\10\1\243"+
+    "\14\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\1\10\1\244\15\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\245\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\246\1\10"+
+    "\1\247\1\10\1\250\1\10\14\0\1\251\2\10\1\252"+
+    "\5\10\1\253\2\10\1\254\2\10\2\0\1\7\22\10"+
+    "\23\0\1\255\145\0\1\52\1\0\1\52\121\0\1\256"+
+    "\1\52\115\0\1\52\4\0\1\52\122\0\1\52\1\0"+
+    "\1\257\120\0\1\52\4\0\1\52\45\0\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\260\2\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\261\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\262\3\10\14\0\1\10\1\263\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\264\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\265\1\10\1\266\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\267"+
+    "\1\270\1\10\14\0\1\271\1\272\15\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\273"+
+    "\1\274\1\0\1\7\1\10\4\0\6\10\2\0\1\275"+
+    "\4\10\1\276\14\0\2\10\1\277\4\10\1\300\7\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\301\3\10\14\0\6\10\1\302\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\303\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+    "\1\304\1\305\2\10\14\0\1\10\1\306\4\10\1\307"+
+    "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\1\310\5\10\1\311\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\1\10\1\312\15\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\10\1\313\1\314\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\315\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\316\1\317\2\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\2\320\3\7\1\320\1\7"+
+    "\1\0\1\320\1\7\1\0\2\320\1\0\1\7\1\320"+
+    "\4\0\6\320\2\0\6\320\14\0\17\320\2\0\1\7"+
+    "\22\320\1\7\7\10\1\0\1\321\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\2\10\1\322\3\10\2\0"+
+    "\1\10\1\323\3\10\1\324\14\0\3\10\1\325\13\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\326\1\10\1\327\3\10\14\0\1\330\1\331\2\10"+
+    "\1\332\1\10\1\333\5\10\1\334\2\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\335"+
+    "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\1\336"+
+    "\3\10\1\337\1\10\14\0\2\10\1\340\14\10\2\0"+
+    "\1\7\12\10\1\341\7\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\10\1\342\4\10\14\0\1\343\1\344\4\10"+
+    "\1\345\5\10\1\346\2\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\347\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\5\10\1\350\1\351\13\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\352\2\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\353\2\10\14\0\6\10\1\354\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\355\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+    "\1\356\1\357\2\10\14\0\1\10\1\360\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\361\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\2\10\1\362\3\10"+
+    "\2\0\6\10\14\0\3\10\1\363\13\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\364\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\365"+
+    "\1\10\1\366\2\10\14\0\6\10\1\367\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\370\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\371\3\10\14\0"+
+    "\1\10\1\372\4\10\1\373\10\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\374\1\375"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\376\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\15\106\1\0\3\106\1\0\2\106\1\0\32\106"+
+    "\1\0\10\106\1\0\32\106\35\0\1\377\27\0\1\u0100"+
+    "\60\0\1\u0101\134\0\1\u0102\155\0\1\u0103\32\0\15\114"+
+    "\1\0\3\114\1\0\2\114\1\0\22\114\1\0\7\114"+
+    "\1\0\10\114\1\0\5\114\1\0\1\114\1\0\22\114"+
+    "\35\0\1\u0104\27\0\1\u0105\60\0\1\u0106\100\0\1\u0107"+
+    "\4\0\1\u0107\2\0\1\u0107\2\0\2\u0107\5\0\1\u0108"+
+    "\1\0\6\u0107\2\0\6\u0107\7\0\1\u0109\4\0\17\u0107"+
+    "\3\0\22\u0107\35\0\1\u010a\155\0\1\u010b\132\0\1\u010c"+
+    "\57\0\1\u010d\1\u010e\1\u010f\1\u0110\1\0\1\u0111\15\0"+
+    "\1\u0112\1\u0113\1\u0114\1\u0115\1\0\1\u0116\3\0\1\u0117"+
+    "\31\0\12\125\2\0\4\125\2\0\101\125\21\u0118\1\0"+
+    "\101\u0118\13\0\1\u0119\110\0\2\u011a\3\0\1\u011a\2\0"+
+    "\1\u011a\2\0\2\u011a\2\0\1\u011a\4\0\6\u011a\2\0"+
+    "\6\u011a\14\0\17\u011a\1\u011b\2\0\22\u011a\10\132\1\0"+
+    "\1\132\1\0\6\132\1\0\101\132\10\0\1\u011c\112\0"+
+    "\21\u011d\1\0\101\u011d\21\u011e\1\0\101\u011e\10\7\1\0"+
+    "\1\u011f\1\7\1\0\2\7\1\0\2\7\4\0\6\7"+
+    "\2\0\6\7\14\0\17\7\2\0\23\7\10\142\1\0"+
+    "\2\142\1\0\2\142\1\0\2\142\4\0\6\142\2\0"+
+    "\6\142\14\0\17\142\2\0\25\142\1\143\3\u0120\1\142"+
+    "\1\u0120\1\0\2\142\1\0\2\142\1\0\2\142\4\0"+
+    "\6\142\2\0\6\142\14\0\17\142\2\0\26\142\3\u0121"+
+    "\1\142\1\u0121\1\0\2\142\1\0\2\142\1\0\2\142"+
+    "\4\0\6\142\1\u0122\1\0\6\142\3\0\1\u0122\10\0"+
+    "\17\142\2\0\26\142\3\147\1\142\1\147\1\0\2\142"+
+    "\1\0\1\142\1\144\1\0\2\142\4\0\4\142\1\144"+
+    "\1\146\2\0\2\142\1\146\3\142\14\0\2\142\1\144"+
+    "\5\142\1\144\6\142\2\0\25\142\1\150\1\142\2\u0123"+
+    "\1\142\1\u0123\1\0\2\142\1\0\2\142\1\0\2\142"+
+    "\4\0\6\142\2\0\6\142\14\0\17\142\2\0\26\142"+
+    "\3\151\1\142\1\151\1\0\2\142\1\0\1\142\1\144"+
+    "\1\0\2\142\4\0\4\142\1\144\1\146\1\0\1\147"+
+    "\2\142\1\146\3\142\14\0\2\142\1\144\5\142\1\144"+
+    "\6\142\2\0\25\142\1\150\1\151\2\152\1\142\1\152"+
+    "\1\0\2\142\1\0\1\142\1\144\1\0\2\142\4\0"+
+    "\1\u0124\3\142\1\144\1\146\1\0\1\147\2\142\1\146"+
+    "\1\142\1\u0124\1\142\14\0\2\142\1\144\5\142\1\144"+
+    "\6\142\2\0\27\142\2\u0125\2\142\1\0\2\142\1\0"+
+    "\2\142\1\0\2\142\4\0\6\142\2\0\6\142\14\0"+
+    "\17\142\2\0\26\142\5\u0126\1\0\2\142\1\0\1\142"+
+    "\1\u0126\1\0\2\142\4\0\1\142\2\u0126\1\142\2\u0126"+
+    "\2\0\2\142\2\u0126\2\142\14\0\2\142\1\u0126\1\142"+
+    "\1\u0126\3\142\1\u0126\6\142\2\0\2\142\1\u0126\20\142"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0127\4\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\4\10\1\u0128\1\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+    "\1\u0129\2\10\14\0\1\10\1\u012a\15\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u012b"+
+    "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\u012c\1\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\4\10\1\u012d\1\10\14\0"+
+    "\7\10\1\u012e\7\10\2\0\1\7\22\10\10\162\1\u012f"+
+    "\1\162\1\164\6\162\1\165\101\162\10\0\1\u0130\112\0"+
+    "\4\u0131\2\162\1\u0131\1\162\1\u0132\1\u0133\4\162\3\u0131"+
+    "\1\0\5\u0131\1\162\5\u0131\2\162\64\u0131\10\165\1\u012f"+
+    "\1\165\1\u0134\110\165\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u0135\3\10\14\0\6\10\1\u0136\10\10\2\0"+
+    "\1\7\22\10\13\0\1\u0137\107\0\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\4\10\1\u0138\1\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\11\10\1\274\5\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u0139\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u013a\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+    "\1\u013b\15\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\274\4\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\u013c\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\12\177\1\200"+
+    "\10\177\1\u013d\120\177\1\0\101\177\21\201\1\0\101\201"+
+    "\24\0\1\u013e\76\0\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\1\u013f\1\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\4\10\1\u0140\12\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u0141"+
+    "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\5\10"+
+    "\1\u0142\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\10\1\u0143\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\1\10\1\u0144\15\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u0145\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\u0146\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u0147\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\1\10\1\u0148\15\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0149\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\u014a\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\10\1\u014b\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\u014c\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\4\10\1\u014d\1\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\u014e"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\10\1\u014f\4\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u0150\5\10\14\0\4\10\1\u0151\12\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\3\10\1\u0152\13\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u0153\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\4\10"+
+    "\1\u0154\1\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\u0155\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u0156"+
+    "\2\10\14\0\14\10\1\274\2\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\5\10\1\u0157\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\10\1\u0158\4\10\14\0\6\10\1\u0159\10\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\2\10\1\u015a\17\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u015b\4\10\1\u015c"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\u015d\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+    "\1\u015e\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\5\10\1\u015f\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0160\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u0161\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\14\10\1\u0135\2\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\5\10\1\u0162\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\1\10\1\u0163"+
+    "\4\10\2\0\5\10\1\u0164\14\0\17\10\2\0\1\7"+
+    "\5\10\1\u0165\14\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\2\10\1\u0166\14\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\u0167\1\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\3\10\1\u0168\13\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u0169"+
+    "\1\10\1\u016a\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u016b\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\313\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\10\1\u016c\15\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\u016d\2\10\1\u016e\1\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\6\10\1\u016f\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\u0170\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\12\177\1\200"+
+    "\10\177\2\0\76\177\50\0\1\52\1\0\1\25\50\0"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\5\10\1\u0171\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\7\10\1\u0172\7\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\10"+
+    "\1\u0173\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\u0174\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\2\10\1\u0175\3\10\2\0\1\u0176"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u0177\4\10"+
+    "\1\u0178\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\4\10\1\u0179\12\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u017a"+
+    "\4\10\1\u015f\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\3\10\1\u017b\2\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u017c\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u017d"+
+    "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+    "\1\u017e\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u017f\4\10\1\u0180\14\0"+
+    "\12\10\1\u0181\4\10\2\0\1\7\13\10\1\u0182\6\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0183\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\5\10\1\u0184"+
+    "\1\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+    "\1\u0185\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\3\10\1\u0186"+
+    "\13\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u0187\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\5\10"+
+    "\1\u0188\11\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\3\10\1\u0189\13\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\3\10\1\u018a\16\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u018b\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\u018c\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\4\10\1\u018d\12\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\6\10\1\u018e\10\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u018f\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\4\10\1\u0190\1\10\14\0\6\10\1\u0191\10\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u0172\3\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u0192\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\1\u0193\1\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u0194\1\10"+
+    "\1\u0195\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\u0196\1\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\320\1\0\1\320\1\u0197\1\0"+
+    "\2\320\1\0\1\7\1\320\4\0\6\320\2\0\6\320"+
+    "\14\0\17\320\2\0\1\7\22\320\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u0198\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u0199"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\u019a\4\10\14\0\6\10\1\u019b"+
+    "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\5\10\1\u019c\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\3\10"+
+    "\1\u019d\13\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\u019e\1\10\1\u019f\2\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u0135\1\u01a0\4\10\14\0\4\10\1\u01a1\12\10"+
+    "\2\0\1\7\3\10\1\u01a2\16\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\10\1\u01a3\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\u01a4\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\3\10\1\u01a5\2\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\7\10\1\u01a6\7\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u01a7"+
+    "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\5\10"+
+    "\1\u01a8\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\u01a9\4\10\1\u01aa\14\0\1\u01ab"+
+    "\1\10\1\u01ac\1\u01ad\1\u01ae\5\10\1\u01af\4\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+    "\1\u01b0\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\4\10\1\u01b1\1\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u01b2\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\1\u01b3\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u01b4\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\u01b5\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\1\10\1\u01b6"+
+    "\15\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\7\10\1\u01b7\7\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\3\10\1\u01b8\13\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\5\10\1\u01b9\14\0\16\10\1\u01ba"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\4\10\1\u01bb"+
+    "\1\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\4\10\1\u01bc\15\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\5\10\1\u01bd\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u018f\5\10"+
+    "\14\0\3\10\1\u01be\13\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\5\10\1\u01bf\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u01c0\1\10\14\0\7\10\1\u01c1\7\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\13\10\1\u01c2\3\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\12\10\1\u01c3"+
+    "\4\10\2\0\1\7\22\10\1\7\5\10\1\u01c4\1\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\u01c5\5\10\14\0\17\10\2\0"+
+    "\1\7\2\10\1\u01c6\17\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u01c7\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\5\10\1\u01c8\14\0"+
+    "\17\10\2\0\1\7\13\10\1\u01c9\6\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\u01ca\5\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\5\10"+
+    "\1\u01cb\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u01cc\4\10"+
+    "\1\u01cd\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\4\10\1\u01ce\12\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\3\10\1\u01cf\13\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u01d0\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\10\1\u01d1\4\10\14\0\4\10\1\u01d2\12\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\6\10\1\u01d3\10\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u01d4\4\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\6\10\1\u01d5\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+    "\1\u01d6\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u018a\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\62\0\1\u01d7\101\0\1\u01d8"+
+    "\116\0\1\u01d9\155\0\1\u01da\114\0\1\u01db\101\0\1\u01dc"+
+    "\61\0\52\u0107\1\u0109\50\u0107\1\0\1\u0107\4\0\1\u0107"+
+    "\2\0\1\u0107\2\0\2\u0107\7\0\6\u0107\2\0\6\u0107"+
+    "\7\0\1\u0109\4\0\17\u0107\3\0\22\u0107\35\0\1\u01dd"+
+    "\155\0\1\u01de\73\0\1\u01df\17\0\1\u01e0\1\0\1\u01e1"+
+    "\1\0\1\u01e2\3\0\1\u01e3\42\0\1\u01e4\45\0\1\u01e5"+
+    "\1\u01e6\101\0\1\u01e7\147\0\1\u01e8\47\0\1\u01e9\150\0"+
+    "\1\u01ea\25\0\1\u01eb\64\0\1\u01ec\132\0\1\u01ed\123\0"+
+    "\1\u01ee\122\0\1\u01ef\76\0\1\u01f0\145\0\1\u01f1\76\0"+
+    "\1\u01f2\110\0\7\u011a\1\0\1\u011a\1\u01f3\1\0\2\u011a"+
+    "\2\0\1\u011a\4\0\6\u011a\2\0\6\u011a\14\0\17\u011a"+
+    "\3\0\22\u011a\77\u01f4\1\0\23\u01f4\10\0\1\u01f5\112\0"+
+    "\3\7\5\u01f6\1\0\2\7\1\0\1\7\1\u01f6\1\0"+
+    "\2\7\4\0\1\7\2\u01f6\1\7\2\u01f6\2\0\2\7"+
+    "\2\u01f6\2\7\14\0\2\7\1\u01f6\1\7\1\u01f6\3\7"+
+    "\1\u01f6\6\7\2\0\2\7\1\u01f6\20\7\2\142\1\143"+
+    "\3\u0120\1\142\1\u0120\1\0\2\142\1\0\2\142\1\0"+
+    "\2\142\4\0\1\145\5\142\2\0\4\142\1\145\1\142"+
+    "\14\0\17\142\2\0\26\142\3\u0121\1\142\1\u0121\1\0"+
+    "\2\142\1\0\1\142\1\144\1\0\2\142\4\0\4\142"+
+    "\1\144\1\142\2\0\6\142\14\0\2\142\1\144\5\142"+
+    "\1\144\6\142\2\0\23\142\3\0\3\u0121\1\0\1\u0121"+
+    "\113\0\2\142\1\150\1\142\2\u0123\1\142\1\u0123\1\0"+
+    "\2\142\1\0\2\142\1\0\2\142\4\0\1\u0124\5\142"+
+    "\2\0\4\142\1\u0124\1\142\14\0\17\142\2\0\25\142"+
+    "\1\u01f7\1\142\2\u0125\2\142\1\0\2\142\1\0\2\142"+
+    "\1\0\2\142\4\0\6\142\2\0\6\142\14\0\17\142"+
+    "\2\0\25\142\1\u01f8\5\u0126\1\0\2\142\1\0\1\142"+
+    "\1\u0126\1\0\2\142\4\0\1\u0124\2\u0126\1\142\2\u0126"+
+    "\2\0\2\142\2\u0126\1\u0124\1\142\14\0\2\142\1\u0126"+
+    "\1\142\1\u0126\3\142\1\u0126\6\142\2\0\2\142\1\u0126"+
+    "\20\142\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u01f9"+
+    "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u01fa\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\5\10\1\u01fb\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u01fc\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\5\10\1\u01fd\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\10\1\u01fe\4\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u01ff"+
+    "\14\0\4\10\1\u0200\12\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\4\10\1\u0201\1\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\3\10\1\u0202\13\10\2\0\1\7"+
+    "\22\10\10\u0131\1\u0203\10\u0131\1\0\104\u0131\5\u0204\1\u0203"+
+    "\4\u0131\1\u0204\3\u0131\1\0\4\u0131\2\u0204\1\u0131\2\u0204"+
+    "\4\u0131\2\u0204\20\u0131\1\u0204\1\u0131\1\u0204\3\u0131\1\u0204"+
+    "\12\u0131\1\u0204\20\u0131\4\0\2\165\1\0\2\165\1\u0205"+
+    "\4\165\11\0\1\165\5\0\2\165\64\0\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\u0206\1\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+    "\1\274\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u0207"+
+    "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\5\10\1\u0155\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u0208\2\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\3\10\1\u0209\2\10\14\0\2\10\1\u020a"+
+    "\14\10\2\0\1\7\22\10\23\0\1\u020b\77\0\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\13\10\1\u0135"+
+    "\3\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u020c\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u020d"+
+    "\3\10\14\0\16\10\1\u020e\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u020f\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\1\10\1\u0210\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\4\10\1\u0211\1\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\2\10\1\u0212"+
+    "\17\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u0213"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\u0214\2\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u0215\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0216\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\5\10\1\u0217\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u0218"+
+    "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\7\10\1\u0219\7\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\u021a\1\10\1\u021b\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\7\10\1\u021c\7\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u021d\15\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u021e\3\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u021f\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u0220\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u0221"+
+    "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\1\u0222\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u0223"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\u0224\1\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\274"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u0225\15\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\5\10\1\274\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u0226\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\u0227\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\3\10\1\u0228\13\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\7\10\1\274\7\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\u0229"+
+    "\16\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\274\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u022a"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\240\4\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\u022b\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\1\10\1\207"+
+    "\15\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u022c\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\14\10\1\u022d\2\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\2\10\1\u022e\17\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\13\10\1\u0216\3\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\175\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\6\10\1\u022f\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u0230"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\10\10\1\u0231\11\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\10\1\u0208\4\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+    "\1\u0232\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\6\10\1\u0218\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u017a"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\4\10\1\u0233\12\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\14\10\1\u0234\5\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\3\10"+
+    "\1\u0135\13\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\3\10\1\u0235\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\2\10\1\u0236\3\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\4\10\1\u0230\1\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\1\10\1\u0218"+
+    "\20\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0237\5\10"+
+    "\14\0\3\10\1\u0238\13\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u0239\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\12\10"+
+    "\1\u023a\4\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\16\10\1\u023b\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\4\10\1\u023c\12\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\5\10\1\u0159\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\u0216\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u023d\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u0182\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u023e\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u023f\5\10\14\0\3\10\1\u0182\13\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\1\10\1\u0240\15\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0241\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\u0242\4\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+    "\1\u0243\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u0244\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u0245\1\10\14\0\1\10\1\u022c\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+    "\1\u0246\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u0247"+
+    "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\4\10\1\u0248\1\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\u0249\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u0135\1\u024a\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\2\10\1\u024b\3\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u024c\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u015f\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\u0135"+
+    "\16\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u024d\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\2\10\1\274\14\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\1\10\1\u0218\6\10\1\u024e\3\10\1\u024f\5\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u0250\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u0251\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\2\10\1\u0252\14\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\10\1\u0253\15\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\2\10\1\u0254\14\10"+
+    "\2\0\1\7\22\10\10\7\1\0\1\u0255\1\7\1\0"+
+    "\2\7\1\0\2\7\4\0\6\7\2\0\6\7\14\0"+
+    "\17\7\2\0\24\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\1\10\1\u0256\15\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u0257\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u0258\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u0259\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u025a\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u025b"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u025c\3\10\14\0\6\10"+
+    "\1\u025d\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\4\10\1\u025e\12\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\6\10\1\u025f\3\10\1\u0260\4\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\u0261\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\u0262"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\10\1\u0218\4\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u0263\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\u0264\1\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\3\10\1\u0265\13\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\4\10\1\u0266\12\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\u0267\5\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+    "\1\u0268\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u0269\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u026a\3\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u026b\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\u026c\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+    "\1\u026d\15\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\3\10\1\u026e\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\u026f\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\10\1\u0270\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0271\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\1\u0272\1\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\221"+
+    "\4\10\14\0\5\10\1\u0273\11\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0274\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u0275\3\10\14\0\1\10\1\u0276"+
+    "\15\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\10\10\1\u0277"+
+    "\11\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u0278"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u0279\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\u027a\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u027b\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\u027c\1\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\10\10\1\u027d\6\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\10\10\1\u0135\6\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\u027e\16\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\1\0\1\u027f"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\5\10\1\u0280\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+    "\1\u0281\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\2\10\1\u0282\3\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u0283\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\6\10\1\u0284\10\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\4\10\1\u0285\1\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\1\10\1\u0286\1\u0287"+
+    "\17\10\1\7\7\10\1\0\1\u0288\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\3\10\1\u0289\13\10\2\0\1\7"+
+    "\12\10\1\u028a\7\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u028b\3\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u028c\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\6\10\1\u028d\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\1\u028e\16\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\3\10\1\u028f\1\u0290"+
+    "\12\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\1\u0291\1\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\10\1\u0292\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\16\10\1\u0293\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u0294\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\13\10\1\u0295\3\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+    "\1\u0296\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u014f\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\2\10\1\u0135\14\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\u0297\5\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u0298"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\16\10\1\u0299\2\0"+
+    "\1\7\22\10\56\0\1\u029a\103\0\1\u01d7\145\0\1\u029b"+
+    "\74\0\1\u029c\144\0\1\u029d\103\0\1\u01db\145\0\1\u029e"+
+    "\74\0\1\u029f\153\0\1\u02a0\115\0\1\u02a1\122\0\1\u02a2"+
+    "\56\0\1\u02a3\146\0\1\u02a4\117\0\1\u02a5\123\0\1\u02a6"+
+    "\145\0\1\u02a7\76\0\1\u02a8\125\0\1\u02a9\22\0\1\u02aa"+
+    "\74\0\1\u02ab\123\0\1\u02ac\1\u02ad\77\0\1\u02ae\150\0"+
+    "\1\u02af\142\0\1\u02b0\76\0\1\u02b1\121\0\1\u02b2\122\0"+
+    "\1\u02b3\23\0\1\u02b4\77\0\1\u02b5\75\0\1\u02b6\111\0"+
+    "\77\u01f4\1\u02b7\23\u01f4\3\7\5\u02b8\1\0\2\7\1\0"+
+    "\1\7\1\u02b8\1\0\2\7\4\0\1\7\2\u02b8\1\7"+
+    "\2\u02b8\2\0\2\7\2\u02b8\2\7\14\0\2\7\1\u02b8"+
+    "\1\7\1\u02b8\3\7\1\u02b8\6\7\2\0\2\7\1\u02b8"+
+    "\20\7\2\142\1\u01f8\5\u0126\1\0\2\142\1\0\1\142"+
+    "\1\u0126\1\0\2\142\4\0\1\142\2\u0126\1\142\2\u0126"+
+    "\2\0\2\142\2\u0126\2\142\14\0\2\142\1\u0126\1\142"+
+    "\1\u0126\3\142\1\u0126\6\142\2\0\2\142\1\u0126\20\142"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u02b9\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\1\u02ba\1\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u02bb"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u02bc\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+    "\1\u0250\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\5\10\1\u02bd\1\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u02be"+
+    "\2\10\14\0\17\10\2\0\1\7\1\10\1\u02bf\1\u02c0"+
+    "\17\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\10\1\u024b\15\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\u02c1\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u02c2"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\u01b0\2\10\14\0\6\10"+
+    "\1\u02c3\10\10\2\0\1\7\22\10\3\u0131\5\u02c4\1\u0203"+
+    "\4\u0131\1\u02c4\3\u0131\1\0\4\u0131\2\u02c4\1\u0131\2\u02c4"+
+    "\4\u0131\2\u02c4\20\u0131\1\u02c4\1\u0131\1\u02c4\3\u0131\1\u02c4"+
+    "\12\u0131\1\u02c4\20\u0131\3\0\5\u02c5\5\0\1\u02c5\10\0"+
+    "\2\u02c5\1\0\2\u02c5\4\0\2\u02c5\20\0\1\u02c5\1\0"+
+    "\1\u02c5\3\0\1\u02c5\12\0\1\u02c5\20\0\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\13\10\1\274\3\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\12\10\1\u015f\4\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u0216\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\4\10\1\u02c6\1\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\1\u02c7\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\1\10\1\u02c8\2\10\1\u02c9"+
+    "\15\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u02ca"+
+    "\1\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\11\10\1\u02cb\10\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u02cc\1\u02cd\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\15\10\1\u02ce\1\10\2\0\1\7\4\10\1\u02cf\15\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u02d0\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u02d1\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+    "\1\u0218\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\1\10\1\u02d2\20\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\16\10\1\274\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u02d3\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\u0250\16\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0135\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\3\10\1\u02d4\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+    "\1\u02d5\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u02d6\1\10\1\0"+
+    "\1\7\1\10\4\0\4\10\1\u02d7\1\10\2\0\6\10"+
+    "\14\0\10\10\1\u02d8\4\10\1\u02d9\1\10\2\0\1\7"+
+    "\4\10\1\u02da\4\10\1\u02db\1\u02dc\1\10\1\u02dd\2\10"+
+    "\1\u02de\2\10\1\7\5\10\1\u02df\1\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u02e0\3\10\14\0\17\10\2\0\1\7"+
+    "\2\10\1\u0212\5\10\1\u02e1\11\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\u0135\4\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\u02e2\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\3\10\1\u02e3"+
+    "\13\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\14\10\1\u02e4\2\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u02e5\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\5\10\1\u0273\11\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\5\10"+
+    "\1\u02e6\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\11\10\1\u02e7\5\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\10\1\u02e8\4\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u02e9\4\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\10\1\u02ea\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\17\10\1\u02eb\2\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u02ec\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\10\1\u02ed\4\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0157\4\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\3\10\1\u0249\13\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\1\u02ee\16\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\4\10\1\u02ef\12\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\6\10\1\u02f0\10\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\301\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\1\u02f1\1\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\u02f2\16\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\u02f3\4\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\u02f4\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\4\10\1\u0149\1\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+    "\1\u02f5\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u02f6\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u02f7\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u02f8\2\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\3\10\1\u02f9\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\1\274\16\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\6\10\1\u02fa\10\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\10\1\u02fb\4\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u02fc\2\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\16\10\1\u02fd\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\4\10\1\u0218\12\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\u01d2\2\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\5\10\1\u0249\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u02fe\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u02ff\3\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\5\10\1\u0300\1\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\1\274\1\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\6\10\1\u0301\10\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u0135\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\4\10\1\u0302\5\10"+
+    "\1\u0303\7\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+    "\1\u0249\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u0304"+
+    "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\310\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0305\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\u0306\4\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+    "\1\u018c\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u0307"+
+    "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u021d\1\u018c\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\u0308\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\10\1\u0309\15\10\2\0"+
+    "\1\7\22\10\3\7\5\u030a\1\0\2\7\1\0\1\7"+
+    "\1\u030a\1\0\2\7\4\0\1\7\2\u030a\1\7\2\u030a"+
+    "\2\0\2\7\2\u030a\2\7\14\0\2\7\1\u030a\1\7"+
+    "\1\u030a\3\7\1\u030a\6\7\2\0\2\7\1\u030a\21\7"+
+    "\5\10\1\u030b\1\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\10\1\u030c\4\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\14\10\1\u030d\2\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\u030e\16\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\u030f\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u0310\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u0311\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\u0312\1\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\4\10\1\u0313\12\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\16\10\1\u0314\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+    "\1\u0315\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u0316"+
+    "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\10\1\u0317\4\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u0318"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u0319\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\1\u031a\1\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\4\10\1\u031b\1\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\4\10"+
+    "\1\u031c\1\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u031d"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\u031e\4\10\14\0\13\10"+
+    "\1\u031a\3\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\3\10\1\u031f\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\u0320\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\5\10\1\u0321"+
+    "\11\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u0322\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\7\10"+
+    "\1\u0323\7\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\4\10\1\u0324\1\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+    "\1\u0325\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\1\10\1\u0326"+
+    "\15\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\13\10\1\u0327\3\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0328\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\4\10\1\u0329\12\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\2\10\1\u0212\5\10\1\u02e1"+
+    "\11\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u032a"+
+    "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\11\10\1\u0250\5\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u032b\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u032c\4\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\u032d\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\11\10\1\u032e\10\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\3\10\1\u032f\13\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u0330\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\1\10\1\u0331\15\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u0332"+
+    "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\u0250\5\10\14\0\17\10\2\0"+
+    "\1\7\2\10\1\u0212\5\10\1\u02e1\11\10\32\0\1\u0333"+
+    "\70\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\6\10\1\u0334\10\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\14\10\1\u0335\5\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u0336\3\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u0337\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\13\10\1\u0338\3\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u0339"+
+    "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\4\10\1\u033a\12\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u033b\3\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+    "\1\u033c\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\u033d\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\10\1\u033e"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\10\1\u033f\4\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\4\10\1\u0340\12\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u0341\15\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\2\10\1\u0342"+
+    "\3\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0343\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u0344\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u0345"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\u0346\4\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u0347\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\2\10"+
+    "\1\u0348\14\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\10\1\u0349\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\10\1\u034a\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\u034b\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u034c"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\7\10\1\u034d\12\10\23\0\1\u034e\141\0\1\u01d7\13\0"+
+    "\1\u029a\45\0\1\u029c\1\u034f\5\u029c\1\u034f\1\u029c\2\0"+
+    "\2\u029c\1\0\1\u034f\1\u029c\2\0\1\u029c\1\u034f\6\u029c"+
+    "\2\u034f\6\u029c\4\u034f\1\0\1\u034f\2\0\4\u034f\17\u029c"+
+    "\2\0\1\u034f\22\u029c\23\0\1\u0350\141\0\1\u01db\13\0"+
+    "\1\u029d\45\0\1\u029f\1\u0351\5\u029f\1\u0351\1\u029f\2\0"+
+    "\2\u029f\1\0\1\u0351\1\u029f\2\0\1\u029f\1\u0351\6\u029f"+
+    "\2\u0351\6\u029f\4\u0351\1\0\1\u0351\2\0\4\u0351\17\u029f"+
+    "\2\0\1\u0351\22\u029f\14\0\1\u0352\20\0\1\u0353\150\0"+
+    "\1\u0354\120\0\1\u0355\120\0\1\u0356\104\0\1\u0357\141\0"+
+    "\1\u0358\101\0\1\u0359\20\0\1\u035a\122\0\1\u02ad\53\0"+
+    "\1\u035b\177\0\1\u035c\73\0\1\u035d\1\0\1\u035e\140\0"+
+    "\1\u035f\130\0\1\u0360\120\0\1\u0361\117\0\1\u0362\100\0"+
+    "\1\u0363\124\0\1\u0364\121\0\1\u0365\122\0\1\u0366\122\0"+
+    "\1\u0367\125\0\1\u0368\63\0\5\u0369\5\0\1\u0369\10\0"+
+    "\2\u0369\1\0\2\u0369\4\0\2\u0369\20\0\1\u0369\1\0"+
+    "\1\u0369\3\0\1\u0369\12\0\1\u0369\20\0\3\7\5\u036a"+
+    "\1\0\2\7\1\0\1\7\1\u036a\1\0\2\7\4\0"+
+    "\1\7\2\u036a\1\7\2\u036a\2\0\2\7\2\u036a\2\7"+
+    "\14\0\2\7\1\u036a\1\7\1\u036a\3\7\1\u036a\6\7"+
+    "\2\0\2\7\1\u036a\21\7\7\10\1\0\1\10\1\141"+
+    "\1\0\1\u036b\1\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\2\10\1\u036c"+
+    "\14\10\2\0\1\7\22\10\1\7\5\10\1\u036d\1\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\1\u036e\3\10\1\u036f\1\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\11\10\1\u02db\10\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\u018c\2\10\14\0\17\10"+
+    "\2\0\1\7\11\10\1\u0370\10\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\10\1\u0371\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\4\10\1\u0372\12\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\10\1\u0373\4\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u0374\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u0375"+
+    "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\4\10\1\u0376\12\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u031a\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\3\u0131\5\u0377\1\u0203\4\u0131\1\u0377\3\u0131\1\0\4\u0131"+
+    "\2\u0377\1\u0131\2\u0377\4\u0131\2\u0377\20\u0131\1\u0377\1\u0131"+
+    "\1\u0377\3\u0131\1\u0377\12\u0131\1\u0377\20\u0131\3\0\5\u0378"+
+    "\5\0\1\u0378\10\0\2\u0378\1\0\2\u0378\4\0\2\u0378"+
+    "\20\0\1\u0378\1\0\1\u0378\3\0\1\u0378\12\0\1\u0378"+
+    "\20\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u0379"+
+    "\1\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\u037a\2\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u037b\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\u037c\1\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u037d\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\u037e\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\2\10\1\u037f\14\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\13\10\1\u0380\3\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u0381\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\u0382\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\10\1\u01cf\4\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u0383\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u0384"+
+    "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\u0385\2\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\u0386\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\10\1\u0348\4\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u0387\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\6\10\1\u0388\10\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u0389\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u038a\3\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\u038b\1\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\1\10\1\u038c\15\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\u038d\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u038e\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u038f"+
+    "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u0390\15\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\10\1\u0391\4\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u0172\2\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\1\u0392\1\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0393\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\2\10"+
+    "\1\u0394\17\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\1\u0395\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\12\10\1\u0396\7\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+    "\1\u0397\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\6\10\1\u0398\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\u0399\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\u039a\1\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\6\10\1\u039b\10\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\2\10\1\u0159"+
+    "\14\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u039c\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\u039d\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u039e\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+    "\1\274\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u039f\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u03a0"+
+    "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u03a1\15\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u0157\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+    "\1\u03a2\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\u03a3\4\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\10\1\u0135\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u0383\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u015f\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\13\10\1\u015f\3\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u03a4"+
+    "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\1\10\1\u03a5\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u03a6"+
+    "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u03a7\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\6\10\1\u03a8\10\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\7\10\1\u03a9"+
+    "\7\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\4\10\1\u03aa\1\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\4\10\1\u03ab\12\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\u03ac\1\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\u03ad\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\10\1\u03ae\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u03af"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u03b0\15\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\7\10\1\u03b1\7\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u03b2\4\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\7\10\1\u03b3\7\10\2\0"+
+    "\1\7\22\10\3\7\5\u03b4\1\0\2\7\1\0\1\7"+
+    "\1\u03b4\1\0\2\7\4\0\1\7\2\u03b4\1\7\2\u03b4"+
+    "\2\0\2\7\2\u03b4\2\7\14\0\2\7\1\u03b4\1\7"+
+    "\1\u03b4\3\7\1\u03b4\6\7\2\0\2\7\1\u03b4\21\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\4\10\1\u03b5\1\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u03b6\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\1\u03b7\5\10\2\0\5\10"+
+    "\1\u0135\14\0\10\10\1\u03b8\6\10\2\0\1\7\2\10"+
+    "\1\u03b9\1\10\1\u03ba\15\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\7\10\1\u03bb\7\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u03bc\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\2\10\1\u0250\14\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\7\10\1\u03bd\7\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\13\10\1\u03be"+
+    "\3\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u03bf\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\5\10\1\u03c0\4\10\1\u03c1\7\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\4\10\1\u03c2\1\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\4\10\1\u03c3\12\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\6\10\1\u03c4\10\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\u03c5\1\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\2\10\1\u0274\14\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u021d\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u03c6\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u03c7"+
+    "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\7\10\1\u0135\7\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\1\u03c8\1\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\10\1\u03c9\4\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u03ca"+
+    "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\6\10\1\u03cb\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\12\10\1\u03cc\7\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\2\10\1\u03cd\5\10\1\u03ce\11\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\3\10\1\u03cf\13\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\6\10\1\u03d0\10\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\2\10\1\u024b\3\10\2\0\1\u014f"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\u03d1\4\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u03d2\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+    "\1\u03d3\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u03d4\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\2\10\1\u03d5\14\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u03d6\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\5\10\1\u03d7\14\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+    "\1\u03d8\15\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\10\1\u03d9\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\3\10\1\u03da\13\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u03db"+
+    "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\11\10\1\u03dc\5\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u03dd\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\14\0\1\u03de\106\0"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\u03df\1\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\1\10\1\u03e0\15\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u03e1"+
+    "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\6\10\1\u03e2\10\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u03e3\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\5\10\1\u03e4\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u03e5\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u03e6\4\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\u03e7\16\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u03e8\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\10\10"+
+    "\1\u03e9\11\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\12\10\1\u0252\4\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u03ea\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\1\u03eb\1\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\3\10\1\u03ec\2\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\10\1\u03ed\4\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u03ee"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\2\10"+
+    "\1\u03ef\14\10\1\u02de\2\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\6\10\1\u03f0\10\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\13\10\1\u0249\3\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\15\10\1\u02d9\1\10"+
+    "\2\0\1\7\4\10\1\u02da\5\10\1\u02dc\4\10\1\u02de"+
+    "\2\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u03f1"+
+    "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\14\10\1\u03f2\2\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u03f3\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0135\4\10"+
+    "\14\0\17\10\2\0\1\7\1\10\1\u03f4\20\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\3\10\1\u03f5\2\10\14\0"+
+    "\17\10\2\0\1\7\22\10\23\0\1\u029c\122\0\1\u029f"+
+    "\174\0\1\u03f6\64\0\1\u03f7\157\0\1\u03f8\65\0\1\u03f6"+
+    "\122\0\1\u03f9\74\0\1\u0355\147\0\1\u03fa\124\0\1\u03fb"+
+    "\152\0\1\u03fc\70\0\1\u03fd\146\0\1\u03fe\122\0\1\u03ff"+
+    "\51\0\1\u0400\171\0\1\u0401\102\0\1\u0402\121\0\1\u02ad"+
+    "\124\0\1\u0403\120\0\1\u0404\151\0\1\u02ad\126\0\1\u0405"+
+    "\66\0\1\u0406\150\0\1\u02ad\123\0\1\u0407\40\0\5\u0408"+
+    "\5\0\1\u0408\10\0\2\u0408\1\0\2\u0408\4\0\2\u0408"+
+    "\20\0\1\u0408\1\0\1\u0408\3\0\1\u0408\12\0\1\u0408"+
+    "\20\0\3\7\5\10\1\0\2\7\1\0\1\7\1\10"+
+    "\1\0\2\7\4\0\1\7\2\10\1\7\2\10\2\0"+
+    "\2\7\2\10\2\7\14\0\2\7\1\10\1\7\1\10"+
+    "\3\7\1\10\6\7\2\0\2\7\1\10\21\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\4\10\1\240\12\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u021d\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u0409\2\10"+
+    "\14\0\6\10\1\u040a\10\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\1\10\1\u038a"+
+    "\15\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\1\10\1\u040b\15\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\10\1\u040c\15\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\u040d\1\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u040e"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\u040f\4\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\3\10\1\u0410\16\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0411\4\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u0412\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\3\u0131\5\162\1\u0203\4\u0131\1\162\3\u0131\1\0"+
+    "\4\u0131\2\162\1\u0131\2\162\4\u0131\2\162\20\u0131\1\162"+
+    "\1\u0131\1\162\3\u0131\1\162\12\u0131\1\162\20\u0131\3\0"+
+    "\5\u0413\5\0\1\u0413\10\0\2\u0413\1\0\2\u0413\4\0"+
+    "\2\u0413\20\0\1\u0413\1\0\1\u0413\3\0\1\u0413\12\0"+
+    "\1\u0413\20\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\14\10\1\274\2\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\5\10\1\u0414\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u0135\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\2\10"+
+    "\1\u0415\14\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\1\0\1\u0416\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\7\10\1\u0417\7\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\1\u03b7\5\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\7\10\1\u0418\12\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u03f2\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u0419"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\1\u0135\1\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u041a"+
+    "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\u0216\1\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\4\10\1\u041b\1\10"+
+    "\2\0\1\u041c\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\7\10"+
+    "\1\u041d\7\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\4\10\1\u041e\1\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\5\10"+
+    "\1\u041f\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\u0420\2\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\3\10\1\u0421\13\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u0422\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u038b\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0423\4\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\6\10\1\u041e\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\u0424\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\u0425\2\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u0426\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+    "\1\u0427\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u0428\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\6\10\1\u0429\10\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\2\10\1\u042a\3\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u042b\3\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\u013f\1\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\2\10\1\u042c\14\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u042d\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\4\10\1\u0157\12\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u042e"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\10\1\u042f\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\10\1\u0135\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u0430\15\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\3\10\1\u0431\13\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u0432\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u0379\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\u015f\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u0433\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+    "\1\u0434\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\10\10"+
+    "\1\u0435\11\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\240"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u0436\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u0437\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u0438\2\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\3\10\1\u0439\13\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u03ac"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\u043a\1\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+    "\1\u043b\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\3\10\1\u043c"+
+    "\13\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u043d\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\4\10\1\u043e\12\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\1\10\1\u043f\20\10\3\7\5\u0440\1\0\2\7\1\0"+
+    "\1\7\1\u0440\1\0\2\7\4\0\1\7\2\u0440\1\7"+
+    "\2\u0440\2\0\2\7\2\u0440\2\7\14\0\2\7\1\u0440"+
+    "\1\7\1\u0440\3\7\1\u0440\6\7\2\0\2\7\1\u0440"+
+    "\21\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+    "\1\u0441\15\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\4\10\1\u0442\12\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\6\10\1\u0443\10\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\304\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u0444\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\u0445\1\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u0446\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\6\10\1\u0447\10\10\2\0\1\7\22\10\1\7\5\10"+
+    "\1\u0448\1\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\5\10\1\u0449\14\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\1\10\1\u044a\4\10\2\0\6\10\14\0\15\10\1\u02d9"+
+    "\1\10\2\0\1\7\4\10\1\u03ba\1\u0449\11\10\1\u02de"+
+    "\2\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\10\10\1\u044b\11\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\u044c\4\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\12\10\1\u044d\4\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+    "\1\u044e\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u044f\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u0450"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\4\10\1\u0451\12\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\5\10\1\u0452\14\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+    "\1\u0453\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\3\10\1\u0454\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\u0455\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u0456\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0457\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\u0458\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u0459\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\6\10\1\u045a\10\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u045b"+
+    "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\2\10\1\u045c\14\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\7\10\1\u045d\7\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\4\10\1\u045e\1\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u045f\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\3\10\1\u0425\13\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\1\u0460\5\10\1\0\1\u0461\6\10\14\0\10\10"+
+    "\1\u0462\6\10\2\0\1\7\15\10\1\u0463\4\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\14\10\1\u0464"+
+    "\2\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u0465\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u0249"+
+    "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u0466\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\10\1\u0467\15\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\5\10\1\u0468\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\u0469\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\u046a\2\10\14\0\17\10"+
+    "\2\0\1\7\22\10\35\0\1\u046b\65\0\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\13\10\1\u046c\3\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\6\10\1\u046d\10\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\4\10\1\u046e\1\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\12\10\1\u046f\4\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\2\10\1\u0470\3\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\5\10\1\u0471\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\6\10\1\u0472\10\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+    "\1\u0473\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\4\10\1\u0474\1\u0475\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\10\10\1\u0476\11\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\2\10\1\u0477"+
+    "\17\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u0478"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\5\10\1\u0135\14\0\17\10\2\0"+
+    "\1\7\2\10\1\u0479\1\10\1\u047a\5\10\1\u047b\7\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u047c\2\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\4\10\1\u047d\12\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u047e"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\5\10\1\u047f\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u0480"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\u0481\5\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\6\10\1\u0482\10\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\1\u0483\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u0484\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\2\10\1\u0485\3\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\5\10\1\u0486\14\0\17\10\2\0\1\7"+
+    "\22\10\77\u03f6\1\u02ad\23\u03f6\36\0\1\u0487\144\0\1\u0488"+
+    "\100\0\1\u0489\151\0\1\u048a\116\0\1\u048b\103\0\1\u02ad"+
+    "\74\0\1\u02ad\147\0\1\u0361\116\0\1\u0368\146\0\1\u0361"+
+    "\77\0\1\u02ad\125\0\1\u048c\120\0\1\u048d\146\0\1\u048e"+
+    "\117\0\1\u048f\56\0\1\u048a\166\0\1\u03fd\45\0\5\u0490"+
+    "\5\0\1\u0490\10\0\2\u0490\1\0\2\u0490\4\0\2\u0490"+
+    "\20\0\1\u0490\1\0\1\u0490\3\0\1\u0490\12\0\1\u0490"+
+    "\20\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u0491"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\u0492\4\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\u0493\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u0494\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\12\10\1\u0495\4\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0496\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\3\10\1\u0497\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\u0498\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u0499\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\6\10\1\u049a\10\10\2\0\1\7\22\10\3\0"+
+    "\5\165\5\0\1\165\10\0\2\165\1\0\2\165\4\0"+
+    "\2\165\20\0\1\165\1\0\1\165\3\0\1\165\12\0"+
+    "\1\165\20\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u049b"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u049c\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\6\0\1\u049d\17\0\1\u049e\74\0"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\2\10\1\u049f\3\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\3\10\1\u04a0\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\1\10\1\u04a1\15\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\3\10\1\u04a2\2\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\4\10\1\u04a3\1\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u04a4"+
+    "\1\u04a5\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u04a6\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u031a\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+    "\1\u04a7\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\2\10\1\u031a\14\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\u04a8\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\4\10\1\u04a9\1\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\7\10\1\u04aa\7\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\5\10\1\u04ab\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\u04ac\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\4\10\1\u04ad\1\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\1\10\1\u04ae\15\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u04af"+
+    "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\5\10\1\u04b0\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\13\10\1\u0182\6\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u0157\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\5\10\1\u04b1\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\1\u04b2\16\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\2\10\1\u04b3\14\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\3\10"+
+    "\1\274\13\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\1\u04b4\1\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u04b5"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u0191\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\4\10\1\u015f\12\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u04b6\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u04b7\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\u04b8\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\5\10\1\u04b9\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u04ba"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\u04bb\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u0161"+
+    "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\5\10"+
+    "\1\u0300\1\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\14\10\1\u04bc\5\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u04bd\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\1\u0222\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\14\10\1\u02dd\5\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u04be\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\4\10\1\u04bf\12\10\2\0"+
+    "\1\7\22\10\3\7\5\320\1\0\2\7\1\0\1\7"+
+    "\1\320\1\0\2\7\4\0\1\7\2\320\1\7\2\320"+
+    "\2\0\2\7\2\320\2\7\14\0\2\7\1\320\1\7"+
+    "\1\320\3\7\1\320\6\7\2\0\2\7\1\320\21\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\5\10\1\u01fd\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\u04c0\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\5\10\1\u0218\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\1\10\1\u04c1\15\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\2\10"+
+    "\1\u01ac\14\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u04c2\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\10\1\u04c3\15\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u04c4\15\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\1\10\1\u04c5\15\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\u04c6\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\311\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u04c7\2\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u04c8\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\1\u04c9\21\10\1\7\5\10"+
+    "\1\u04ca\1\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\1\u036e\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\14\10\1\u04cb\2\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u04cc"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\6\10\1\u04cd\10\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u04ce\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\4\10\1\u03f2\1\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\3\10\1\u04cf\13\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\6\10\1\u04d0\10\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\3\10\1\u04d1\2\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u04d2\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u04d3\4\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\5\10\1\u04d4\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u04d5\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\5\10\1\u04d6"+
+    "\1\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\12\10\1\u04d7\1\10\1\u04d8\5\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u04d9\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\4\10\1\u04da"+
+    "\1\10\2\0\6\10\14\0\17\10\2\0\1\7\1\10"+
+    "\1\u04db\1\u04dc\2\10\1\u04dd\2\10\1\u04de\11\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\14\10\1\u0299"+
+    "\2\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\1\10\1\u04df\15\10\2\0\1\7"+
+    "\22\10\103\0\1\u04e0\3\0\1\u04e1\13\0\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u044b\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\10\1\u04e2\4\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\1\u04e3\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\5\10\1\u04e4\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\14\10\1\u04e5\5\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\u04e6\4\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\10\1\u04e7\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\4\10\1\u04e8\1\u0483\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\36\0\1\u04e9\64\0\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\4\10\1\u04ea\1\10\2\0\6\10\14\0\15\10"+
+    "\1\u04eb\1\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\1\u04ec\1\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\10\1\u04ed\15\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u04ee\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u01b4\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\10\10"+
+    "\1\u04ef\6\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\12\10\1\u04f0\4\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+    "\1\u04f1\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u04f2"+
+    "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\4\10\1\u04f3\1\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u04f4"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\u04f5\5\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\7\10\1\u04f6\7\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u04f7\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\1\u04f8\1\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\u04f9\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+    "\1\u04fa\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\16\10\1\u04fb"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\6\10\1\u04fc\5\10\1\u04fd\2\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\1\10\1\u04fe\4\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\10\1\u04ff\4\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\14\10\1\u0500\2\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u0501"+
+    "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\221\4\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\10\10\1\u0502\11\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+    "\1\u0503\15\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\u0504\16\10\2\0\1\7"+
+    "\22\10\40\0\1\u0505\142\0\1\u0506\127\0\1\u0507\75\0"+
+    "\1\u0508\124\0\1\u0509\111\0\1\u050a\35\0\1\u050b\70\0"+
+    "\1\u0361\125\0\1\u050c\120\0\1\u050d\67\0\5\u011a\5\0"+
+    "\1\u011a\10\0\2\u011a\1\0\2\u011a\4\0\2\u011a\20\0"+
+    "\1\u011a\1\0\1\u011a\3\0\1\u011a\12\0\1\u011a\20\0"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u0154\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\4\10\1\u050e\12\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\7\10\1\u050f\7\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\2\10\1\u0510\17\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u0511\3\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0512\4\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\14\10\1\u0513\2\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+    "\1\u0514\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u0515\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\1\10\1\u0516\15\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\4\10\1\u0517\15\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\5\10\1\u0518\11\10\2\0"+
+    "\1\7\22\10\40\0\1\u0519\73\0\1\u051a\111\0\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u051b\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\5\10\1\u051c\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\u051d\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\14\10\1\u051e\2\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u051f\2\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\u0520\4\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\2\10\1\u0521\3\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\4\10\1\u02d7\1\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\10\1\u0522\4\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0523\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\10\1\u0524\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\6\10\1\u0525\10\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u0526\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\6\10\1\u0527\10\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+    "\1\u0528\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\1\u0529\1\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\4\10\1\u052a\12\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\u052b\5\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\5\10\1\u052c\14\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\4\10\1\u052d\15\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\1\10\1\u052e\15\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\6\10\1\u052f\10\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\u03a8\4\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\1\10\1\u0530\15\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u0531\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\u0159\5\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\5\10\1\u0135\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u0532\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0533\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\u0534\4\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\u0535\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\1\10\1\u0536\4\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\4\10\1\u0537\12\10\2\0\1\7"+
+    "\22\10\1\7\5\10\1\u0538\1\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\1\u03b7\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\2\10\1\u0539"+
+    "\5\10\1\u053a\7\10\1\105\1\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\u04f0\4\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\6\10\1\u053b\10\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u03f2\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\10\1\u053c\4\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\16\10"+
+    "\1\u053d\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\1\10\1\u053e\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\6\10\1\u053f\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\4\10\1\u0540\12\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\10\1\u0541\4\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u0542\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\10\1\u0543\15\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\1\u0222\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\10\10\1\u0544\11\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\4\10\1\u02da"+
+    "\15\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\7\10\1\u0545\7\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u0546\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\u0547\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\3\10\1\u0548\2\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\2\10"+
+    "\1\u0549\3\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\12\10\1\u054a\7\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u054b\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\7\10\1\u054c\7\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+    "\1\u054d\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\4\10\1\u054e\1\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\2\10\1\u054f\3\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\10\1\u0550\4\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\2\10\1\u0551\14\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\10\1\u0552\15\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\u0553\4\10\14\0\4\10"+
+    "\1\u0554\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u0555\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\u0556\16\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\10\1\u0557\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\4\10\1\u0558\12\10\2\0\1\7\22\10\35\0"+
+    "\1\u0559\101\0\1\u055a\106\0\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\1\10\1\u055b\15\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\6\10\1\u055c\10\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\16\10\1\u0135\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\u055d\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u055e\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\6\10\1\u055f\10\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+    "\1\u0560\15\10\2\0\1\7\22\10\73\0\1\u0561\27\0"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+    "\1\u0562\15\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u0563\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u0564"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\u0565\4\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\1\10\1\u0566\20\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0567\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u0154\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+    "\1\u0568\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u0569\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u056a\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u056b\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\u056c\4\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\1\10\1\u056d\15\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\10\1\u056e\4\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\3\10\1\u056f\13\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0570\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\10\10\1\u0571\6\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\15\10\1\u02d9\1\10\2\0\1\7\4\10\1\u02da"+
+    "\15\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u04b9"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\15\10\1\u02ce\1\10"+
+    "\2\0\1\7\14\10\1\u02dd\5\10\1\7\7\10\1\0"+
+    "\1\u0572\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0573\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\20\10"+
+    "\1\105\1\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\u0574\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\u0575\2\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\10\1\u0576\4\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\10\10\1\u02e1\11\10\41\0\1\u03f6\116\0"+
+    "\1\u03f6\122\0\1\u0577\126\0\1\u02ad\121\0\1\u0578\147\0"+
+    "\1\u0579\75\0\1\u057a\117\0\1\u057b\160\0\1\u02ad\27\0"+
+    "\1\7\7\10\1\0\1\u057c\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u057d\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\u057e\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\10\1\u057f\4\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\1\0\1\u0580\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\15\10\1\u02d9\1\10\2\0\1\7"+
+    "\17\10\1\u02de\2\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\1\u0581\1\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u0582\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\1\u0583\1\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u0584\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\12\10\1\u039f\3\10"+
+    "\1\u0585\3\10\35\0\1\u0586\152\0\1\u0587\35\0\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\10\1\u04fb\4\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\1\u0274\16\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0588\4\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\4\10"+
+    "\1\u02da\5\10\1\u02dc\7\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\13\10\1\u0589\3\10\2\0\1\7"+
+    "\22\10\1\7\5\10\1\u058a\1\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\1\0"+
+    "\1\u058b\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\4\10\1\u058c\1\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\6\10\1\u058d\10\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\2\10\1\u03ef\17\10\1\7\7\10"+
+    "\1\0\1\u058e\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u058f"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\3\10\1\u0590\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\1\10\1\u0383\15\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\1\u0250\21\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\4\10\1\u0591\15\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\16\10"+
+    "\1\u0154\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u0592\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\10\1\u0135\15\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\u0593\1\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\11\10\1\u0594\5\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\1\u0432\21\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\1\10\1\274\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\1\u0595\16\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\4\10\1\u0596"+
+    "\1\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+    "\1\u0597\15\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u0598\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\u0599\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u059a\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\10\1\u059b\15\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u059c\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u059d\1\u059e\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\4\10\1\u0154\12\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\u059f\4\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u05a0\3\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\10\1\u05a1"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\4\10\1\u0420\1\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u05a2"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\10\1\u05a3\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\2\10\1\u05a4\3\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u05a5\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u05a6\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u05a7\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\2\10\1\u0154\14\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+    "\1\u05a8\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u05a9\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u05aa\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\10\1\u05ab"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u05ac\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u05ad"+
+    "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\2\10\1\u05ae\3\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u05af\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\13\10\1\u05b0\6\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\10\1\u05b1\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\1\u05b2\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\u05b3\4\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\13\10\1\u05b4\3\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+    "\1\u05b5\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\3\10\1\u05b6\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\u05b7\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u05b8\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u037b\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\40\0\1\u05b9\145\0\1\u05ba\37\0\1\7\7\10\1\0"+
+    "\1\u0172\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\5\10\1\u05bb\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u05bc\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u05bd"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u05be\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\10\1\u05bf\4\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u05c0\4\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\5\10\1\u05c1\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u05c2"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\7\10\1\u05c3\7\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\10\1\u05c4\4\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\10\1\u05c5"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\6\10\1\u05c6\10\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u05c7"+
+    "\1\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\7\10\1\u05c8\7\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\1\u05c9\16\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u05ca\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\10\1\u034a\4\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u05cb"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\u05cc\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\3\10\1\u05cd\13\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\u05ce\2\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\6\10\1\u05cf\10\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u031d\2\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\5\10\1\u05d0"+
+    "\1\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\4\10\1\u05d1\12\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u04ce\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\67\0\1\u05d2\50\0\1\u05d3\144\0"+
+    "\1\u05d4\120\0\1\u05d5\124\0\1\u05d6\63\0\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\4\10\1\u05d7\1\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\u03f2\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\3\10\1\u05d8"+
+    "\13\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\5\10\1\u05d9\14\0\17\10\2\0\1\7\22\10"+
+    "\103\0\1\u05da\3\0\1\u05db\13\0\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\4\10\1\u0249\12\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\10\10\1\u05dc\11\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\2\10\1\u05dd"+
+    "\14\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u05de\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\37\0\1\u05df\124\0\1\u05e0\61\0\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\4\10\1\u05e1\12\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\5\10\1\u05e2\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\4\10\1\u05e3\1\10\14\0"+
+    "\17\10\2\0\1\7\22\10\26\0\1\u05e4\74\0\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u05e5\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\3\10\1\u01d2\13\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u0546"+
+    "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\5\10\1\u04ac\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u05e6"+
+    "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\1\u05e7\1\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u05e8"+
+    "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\2\10\1\u05e9\14\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\u05ea\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u01d3\15\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\1\10\1\u05eb\15\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\3\10"+
+    "\1\u05ec\13\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\6\10\1\u04fc\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\u05ed\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\5\10\1\u05ee\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+    "\1\u05ef\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u0135\5\10\14\0\17\10"+
+    "\2\0\1\7\3\10\1\u05f0\16\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u05f1\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\3\10\1\u05f2\13\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\u05f3\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u05f4"+
+    "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u05f5\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\1\u05f6\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\4\10\1\u05f7\1\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u05f8\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\10\1\u05f9"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\1\u05fa\1\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\u032d\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\2\10\1\u05fb\14\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\6\10\1\u05fc\10\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u05fd\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\1\10\1\u05fe"+
+    "\4\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\7\10"+
+    "\1\u05ff\7\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u0600\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u0601"+
+    "\1\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\5\10\1\u0602\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+    "\1\u0603\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\3\10\1\u0604"+
+    "\13\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\1\10\1\u0605\15\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\7\10\1\u0606\7\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\u056a\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u0607"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\u04f0\5\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+    "\1\u0608\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u0609"+
+    "\10\10\2\0\1\7\22\10\35\0\1\u060a\125\0\1\u060b"+
+    "\62\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u060c\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\5\10\1\u05c8\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\2\10\1\u060d\14\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\2\10\1\u060e\14\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\7\10\1\u060f\7\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\7\10"+
+    "\1\u0610\7\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\10\1\u0611\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\u0154\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\3\10\1\u0491\2\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\10\1\u0612\4\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\4\10\1\u0613\1\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\1\u0614\21\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\2\10\1\341\14\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u0615\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\1\10\1\u05c7\15\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u0616"+
+    "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\u0617\2\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\u0618\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\u0619\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u061a"+
+    "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\4\10\1\u061b\1\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\156\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\u061c"+
+    "\16\10\2\0\1\7\22\10\60\0\1\u061d\101\0\1\u061e"+
+    "\124\0\1\u05d6\121\0\1\u02ad\143\0\1\u02ad\41\0\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\3\10\1\u061f\2\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\3\10\1\u0485\13\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\6\10\1\u0620\10\10\2\0\1\7\22\10\11\0\1\u0621"+
+    "\125\0\1\u0622\106\0\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\1\10\1\u0623\15\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0624\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\4\10\1\u0625\1\10\14\0\17\10\2\0"+
+    "\1\7\22\10\72\0\1\u0626\111\0\1\u0627\41\0\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u0628\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\5\10\1\u0629\1\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\10\1\u062a\15\10\2\0\1\7\22\10\65\0\1\u062b"+
+    "\35\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\4\10\1\u062c\1\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\u0279\5\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\4\10\1\u062d\15\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u062e\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u062f\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\7\10\1\u0630\12\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\u0631\4\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u0632\3\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\2\10";
+
+  private static final String ZZ_TRANS_PACKED_1 =
+    "\1\u0633\14\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\5\10\1\u0634\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u0635"+
+    "\1\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\u0636\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\u0637\16\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\1\0\1\u0638\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\3\10\1\u0576\13\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\6\10\1\u0639\10\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\10\1\u063a\4\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\4\10\1\u063b\1\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\1\10\1\u063c\15\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+    "\1\u063d\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u063e"+
+    "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u063f\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\1\u0222\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\4\10\1\u0640\15\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\1\10\1\u0641"+
+    "\15\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\5\10\1\u0642"+
+    "\14\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\10\1\u0643\15\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\15\10\1\u02d9\1\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\4\10\1\u0644\12\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0645\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\5\10\1\u0154\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\4\10\1\u0491\12\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u0646\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\4\10\1\u0647\12\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u0648\2\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\5\10\1\u0649\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u064a"+
+    "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\u064b\5\10\14\0\17\10\2\0"+
+    "\1\7\22\10\37\0\1\u0561\74\0\1\u064c\111\0\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u064d\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\5\10\1\u064e\1\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\1\u064f\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\12\10\1\u0650\7\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\1\u0651"+
+    "\5\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u0652\2\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\3\10\1\u0653\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\u0654\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\3\10\1\u0655\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\1\10\1\u0656\15\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\3\10\1\u0657\2\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\1\u0491\1\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\7\10"+
+    "\1\u0658\7\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\7\10\1\u0659\7\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\2\10\1\u065a\13\10\1\u065b"+
+    "\3\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u065c\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\3\10\1\u0154\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\2\10\1\u065d\14\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u065e"+
+    "\10\10\2\0\1\7\22\10\63\0\1\u03f6\74\0\1\u050d"+
+    "\65\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u065f"+
+    "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u0660\15\10"+
+    "\2\0\1\7\22\10\27\0\1\u0661\160\0\1\u0662\35\0"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\2\10"+
+    "\1\u0663\14\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\5\10\1\u0664\11\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\u04fc\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\60\0\1\u046b\101\0"+
+    "\1\u0665\63\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\1\10\1\u0666\4\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\1\10\1\u0667"+
+    "\15\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\5\10\1\u04ce\14\0\17\10\2\0\1\7\22\10"+
+    "\72\0\1\u0668\30\0\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u0669\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\u066a\1\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\10\1\u066b\4\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\5\10\1\u0135\11\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u066c\15\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\7\10\1\u066d\7\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u066e\4\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\4\10\1\u066f\1\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\4\10\1\u0670\1\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u0671\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u0672\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\1\10\1\u0673\15\10\2\0\1\7\22\10\103\0\1\u0674"+
+    "\17\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\1\u031a\21\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u0675\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\11\10\1\u03f2\5\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\14\10\1\u02dd\5\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\13\10\1\u0676\3\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\13\10\1\u031a\3\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\12\10\1\u0154\7\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\1\341\1\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\1\u0677\16\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\u0678\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\u0154\16\10\2\0"+
+    "\1\7\22\10\1\7\5\10\1\u0679\1\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\10\1\u067a\4\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u067b\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u067c\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\5\10\1\341\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\2\10\1\u067d\14\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u067e\15\10"+
+    "\2\0\1\7\22\10\72\0\1\u067f\30\0\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\u0680\1\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+    "\1\u0681\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u0682\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\3\10\1\u0683\13\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+    "\1\u0684\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u0685\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0686\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\u0687\4\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\14\10\1\u0688\2\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\u0689\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\2\10\1\u067b\3\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\17\10\1\u02de\2\10\1\7\5\10\1\u068a\1\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\4\10\1\u068b\1\u0222\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\u068c\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\3\10\1\u068d\2\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\2\10\1\u068e"+
+    "\17\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u068f"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\u0380\1\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\6\10\1\u0690\10\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u0154\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\42\0\1\u0691\143\0\1\u0692\37\0"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+    "\1\u0693\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\12\10"+
+    "\1\u039f\7\10\36\0\1\u0561\64\0\1\7\7\10\1\0"+
+    "\1\u0694\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\u0695\1\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\67\0\1\u0696\33\0\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\3\10\1\u0697\2\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\6\10\1\u0698\10\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\14\10\1\u0699\5\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u04e4\15\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u069a\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u069b\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u069c\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\6\10\1\u024b\10\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\4\10\1\u0425\12\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\1\u069d\1\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\2\10\1\u03f2"+
+    "\14\10\2\0\1\7\22\10\65\0\1\u069e\35\0\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\7\10\1\u069f"+
+    "\7\10\2\0\1\7\22\10\1\7\7\10\1\0\1\u06a0"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\10\1\u06a1\4\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\1\u06a2\1\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\4\10\1\u06a3\1\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u06a4\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u04f0"+
+    "\1\10\14\0\17\10\2\0\1\7\22\10\1\7\5\10"+
+    "\1\u06a5\1\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\4\10\1\u06a6\1\u0222\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\14\10\1\u06a7\2\10\1\u06a8"+
+    "\2\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\2\10\1\u04dc\17\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\u067d\4\10\14\0\17\10"+
+    "\2\0\1\7\22\10\57\0\1\u06a9\43\0\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u06aa\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\3\10\1\u06ab\2\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+    "\1\u06ac\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u06ad\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\u06ae\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\5\10"+
+    "\1\u02bd\1\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\4\10\1\u06a6\1\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\1\10"+
+    "\1\u06af\15\10\1\u06a8\2\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\4\10\1\u04f0\12\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\2\10\1\u06b0\17\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\u0673\1\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+    "\1\u03aa\1\10\14\0\1\10\1\u06b1\15\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\6\10\1\u06b2\10\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\1\10\1\u06b3\4\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\4\10\1\u06b4\1\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u06b5\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\10\1\u06b6\4\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u034a\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\37\0\1\u06b7\143\0"+
+    "\1\u06b8\42\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\10\1\u06b9\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\1\u06ba\1\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\12\10\1\u06bb\4\10\2\0\1\7\22\10\37\0"+
+    "\1\u06bc\63\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\13\10\1\u04b9\3\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\u06bd\5\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\1\10\1\u06be\4\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u06bf\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\14\10\1\u06c0\2\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\1\0\1\u06c1\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u06c2\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\66\0\1\u06c3\34\0\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\2\10\1\u06c4\3\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u06c5"+
+    "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u06c6\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\2\10\1\u0602\14\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u06c7\2\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\6\10\1\u06c8\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\1\10\1\u06c9\15\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\4\10\1\u06ca\1\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\1\10\1\u06cb\4\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\6\10\1\u06cc\10\10\2\0\1\7\22\10\35\0\1\u06cd"+
+    "\65\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u0602"+
+    "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\5\10\1\u06ce\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\1\10\1\u06cf\15\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\10\1\u06d0\4\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\16\10\1\u03f2\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0553\4\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\6\10\1\u06d1\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\1\u06d2\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u06d3\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\2\10\1\u06d4\3\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+    "\1\u06d5\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\10\1\u06d6\4\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\1\0\1\u06d7"+
+    "\6\10\14\0\17\10\2\0\1\7\22\10\35\0\1\u0561"+
+    "\146\0\1\u06d8\41\0\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\6\10\1\u06d9\10\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\2\10"+
+    "\1\u024b\14\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\2\10\1\u06da\3\10\14\0\17\10\2\0"+
+    "\1\7\22\10\63\0\1\u06db\37\0\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\6\10\1\u06dc\10\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\1\10\1\u06dd\15\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\4\10\1\u06a6\1\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\16\10\1\u0585"+
+    "\3\10\6\0\1\u06de\114\0\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\6\10\1\u06df\10\10\2\0\1\7"+
+    "\22\10\62\0\1\u06e0\40\0\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\1\u0218\1\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u030f\2\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\3\10\1\u06e1\2\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\5\10"+
+    "\1\u06e2\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u06e3\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\1\u040d\1\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\2\10\1\u06e4\14\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u06e5"+
+    "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u06e6\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\2\10\1\u06e7\14\10\2\0\1\7\22\10"+
+    "\32\0\1\u06e8\70\0\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\5\10\1\u06e9\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\2\10\1\u06ea"+
+    "\14\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u06eb\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\1\u04f0\21\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\5\10\1\u06ec\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u01d3"+
+    "\1\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\u06ed\2\10\14\0\17\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\2\10\1\u0391\14\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\2\10\1\u06ee\3\10"+
+    "\14\0\17\10\2\0\1\7\22\10\74\0\1\u06ef\65\0"+
+    "\1\u06f0\63\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\4\10\1\u06d0\12\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\1\10\1\u06f1\4\10\14\0"+
+    "\17\10\2\0\1\7\22\10\65\0\1\u06f2\35\0\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\3\10\1\u06f3\2\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\5\10\1\240\11\10\2\0\1\7"+
+    "\22\10\60\0\1\u06f4\42\0\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\3\10\1\u06f5\2\10\14\0\17\10\2\0\1\7"+
+    "\22\10\41\0\1\u06f6\61\0\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\2\10\1\u06f7\14\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u06f8"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\5\10\1\u046a\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u06f9"+
+    "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\13\10\1\u0602\3\10"+
+    "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+    "\6\10\14\0\4\10\1\u06fa\12\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u0644\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\64\0\1\u06fb\36\0\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\16\10\1\u06fc\3\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\6\10\1\u06fd\10\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\u05d9\5\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\1\u06fe\5\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\7\10\1\u06ff\7\10\2\0\1\7\22\10\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\3\10\1\u0700\2\10\14\0\17\10"+
+    "\2\0\1\7\22\10\37\0\1\u0701\111\0\1\u0702\54\0"+
+    "\1\u0703\17\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\5\10"+
+    "\1\u0704\14\0\17\10\2\0\1\7\22\10\66\0\1\u0705"+
+    "\34\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u0706"+
+    "\1\10\14\0\17\10\2\0\1\7\22\10\14\0\1\u0707"+
+    "\106\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u0708"+
+    "\1\10\14\0\17\10\2\0\1\7\22\10\37\0\1\u0709"+
+    "\63\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\1\u0460\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\5\10\1\u070a"+
+    "\1\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\14\10\1\u070b\5\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u057f"+
+    "\10\10\2\0\1\7\22\10\63\0\1\u070c\37\0\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\2\10\1\u070d\3\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\1\u070e\1\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\3\10\1\u070f\2\10"+
+    "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\1\0\1\u0710\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\7\10\1\u0711\7\10\2\0\1\7\22\10\61\0\1\u0712"+
+    "\102\0\1\u0713\144\0\1\u0714\37\0\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\6\10\1\u0715\10\10\2\0"+
+    "\1\7\22\10\40\0\1\u0716\62\0\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\6\10\1\u0717\10\10\2\0"+
+    "\1\7\22\10\35\0\1\u0718\65\0\1\7\7\10\1\0"+
+    "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\1\u03b7\5\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\22\10\32\0\1\u0333\52\0\1\u0719\15\0\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\u071a\16\10\2\0"+
+    "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+    "\14\0\1\10\1\u071b\15\10\2\0\1\7\22\10\37\0"+
+    "\1\u071c\63\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+    "\1\u071d\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\6\10\14\0\13\10\1\u0154"+
+    "\3\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\1\u071e\1\10\1\0\1\7\1\10\4\0"+
+    "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+    "\116\0\1\u071f\4\0\1\7\7\10\1\0\1\10\1\141"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\1\0"+
+    "\1\u0720\6\10\14\0\17\10\2\0\1\7\22\10\65\0"+
+    "\1\u0721\115\0\1\u0722\100\0\1\u0723\64\0\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\1\10\1\u0724\15\10"+
+    "\2\0\1\7\22\10\41\0\1\u0725\61\0\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\1\u0726\21\10\36\0\1\u0727\152\0\1\u0728\34\0\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\6\10\2\0\3\10\1\u0729\2\10\14\0"+
+    "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\6\10\14\0\6\10\1\u0615\10\10\2\0\1\7"+
+    "\22\10\62\0\1\u072a\40\0\1\7\7\10\1\0\1\10"+
+    "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+    "\2\0\5\10\1\u03bc\14\0\17\10\2\0\1\7\22\10"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\1\u04b9\5\10\14\0"+
+    "\17\10\2\0\1\7\22\10\37\0\1\u072b\200\0\1\u072c"+
+    "\43\0\1\u072d\147\0\1\u072e\124\0\1\u072f\35\0\1\7"+
+    "\7\10\1\0\1\10\1\141\1\0\1\u0730\1\10\1\0"+
+    "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\22\10\25\0\1\u0731\75\0\1\7\7\10"+
+    "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\6\10\2\0\2\10\1\u0732\3\10\14\0\17\10"+
+    "\2\0\1\7\22\10\60\0\1\u0733\130\0\1\u0734\34\0"+
+    "\1\7\7\10\1\0\1\10\1\141\1\0\1\u02cd\1\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\22\10\35\0\1\u0735\122\0\1\u0736"+
+    "\76\0\1\u072b\150\0\1\u0737\160\0\1\u0561\107\0\1\u06b7"+
+    "\40\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\10\10\1\u03ce\11\10\40\0\1\u0738"+
+    "\62\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u03f2"+
+    "\4\10\14\0\17\10\2\0\1\7\22\10\41\0\1\u0561"+
+    "\72\0\1\u0739\176\0\1\u073a\66\0\1\u073b\154\0\1\u073c"+
+    "\132\0\1\u073d\64\0\1\u073e\145\0\1\u073f\127\0\1\u0740"+
+    "\72\0\1\u0741\145\0\1\u0742\102\0\1\u0743\76\0\1\u0744"+
+    "\145\0\1\u0745\117\0\1\u0746\77\0\1\u0747\140\0\1\u0748"+
+    "\203\0\1\u0749\53\0\1\u074a\167\0\1\u074b\51\0\1\u074c"+
+    "\126\0\1\u074d\121\0\1\u074e\143\0\1\u0561\134\0\1\u074f"+
+    "\60\0\1\u0750\130\0\1\u027f\77\0\1\u0751\170\0\1\u060a"+
+    "\120\0\1\u0752\123\0\1\u0753\77\0\1\u0754\125\0\1\u0627"+
+    "\147\0\1\u0561\34\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[151807];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_1, 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 =
+    "\3\0\2\1\1\0\12\1\2\11\21\1\2\11\4\1"+
+    "\1\11\35\1\1\11\5\1\1\11\12\1\1\11\3\1"+
+    "\1\11\1\1\2\11\24\1\1\0\1\1\1\0\7\1"+
+    "\2\0\54\1\2\0\120\1\2\0\1\11\4\0\1\11"+
+    "\2\0\1\11\16\0\1\11\1\0\1\1\2\0\2\11"+
+    "\3\1\1\0\14\1\2\11\3\1\1\0\2\1\1\11"+
+    "\5\1\1\11\231\1\33\0\1\11\2\0\1\11\15\1"+
+    "\1\11\1\1\1\0\5\1\1\11\163\1\1\0\32\1"+
+    "\2\0\1\1\2\0\1\1\15\0\1\11\11\0\1\11"+
+    "\15\1\1\0\155\1\1\0\32\1\34\0\16\1\1\0"+
+    "\145\1\1\0\27\1\23\0\12\1\1\0\2\1\1\0"+
+    "\112\1\1\0\11\1\1\0\33\1\5\0\1\1\4\0"+
+    "\14\1\2\0\101\1\2\0\7\1\1\0\33\1\11\0"+
+    "\13\1\2\0\76\1\2\0\6\1\1\11\25\1\5\0"+
+    "\4\1\1\0\5\1\2\0\3\1\1\0\55\1\2\0"+
+    "\27\1\5\0\3\1\2\0\3\1\2\0\3\1\1\0"+
+    "\45\1\2\0\21\1\2\0\2\1\2\0\3\1\2\0"+
+    "\3\1\1\0\14\1\1\0\23\1\1\0\24\1\2\0"+
+    "\2\1\1\0\2\1\1\0\13\1\1\0\12\1\1\0"+
+    "\21\1\2\0\3\1\1\0\7\1\1\0\12\1\1\0"+
+    "\15\1\2\0\3\1\1\0\4\1\1\0\1\1\1\0"+
+    "\11\1\1\0\11\1\2\0\2\1\1\0\2\1\1\0"+
+    "\1\1\1\0\7\1\1\0\6\1\2\0\1\1\1\0"+
+    "\1\1\1\0\1\1\1\0\4\1\1\0\5\1\3\0"+
+    "\1\1\1\0\1\1\1\0\1\1\1\0\2\1\1\0"+
+    "\3\1\1\0\1\1\3\0\1\1\1\0\1\1\2\0"+
+    "\2\1\1\0\2\1\5\0\1\1\1\0\1\1\2\0"+
+    "\1\1\6\0\1\1\1\0\1\1\16\0\1\1\23\0";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[1876];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public GroovyTokenMaker() {
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = MULTILINE_STRING_DOUBLE;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = MULTILINE_STRING_SINGLE;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Returns whether a regular expression token can follow the specified
+	 * token.
+	 *
+	 * @param t The token to check, which may be <code>null</code>.
+	 * @return Whether a regular expression token may follow this one.
+	 */
+	private static final boolean regexCanFollow(Token t) {
+		char ch;
+		return t==null ||
+				//t.isOperator() ||
+				(t.textCount==1 && (
+					(ch=t.text[t.textOffset])=='=' ||
+					ch=='(' ||
+					ch==',' ||
+					ch=='?' ||
+					ch==':' ||
+					ch=='['
+				)) ||
+				/* Operators "==", "===", "!=", "!==", etc. */
+				(t.type==Token.OPERATOR &&
+					((ch=t.text[t.textOffset+t.textCount-1])=='=' || ch=='~'));
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 GroovyTokenMaker(java.io.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 GroovyTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 192) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 20: 
+          { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 47: break;
+        case 3: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 48: break;
+        case 42: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 49: break;
+        case 6: 
+          { start = zzMarkedPos-1; yybegin(STRING_DOUBLE);
+          }
+        case 50: break;
+        case 35: 
+          { start = zzMarkedPos-3; yybegin(MULTILINE_STRING_DOUBLE);
+          }
+        case 51: break;
+        case 13: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken;
+          }
+        case 52: break;
+        case 34: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 53: break;
+        case 21: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 54: break;
+        case 5: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 55: break;
+        case 11: 
+          { addToken(Token.ANNOTATION);
+          }
+        case 56: break;
+        case 28: 
+          { addToken(Token.FUNCTION);
+          }
+        case 57: break;
+        case 33: 
+          { start = zzMarkedPos-3; yybegin(MULTILINE_STRING_SINGLE);
+          }
+        case 58: break;
+        case 2: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 59: break;
+        case 36: 
+          { boolean highlightedAsRegex = false;
+				if (zzBuffer[zzStartRead]=='~' || firstToken==null) {
+					addToken(Token.REGEX);
+					highlightedAsRegex = true;
+				}
+				else {
+					// If this is *likely* to be a regex, based on
+					// the previous token, highlight it as such.
+					Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+					if (regexCanFollow(t)) {
+						addToken(Token.REGEX);
+						highlightedAsRegex = true;
+					}
+				}
+				// If it doesn't *appear* to be a regex, highlight it as
+				// individual tokens.
+				if (!highlightedAsRegex) {
+					int temp = zzStartRead + 1;
+					addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+					zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+				}
+          }
+        case 60: break;
+        case 25: 
+          { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 61: break;
+        case 40: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.LITERAL_CHAR);
+          }
+        case 62: break;
+        case 45: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 63: break;
+        case 31: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.PREPROCESSOR); start = zzMarkedPos;
+          }
+        case 64: break;
+        case 44: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos;
+          }
+        case 65: break;
+        case 14: 
+          { /* Skip escaped chars, handles case: '\"""'. */
+          }
+        case 66: break;
+        case 24: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 67: break;
+        case 18: 
+          { /* Skip escaped chars. */
+          }
+        case 68: break;
+        case 39: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 69: break;
+        case 23: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 70: break;
+        case 26: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 71: break;
+        case 8: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 72: break;
+        case 30: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION);
+          }
+        case 73: break;
+        case 38: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 74: break;
+        case 29: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 75: break;
+        case 4: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 76: break;
+        case 32: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 77: break;
+        case 19: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 78: break;
+        case 16: 
+          { /* Skip escaped chars, handles case: "\'''". */
+          }
+        case 79: break;
+        case 37: 
+          { start = zzMarkedPos-3; yybegin(DOCCOMMENT);
+          }
+        case 80: break;
+        case 27: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 81: break;
+        case 43: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 82: break;
+        case 46: 
+          { addToken(Token.RESERVED_WORD_2);
+          }
+        case 83: break;
+        case 10: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 84: break;
+        case 7: 
+          { addNullToken(); return firstToken;
+          }
+        case 85: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 86: break;
+        case 9: 
+          { addToken(Token.OPERATOR);
+          }
+        case 87: break;
+        case 17: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+          }
+        case 88: break;
+        case 22: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 89: break;
+        case 41: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 90: break;
+        case 1: 
+          { 
+          }
+        case 91: break;
+        case 15: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 92: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case MULTILINE_STRING_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 1877: break;
+            case DOCCOMMENT: {
+              yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken;
+            }
+            case 1878: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 1879: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 1880: break;
+            case STRING_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); return firstToken;
+            }
+            case 1881: break;
+            case MULTILINE_STRING_SINGLE: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+            }
+            case 1882: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex
new file mode 100644
index 0000000..a7a36e9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex
@@ -0,0 +1,1187 @@
+/*
+ * 01/24/2005
+ *
+ * HTMLTokenMaker.java - Generates tokens for HTML syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for HTML 5 files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated HTMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+%%
+
+%public
+%class HTMLTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to HTMLTokenMaker; this signals that the user has
+	 * ended a line with an unclosed HTML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to HTMLTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code><script></code> tag.
+	 */
+	public static final int INTERNAL_INTAG_SCRIPT			= -4;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+	/**
+	 * Token type specific to HTMLTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code><style></code> tag.
+	 */
+	public static final int INTERNAL_INTAG_STYLE			= -7;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * style tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_STYLE = -8;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * style tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_STYLE = -9;
+
+	/**
+	 * Token type specifying we're in JavaScript.
+	 */
+	public static final int INTERNAL_IN_JS					= -10;
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	public static final int INTERNAL_IN_JS_MLC				= -11;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_INVALID	= -12;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_VALID		= -13;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_INVALID	= -14;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_VALID		= -15;
+
+	/**
+	 * Internal type denoting a line ending in CSS.
+	 */
+	public static final int INTERNAL_CSS					= -16;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property.
+	 */
+	public static final int INTERNAL_CSS_PROPERTY			= -17;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property value.
+	 */
+	public static final int INTERNAL_CSS_VALUE				= -18;
+
+	/**
+	 * Internal type denoting line ending in a CSS double-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_STRING				= -(1<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS single-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_CHAR				= -(2<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS multi-line comment.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_MLC				= -(3<<11);
+
+	/**
+	 * The state previous CSS-related state we were in before going into a CSS
+	 * string, multi-line comment, etc.
+	 */
+	private int cssPrevState;
+
+	/**
+	 * Whether closing markup tags are automatically completed for HTML.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+	/**
+	 * Language state set on HTML tokens.  Must be 0.
+	 */
+	private static final int LANG_INDEX_DEFAULT = 0;
+
+	/**
+	 * Language state set on JavaScript tokens.
+	 */
+	private static final int LANG_INDEX_JS = 1;
+
+	/**
+	 * Language state set on CSS tokens.
+	 */
+	private static final int LANG_INDEX_CSS = 2;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public HTMLTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * 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;
+		cssPrevState = CSS; // Shouldn't be necessary
+		int languageIndex = 0;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.MARKUP_COMMENT:
+				state = COMMENT;
+				break;
+			case Token.PREPROCESSOR:
+				state = PI;
+				break;
+			case Token.VARIABLE:
+				state = DTD;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				break;
+			case INTERNAL_INTAG_STYLE:
+				state = INTAG_STYLE;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_STYLE:
+				state = INATTR_DOUBLE_STYLE;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_STYLE:
+				state = INATTR_SINGLE_STYLE;
+				break;
+			case INTERNAL_IN_JS:
+				state = JAVASCRIPT;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				validJSString = false;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				validJSString = true;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				validJSString = false;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				validJSString = true;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_CSS:
+				state = CSS;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			case INTERNAL_CSS_PROPERTY:
+				state = CSS_PROPERTY;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			case INTERNAL_CSS_VALUE:
+				state = CSS_VALUE;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			default:
+				if (initialTokenType<-1024) {
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_CSS_STRING:
+							state = CSS_STRING;
+							break;
+						case INTERNAL_CSS_CHAR:
+							state = CSS_CHAR_LITERAL;
+							break;
+						case INTERNAL_CSS_MLC:
+							state = CSS_C_STYLE_COMMENT;
+							break;
+					}
+					cssPrevState = -initialTokenType&0xff;
+					languageIndex = LANG_INDEX_CSS;
+				}
+				else {
+					state = Token.NULL;
+				}
+				break;
+		}
+
+		setLanguageIndex(languageIndex);
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * 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(java.io.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;
+	}
+
+
+%}
+
+// HTML-specific stuff.
+Whitespace					= ([ \t\f]+)
+LineTerminator				= ([\n])
+Identifier					= ([^ \t\n<&]+)
+EntityReference					= ([&][^; \t]*[;]?)
+InTagIdentifier				= ([^ \t\n\"\'/=>]+)
+EndScriptTag				= ("</" [sS][cC][rR][iI][pP][tT] ">")
+EndStyleTag					= ("</" [sS][tT][yY][lL][eE] ">")
+
+// General stuff.
+Letter						= [A-Za-z]
+NonzeroDigit				= [1-9]
+Digit						= ("0"|{NonzeroDigit})
+HexDigit					= ({Digit}|[A-Fa-f])
+OctalDigit					= ([0-7])
+LetterOrUnderscore			= ({Letter}|[_])
+LetterOrUnderscoreOrDash	= ({LetterOrUnderscore}|[\-])
+
+
+// JavaScript stuff.
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({Letter}|"_"|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+JS_MLCBegin				= "/*"
+JS_MLCEnd					= "*/"
+JS_LineCommentBegin			= "//"
+JS_IntegerHelper1			= (({NonzeroDigit}{Digit}*)|"0")
+JS_IntegerHelper2			= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+JS_IntegerLiteral			= ({JS_IntegerHelper1}[lL]?)
+JS_HexLiteral				= ({JS_IntegerHelper2}[lL]?)
+JS_FloatHelper1			= ([fFdD]?)
+JS_FloatHelper2			= ([eE][+-]?{Digit}+{JS_FloatHelper1})
+JS_FloatLiteral1			= ({Digit}+"."({JS_FloatHelper1}|{JS_FloatHelper2}|{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2})))
+JS_FloatLiteral2			= ("."{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2}))
+JS_FloatLiteral3			= ({Digit}+{JS_FloatHelper2})
+JS_FloatLiteral			= ({JS_FloatLiteral1}|{JS_FloatLiteral2}|{JS_FloatLiteral3}|({Digit}+[fFdD]))
+JS_ErrorNumberFormat		= (({JS_IntegerLiteral}|{JS_HexLiteral}|{JS_FloatLiteral}){NonSeparator}+)
+JS_Separator				= ([\(\)\{\}\[\]\]])
+JS_Separator2				= ([\;,.])
+JS_NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+JS_AssignmentOperator		= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+JS_Operator				= ({JS_NonAssignmentOperator}|{JS_AssignmentOperator})
+JS_Identifier				= ({IdentifierStart}{IdentifierPart}*)
+JS_ErrorIdentifier			= ({NonSeparator}+)
+JS_Regex					= ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[gim]*)
+
+
+// CSS stuff.
+CSS_SelectorPiece			= (("*"|"."|{LetterOrUnderscoreOrDash})({LetterOrUnderscoreOrDash}|"."|{Digit})*)
+CSS_PseudoClass				= (":"("root"|"nth-child"|"nth-last-child"|"nth-of-type"|"nth-last-of-type"|"first-child"|"last-child"|"first-of-type"|"last-of-type"|"only-child"|"only-of-type"|"empty"|"link"|"visited"|"active"|"hover"|"focus"|"target"|"lang"|"enabled"|"disabled"|"checked"|":first-line"|":first-letter"|":before"|":after"|"not"))
+CSS_AtKeyword				= ("@"{CSS_SelectorPiece})
+CSS_Id						= ("#"{CSS_SelectorPiece})
+CSS_Separator				= ([;\(\)\[\]])
+CSS_MlcStart				= ({JS_MLCBegin})
+CSS_MlcEnd					= ({JS_MLCEnd})
+CSS_Property				= ([\*]?{LetterOrUnderscoreOrDash}({LetterOrUnderscoreOrDash}|{Digit})*)
+CSS_ValueChar				= ({LetterOrUnderscoreOrDash}|[\\/])
+CSS_Value					= ({CSS_ValueChar}*)
+CSS_Function				= ({CSS_Value}\()
+CSS_Digits					= ([\-]?{Digit}+([0-9\.]+)?(pt|pc|in|mm|cm|em|ex|px|ms|s|%)?)
+CSS_Hex						= ("#"[0-9a-fA-F]+)
+CSS_Number					= ({CSS_Digits}|{CSS_Hex})
+
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state COMMENT
+%state PI
+%state DTD
+%state INTAG
+%state INTAG_CHECK_TAG_NAME
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state INTAG_SCRIPT
+%state INATTR_DOUBLE_SCRIPT
+%state INATTR_SINGLE_SCRIPT
+%state INTAG_STYLE
+%state INATTR_DOUBLE_STYLE
+%state INATTR_SINGLE_STYLE
+%state JAVASCRIPT
+%state JS_STRING
+%state JS_CHAR
+%state JS_MLC
+%state JS_EOL_COMMENT
+%state CSS
+%state CSS_PROPERTY
+%state CSS_VALUE
+%state CSS_STRING
+%state CSS_CHAR_LITERAL
+%state CSS_C_STYLE_COMMENT
+
+
+%%
+
+<YYINITIAL> {
+	"<!--"						{ start = zzMarkedPos-4; yybegin(COMMENT); }
+	"<"[sS][cC][rR][iI][pP][tT]	{
+								  addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+								}
+	"<"[sS][tT][yY][lL][eE]		{
+								  addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-5,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; cssPrevState = zzLexicalState; yybegin(INTAG_STYLE);
+								}
+	"<!"						{ start = zzMarkedPos-2; yybegin(DTD); }
+	"<?"						{ start = zzMarkedPos-2; yybegin(PI); }
+	"<"({Letter}|{Digit})+		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+									yybegin(INTAG_CHECK_TAG_NAME);
+								}
+	"</"({Letter}|{Digit})+		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-2); //yypushback(count-2);
+									yybegin(INTAG_CHECK_TAG_NAME);
+								}
+	"<"							{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	"</"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	{LineTerminator}			{ addNullToken(); return firstToken; }
+	{Identifier}				{ addToken(Token.IDENTIFIER); } // Catches everything.
+	{EntityReference}			{ addToken(Token.MARKUP_ENTITY_REFERENCE); }
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	<<EOF>>					{ addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+	[^hwf\n\-]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos; }
+	[hwf]					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken; }
+	"-->"					{ yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); }
+	"-"						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken; }
+}
+
+<PI> {
+	[^\n\?]+					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+	"?>"						{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION); }
+	"?"						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+}
+
+<DTD> {
+	[^\n>]+					{}
+	">"						{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD); }
+	{LineTerminator} |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken; }
+}
+
+<INTAG_CHECK_TAG_NAME> {
+	[Aa] |
+	[aA][bB][bB][rR] |
+	[aA][cC][rR][oO][nN][yY][mM] |
+	[aA][dD][dD][rR][eE][sS][sS] |
+	[aA][pP][pP][lL][eE][tT] |
+	[aA][rR][eE][aA] |
+	[aA][rR][tT][iI][cC][lL][eE] |
+	[aA][sS][iI][dD][eE] |
+	[aA][uU][dD][iI][oO] |
+	[bB] |
+	[bB][aA][sS][eE] |
+	[bB][aA][sS][eE][fF][oO][nN][tT] |
+	[bB][dD][oO] |
+	[bB][gG][sS][oO][uU][nN][dD] |
+	[bB][iI][gG] |
+	[bB][lL][iI][nN][kK] |
+	[bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE] |
+	[bB][oO][dD][yY] |
+	[bB][rR] |
+	[bB][uU][tT][tT][oO][nN] |
+	[cC][aA][nN][vV][aA][sS] |
+	[cC][aA][pP][tT][iI][oO][nN] |
+	[cC][eE][nN][tT][eE][rR] |
+	[cC][iI][tT][eE] |
+	[cC][oO][dD][eE] |
+	[cC][oO][lL] |
+	[cC][oO][lL][gG][rR][oO][uU][pP] |
+	[cC][oO][mM][mM][aA][nN][dD] |
+	[cC][oO][mM][mM][eE][nN][tT] |
+	[dD][dD] |
+	[dD][aA][tT][aA][gG][rR][iI][dD] |
+	[dD][aA][tT][aA][lL][iI][sS][tT] |
+	[dD][aA][tT][aA][tT][eE][mM][pP][lL][aA][tT][eE] |
+	[dD][eE][lL] |
+	[dD][eE][tT][aA][iI][lL][sS] |
+	[dD][fF][nN] |
+	[dD][iI][aA][lL][oO][gG] |
+	[dD][iI][rR] |
+	[dD][iI][vV] |
+	[dD][lL] |
+	[dD][tT] |
+	[eE][mM] |
+	[eE][mM][bB][eE][dD] |
+	[eE][vV][eE][nN][tT][sS][oO][uU][rR][cC][eE] |
+	[fF][iI][eE][lL][dD][sS][eE][tT] |
+	[fF][iI][gG][uU][rR][eE] |
+	[fF][oO][nN][tT] |
+	[fF][oO][oO][tT][eE][rR] |
+	[fF][oO][rR][mM] |
+	[fF][rR][aA][mM][eE] |
+	[fF][rR][aA][mM][eE][sS][eE][tT] |
+	[hH][123456] |
+	[hH][eE][aA][dD] |
+	[hH][eE][aA][dD][eE][rR] |
+	[hH][rR] |
+	[hH][tT][mM][lL] |
+	[iI] |
+	[iI][fF][rR][aA][mM][eE] |
+	[iI][lL][aA][yY][eE][rR] |
+	[iI][mM][gG] |
+	[iI][nN][pP][uU][tT] |
+	[iI][nN][sS] |
+	[iI][sS][iI][nN][dD][eE][xX] |
+	[kK][bB][dD] |
+	[kK][eE][yY][gG][eE][nN] |
+	[lL][aA][bB][eE][lL] |
+	[lL][aA][yY][eE][rR] |
+	[lL][eE][gG][eE][nN][dD] |
+	[lL][iI] |
+	[lL][iI][nN][kK] |
+	[mM][aA][pP] |
+	[mM][aA][rR][kK] |
+	[mM][aA][rR][qQ][uU][eE][eE] |
+	[mM][eE][nN][uU] |
+	[mM][eE][tT][aA] |
+	[mM][eE][tT][eE][rR] |
+	[mM][uU][lL][tT][iI][cC][oO][lL] |
+	[nN][aA][vV] |
+	[nN][eE][sS][tT] |
+	[nN][oO][bB][rR] |
+	[nN][oO][eE][mM][bB][eE][dD] |
+	[nN][oO][fF][rR][aA][mM][eE][sS] |
+	[nN][oO][lL][aA][yY][eE][rR] |
+	[nN][oO][sS][cC][rR][iI][pP][tT] |
+	[oO][bB][jJ][eE][cC][tT] |
+	[oO][lL] |
+	[oO][pP][tT][gG][rR][oO][uU][pP] |
+	[oO][pP][tT][iI][oO][nN] |
+	[oO][uU][tT][pP][uU][tT] |
+	[pP] |
+	[pP][aA][rR][aA][mM] |
+	[pP][lL][aA][iI][nN][tT][eE][xX][tT] |
+	[pP][rR][eE] |
+	[pP][rR][oO][gG][rR][eE][sS][sS] |
+	[qQ] |
+	[rR][uU][lL][eE] |
+	[sS] |
+	[sS][aA][mM][pP] |
+	[sS][cC][rR][iI][pP][tT] |
+	[sS][eE][cC][tT][iI][oO][nN] |
+	[sS][eE][lL][eE][cC][tT] |
+	[sS][eE][rR][vV][eE][rR] |
+	[sS][mM][aA][lL][lL] |
+	[sS][oO][uU][rR][cC][eE] |
+	[sS][pP][aA][cC][eE][rR] |
+	[sS][pP][aA][nN] |
+	[sS][tT][rR][iI][kK][eE] |
+	[sS][tT][rR][oO][nN][gG] |
+	[sS][tT][yY][lL][eE] |
+	[sS][uU][bB] |
+	[sS][uU][pP] |
+	[tT][aA][bB][lL][eE] |
+	[tT][bB][oO][dD][yY] |
+	[tT][dD] |
+	[tT][eE][xX][tT][aA][rR][eE][aA] |
+	[tT][fF][oO][oO][tT] |
+	[tT][hH] |
+	[tT][hH][eE][aA][dD] |
+	[tT][iI][mM][eE] |
+	[tT][iI][tT][lL][eE] |
+	[tT][rR] |
+	[tT][tT] |
+	[uU] |
+	[uU][lL] |
+	[vV][aA][rR] |
+	[vV][iI][dD][eE][oO]    { addToken(Token.MARKUP_TAG_NAME); }
+	{InTagIdentifier}		{ /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG); }
+	.						{ /* Shouldn't happen */ yypushback(1); yybegin(INTAG); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INTAG> {
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); }
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	"/>"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	">"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+	[^\"]*						{}
+	[\"]						{ yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+	[^\']*						{}
+	[\']						{ yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<INTAG_SCRIPT> {
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	"/>"					{	addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	">"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JAVASCRIPT, LANG_INDEX_JS); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken; }
+}
+
+<INATTR_DOUBLE_SCRIPT> {
+	[^\"]*						{}
+	[\"]						{ yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INATTR_SINGLE_SCRIPT> {
+	[^\']*						{}
+	[\']						{ yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INTAG_STYLE> {
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	"/>"					{	addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	">"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(CSS, LANG_INDEX_CSS); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_STYLE); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE_STYLE); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_STYLE); return firstToken; }
+}
+
+<INATTR_DOUBLE_STYLE> {
+	[^\"]*						{}
+	[\"]						{ yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_STYLE); return firstToken; }
+}
+
+<INATTR_SINGLE_STYLE> {
+	[^\']*						{}
+	[\']						{ yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_STYLE); return firstToken; }
+}
+
+<JAVASCRIPT> {
+
+	{EndScriptTag}				{
+								  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+								}
+
+	// ECMA 3+ keywords.
+	"break" |
+	"continue" |
+	"delete" |
+	"else" |
+	"for" |
+	"function" |
+	"if" |
+	"in" |
+	"new" |
+	"this" |
+	"typeof" |
+	"var" |
+	"void" |
+	"while" |
+	"with"						{ addToken(Token.RESERVED_WORD); }
+	"return"					{ addToken(Token.RESERVED_WORD_2); }
+
+	//JavaScript 1.6
+	"each" 						{if(JavaScriptTokenMaker.isJavaScriptCompatible("1.6")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+	//JavaScript 1.7
+	"let" 						{if(JavaScriptTokenMaker.isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+
+	// Reserved (but not yet used) ECMA keywords.
+	"abstract"					{ addToken(Token.RESERVED_WORD); }
+	"boolean"						{ addToken(Token.DATA_TYPE); }
+	"byte"						{ addToken(Token.DATA_TYPE); }
+	"case"						{ addToken(Token.RESERVED_WORD); }
+	"catch"						{ addToken(Token.RESERVED_WORD); }
+	"char"						{ addToken(Token.DATA_TYPE); }
+	"class"						{ addToken(Token.RESERVED_WORD); }
+	"const"						{ addToken(Token.RESERVED_WORD); }
+	"debugger"					{ addToken(Token.RESERVED_WORD); }
+	"default"						{ addToken(Token.RESERVED_WORD); }
+	"do"							{ addToken(Token.RESERVED_WORD); }
+	"double"						{ addToken(Token.DATA_TYPE); }
+	"enum"						{ addToken(Token.RESERVED_WORD); }
+	"export"						{ addToken(Token.RESERVED_WORD); }
+	"extends"						{ addToken(Token.RESERVED_WORD); }
+	"final"						{ addToken(Token.RESERVED_WORD); }
+	"finally"						{ addToken(Token.RESERVED_WORD); }
+	"float"						{ addToken(Token.DATA_TYPE); }
+	"goto"						{ addToken(Token.RESERVED_WORD); }
+	"implements"					{ addToken(Token.RESERVED_WORD); }
+	"import"						{ addToken(Token.RESERVED_WORD); }
+	"instanceof"					{ addToken(Token.RESERVED_WORD); }
+	"int"						{ addToken(Token.DATA_TYPE); }
+	"interface"					{ addToken(Token.RESERVED_WORD); }
+	"long"						{ addToken(Token.DATA_TYPE); }
+	"native"						{ addToken(Token.RESERVED_WORD); }
+	"package"						{ addToken(Token.RESERVED_WORD); }
+	"private"						{ addToken(Token.RESERVED_WORD); }
+	"protected"					{ addToken(Token.RESERVED_WORD); }
+	"public"						{ addToken(Token.RESERVED_WORD); }
+	"short"						{ addToken(Token.DATA_TYPE); }
+	"static"						{ addToken(Token.RESERVED_WORD); }
+	"super"						{ addToken(Token.RESERVED_WORD); }
+	"switch"						{ addToken(Token.RESERVED_WORD); }
+	"synchronized"					{ addToken(Token.RESERVED_WORD); }
+	"throw"						{ addToken(Token.RESERVED_WORD); }
+	"throws"						{ addToken(Token.RESERVED_WORD); }
+	"transient"					{ addToken(Token.RESERVED_WORD); }
+	"try"						{ addToken(Token.RESERVED_WORD); }
+	"volatile"					{ addToken(Token.RESERVED_WORD); }
+	"null"						{ addToken(Token.RESERVED_WORD); }
+
+	// Literals.
+	"false" |
+	"true"						{ addToken(Token.LITERAL_BOOLEAN); }
+	"NaN"						{ addToken(Token.RESERVED_WORD); }
+	"Infinity"					{ addToken(Token.RESERVED_WORD); }
+
+	// Functions.
+	"eval" |
+	"parseInt" |
+	"parseFloat" |
+	"escape" |
+	"unescape" |
+	"isNaN" |
+	"isFinite"					{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addEndToken(INTERNAL_IN_JS); return firstToken; }
+	{JS_Identifier}				{ addToken(Token.IDENTIFIER); }
+	{Whitespace}					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	[\']							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
+	[\"]							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{JS_MLCBegin}					{ start = zzMarkedPos-2; yybegin(JS_MLC); }
+	{JS_LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
+
+	/* Attempt to identify regular expressions (not foolproof) - do after comments! */
+	{JS_Regex}						{
+										boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+									}
+
+	/* Separators. */
+	{JS_Separator}					{ addToken(Token.SEPARATOR); }
+	{JS_Separator2}				{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{JS_Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{JS_IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{JS_HexLiteral}				{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{JS_FloatLiteral}				{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{JS_ErrorNumberFormat}			{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{JS_ErrorIdentifier}			{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<JS_STRING> {
+	[^\n\\\"]+				{}
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+							}
+	\"						{ int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_CHAR> {
+	[^\n\\\']+				{}
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+							}
+	\'						{ int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_MLC> {
+	// JavaScript MLC's.  This state is essentially Java's MLC state.
+	[^hwf<\n\*]+			{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	{EndScriptTag}			{
+							  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+							}
+	"<"						{}
+	{JS_MLCEnd}				{ yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+}
+
+<JS_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]					{}
+	{EndScriptTag}			{
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+							  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+							}
+	"<"						{}
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+}
+
+<CSS> {
+	{EndStyleTag}		{
+						  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+						  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+						  addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+						  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+						}
+	{CSS_SelectorPiece}	{ addToken(Token.DATA_TYPE); }
+	{CSS_PseudoClass}	{ addToken(Token.RESERVED_WORD); }
+	":"					{ /* Unknown pseudo class */ addToken(Token.DATA_TYPE); }
+	{CSS_AtKeyword}		{ addToken(Token.REGEX); }
+	{CSS_Id}			{ addToken(Token.VARIABLE); }
+	"{"					{ addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY); }
+	[,]					{ addToken(Token.IDENTIFIER); }
+	\"					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+	\'					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+	[+>~\^$\|=]			{ addToken(Token.OPERATOR); }
+	{CSS_Separator}		{ addToken(Token.SEPARATOR); }
+	{Whitespace}		{ addToken(Token.WHITESPACE); }
+	{CSS_MlcStart}		{ start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+	.					{ /*System.out.println("CSS: " + yytext());*/ addToken(Token.IDENTIFIER); }
+	"\n" |
+	<<EOF>>				{ addEndToken(INTERNAL_CSS); return firstToken; }
+}
+
+<CSS_PROPERTY> {
+	{EndStyleTag}		{
+						  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+						  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+						  addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+						  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+						}
+	{CSS_Property}		{ addToken(Token.RESERVED_WORD); }
+	"}"					{ addToken(Token.SEPARATOR); yybegin(CSS); }
+	":"					{ addToken(Token.OPERATOR); yybegin(CSS_VALUE); }
+	{Whitespace}		{ addToken(Token.WHITESPACE); }
+	{CSS_MlcStart}		{ start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+	.					{ /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER); }
+	"\n" |
+	<<EOF>>				{ addEndToken(INTERNAL_CSS_PROPERTY); return firstToken; }
+}
+
+<CSS_VALUE> {
+	{EndStyleTag}		{
+						  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+						  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+						  addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+						  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+						}
+	{CSS_Value}			{ addToken(Token.IDENTIFIER); }
+	"!important"		{ addToken(Token.ANNOTATION); }
+	{CSS_Function}		{ int temp = zzMarkedPos - 2;
+						  addToken(zzStartRead, temp, Token.FUNCTION);
+						  addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+						  zzStartRead = zzCurrentPos = zzMarkedPos;
+						}
+	{CSS_Number}		{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	\"					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+	\'					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+	")"					{ /* End of a function */ addToken(Token.SEPARATOR); }
+	[;]					{ addToken(Token.OPERATOR); yybegin(CSS_PROPERTY); }
+	[,\.]				{ addToken(Token.IDENTIFIER); }
+	"}"					{ addToken(Token.SEPARATOR); yybegin(CSS); }
+	{Whitespace}		{ addToken(Token.WHITESPACE); }
+	{CSS_MlcStart}		{ start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+	.					{ /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER); }
+	"\n" |
+	<<EOF>>				{ addEndToken(INTERNAL_CSS_VALUE); return firstToken; }
+}
+
+<CSS_STRING> {
+	[^\n\\\"]+			{}
+	\\.?				{ /* Skip escaped chars. */ }
+	\"					{ addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState); }
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken; }
+}
+
+<CSS_CHAR_LITERAL> {
+	[^\n\\\']+			{}
+	\\.?				{ /* Skip escaped chars. */ }
+	\'					{ addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState); }
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken; }
+}
+
+<CSS_C_STYLE_COMMENT> {
+	[^hwf\n\*]+			{}
+	{URL}				{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]				{}
+	{CSS_MlcEnd}		{ addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState); }
+	\*					{}
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.java
new file mode 100644
index 0000000..ce1996f
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.java
@@ -0,0 +1,2984 @@
+/* The following code was generated by JFlex 1.4.1 on 3/23/13 10:01 AM */
+
+/*
+ * 01/24/2005
+ *
+ * HTMLTokenMaker.java - Generates tokens for HTML syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for HTML 5 files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated HTMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+
+public class HTMLTokenMaker extends AbstractMarkupTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int INATTR_SINGLE_SCRIPT = 10;
+  public static final int JS_CHAR = 16;
+  public static final int CSS_STRING = 22;
+  public static final int JS_MLC = 17;
+  public static final int CSS_CHAR_LITERAL = 23;
+  public static final int INTAG_SCRIPT = 8;
+  public static final int CSS_PROPERTY = 20;
+  public static final int CSS_C_STYLE_COMMENT = 24;
+  public static final int CSS = 19;
+  public static final int CSS_VALUE = 21;
+  public static final int COMMENT = 1;
+  public static final int INATTR_DOUBLE_SCRIPT = 9;
+  public static final int PI = 2;
+  public static final int JAVASCRIPT = 14;
+  public static final int INTAG = 4;
+  public static final int INTAG_CHECK_TAG_NAME = 5;
+  public static final int INATTR_SINGLE_STYLE = 13;
+  public static final int DTD = 3;
+  public static final int JS_EOL_COMMENT = 18;
+  public static final int INATTR_DOUBLE_STYLE = 12;
+  public static final int INATTR_SINGLE = 7;
+  public static final int YYINITIAL = 0;
+  public static final int INATTR_DOUBLE = 6;
+  public static final int JS_STRING = 15;
+  public static final int INTAG_STYLE = 11;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\4\1\2\1\0\1\1\1\33\22\0\1\4\1\51\1\7"+
+    "\1\34\1\36\1\50\1\5\1\106\1\103\1\102\1\37\1\42\1\45"+
+    "\1\31\1\43\1\10\1\25\6\123\1\27\2\24\1\53\1\6\1\3"+
+    "\1\46\1\17\1\52\1\101\1\110\1\26\1\12\1\114\1\22\1\41"+
+    "\1\116\1\122\1\14\1\124\1\117\1\21\1\113\1\112\1\111\1\15"+
+    "\1\120\1\13\1\11\1\16\1\115\1\121\1\23\1\40\1\20\1\23"+
+    "\1\105\1\35\1\105\1\47\1\30\1\0\1\67\1\100\1\64\1\66"+
+    "\1\74\1\71\1\56\1\63\1\55\1\124\1\76\1\65\1\75\1\62"+
+    "\1\60\1\73\1\120\1\57\1\70\1\61\1\32\1\77\1\107\1\104"+
+    "\1\72\1\125\1\126\1\47\1\44\1\54\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 =
+    "\6\0\2\1\1\0\2\1\1\0\2\1\7\0\1\2"+
+    "\3\0\2\2\1\3\1\4\1\5\1\6\1\1\1\7"+
+    "\5\1\1\10\2\1\1\11\1\12\2\13\1\14\1\15"+
+    "\1\16\1\17\1\20\1\21\1\22\1\23\2\21\2\23"+
+    "\3\21\2\23\5\21\1\23\3\21\1\23\1\1\1\24"+
+    "\1\1\1\25\1\15\1\26\1\27\1\30\1\31\1\32"+
+    "\1\33\1\34\1\35\1\36\2\17\1\2\1\37\1\17"+
+    "\2\2\1\17\2\40\1\17\1\2\1\35\2\17\1\2"+
+    "\1\41\17\2\1\42\2\2\1\1\1\43\1\44\1\45"+
+    "\1\1\1\46\1\47\1\50\1\1\1\51\6\1\1\52"+
+    "\1\1\1\53\1\54\1\53\1\55\1\53\1\56\1\53"+
+    "\1\57\1\53\1\60\1\61\1\62\1\63\2\62\1\64"+
+    "\1\62\1\65\1\66\1\67\1\70\1\67\1\71\2\2"+
+    "\1\40\1\2\2\67\1\72\1\73\1\74\1\75\1\76"+
+    "\1\77\1\100\1\1\1\101\4\1\1\4\2\102\1\103"+
+    "\1\104\1\6\5\0\1\105\31\21\1\23\1\21\1\23"+
+    "\2\21\1\23\44\21\1\106\3\0\1\107\1\0\1\110"+
+    "\1\17\1\35\1\2\1\17\1\111\1\40\1\111\2\112"+
+    "\1\111\1\113\1\111\1\2\1\64\1\2\1\64\17\2"+
+    "\1\64\34\2\1\114\1\115\1\116\1\0\1\117\6\0"+
+    "\1\120\1\121\15\0\1\122\1\40\5\0\1\40\1\0"+
+    "\1\76\1\123\4\0\1\124\2\102\1\0\1\125\4\0"+
+    "\13\21\1\23\64\21\1\0\1\126\1\0\1\35\1\2"+
+    "\1\112\1\0\2\113\1\2\1\56\23\2\1\127\40\2"+
+    "\41\0\2\102\1\130\2\0\1\131\22\21\1\23\5\21"+
+    "\1\23\12\21\1\0\1\132\1\35\10\2\1\133\6\2"+
+    "\1\56\16\2\1\134\1\2\1\135\4\2\1\0\1\1"+
+    "\3\0\1\136\7\0\1\64\17\0\1\137\2\102\2\0"+
+    "\11\21\1\23\12\21\1\0\1\35\7\2\1\64\10\2"+
+    "\1\64\6\2\24\0\1\102\1\140\12\21\1\0\1\35"+
+    "\5\2\1\141\12\2\14\0\1\142\3\21\1\0\10\2"+
+    "\10\0\1\21\1\0\3\2\2\0\1\143\4\0\1\21"+
+    "\1\144\1\2\1\145\1\146\6\0\1\147";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[804];
+    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\127\0\256\0\u0105\0\u015c\0\u01b3\0\u020a\0\u0261"+
+    "\0\u02b8\0\u030f\0\u0366\0\u03bd\0\u0414\0\u046b\0\u04c2\0\u0519"+
+    "\0\u0570\0\u05c7\0\u061e\0\u0675\0\u06cc\0\u0723\0\u077a\0\u07d1"+
+    "\0\u0828\0\u087f\0\u08d6\0\u092d\0\u0984\0\u09db\0\u0a32\0\u0a89"+
+    "\0\u092d\0\u0ae0\0\u0b37\0\u0b8e\0\u0be5\0\u0c3c\0\u092d\0\u0c93"+
+    "\0\u0cea\0\u092d\0\u092d\0\u0d41\0\u0d98\0\u092d\0\u0def\0\u092d"+
+    "\0\u092d\0\u092d\0\u0e46\0\u092d\0\u0e9d\0\u0ef4\0\u0f4b\0\u0fa2"+
+    "\0\u0ff9\0\u1050\0\u10a7\0\u10fe\0\u1155\0\u11ac\0\u1203\0\u125a"+
+    "\0\u12b1\0\u1308\0\u135f\0\u13b6\0\u140d\0\u1464\0\u14bb\0\u0e46"+
+    "\0\u1512\0\u092d\0\u1569\0\u092d\0\u15c0\0\u092d\0\u092d\0\u092d"+
+    "\0\u092d\0\u092d\0\u092d\0\u092d\0\u1617\0\u092d\0\u166e\0\u16c5"+
+    "\0\u092d\0\u092d\0\u171c\0\u1773\0\u17ca\0\u1821\0\u1878\0\u18cf"+
+    "\0\u1926\0\u197d\0\u092d\0\u19d4\0\u1a2b\0\u1a82\0\u092d\0\u1ad9"+
+    "\0\u1b30\0\u1b87\0\u1bde\0\u1c35\0\u1c8c\0\u1ce3\0\u1d3a\0\u1d91"+
+    "\0\u1de8\0\u1e3f\0\u1e96\0\u1eed\0\u1f44\0\u1f9b\0\u092d\0\u1ff2"+
+    "\0\u2049\0\u20a0\0\u092d\0\u092d\0\u20f7\0\u214e\0\u092d\0\u20f7"+
+    "\0\u092d\0\u21a5\0\u092d\0\u21fc\0\u2253\0\u22aa\0\u2301\0\u2358"+
+    "\0\u23af\0\u092d\0\u2406\0\u092d\0\u092d\0\u245d\0\u092d\0\u24b4"+
+    "\0\u250b\0\u2562\0\u25b9\0\u2610\0\u092d\0\u092d\0\u092d\0\u092d"+
+    "\0\u245d\0\u24b4\0\u2667\0\u26be\0\u092d\0\u092d\0\u092d\0\u092d"+
+    "\0\u245d\0\u092d\0\u2715\0\u276c\0\u27c3\0\u281a\0\u2871\0\u28c8"+
+    "\0\u092d\0\u092d\0\u092d\0\u092d\0\u291f\0\u092d\0\u092d\0\u2976"+
+    "\0\u092d\0\u29cd\0\u2a24\0\u2a7b\0\u2ad2\0\u2b29\0\u2b80\0\u2bd7"+
+    "\0\u2c2e\0\u092d\0\u092d\0\u2c85\0\u2cdc\0\u2d33\0\u2d8a\0\u2de1"+
+    "\0\u092d\0\u2e38\0\u2e8f\0\u2ee6\0\u2f3d\0\u2f94\0\u2feb\0\u3042"+
+    "\0\u3099\0\u30f0\0\u3147\0\u319e\0\u31f5\0\u324c\0\u32a3\0\u32fa"+
+    "\0\u3351\0\u33a8\0\u33ff\0\u3456\0\u34ad\0\u3504\0\u355b\0\u35b2"+
+    "\0\u3609\0\u3660\0\u36b7\0\u370e\0\u3765\0\u37bc\0\u3813\0\u386a"+
+    "\0\u38c1\0\u3918\0\u396f\0\u39c6\0\u3a1d\0\u3a74\0\u3acb\0\u3b22"+
+    "\0\u3b79\0\u3bd0\0\u3c27\0\u3c7e\0\u3cd5\0\u3d2c\0\u3d83\0\u3dda"+
+    "\0\u3e31\0\u3e88\0\u3edf\0\u3f36\0\u3f8d\0\u3fe4\0\u403b\0\u4092"+
+    "\0\u40e9\0\u4140\0\u4197\0\u41ee\0\u4245\0\u429c\0\u42f3\0\u434a"+
+    "\0\u43a1\0\u43f8\0\u444f\0\u44a6\0\u092d\0\u19d4\0\u44fd\0\u4554"+
+    "\0\u092d\0\u45ab\0\u4602\0\u4554\0\u4659\0\u46b0\0\u4707\0\u475e"+
+    "\0\u475e\0\u47b5\0\u475e\0\u480c\0\u4863\0\u48ba\0\u4911\0\u4968"+
+    "\0\u49bf\0\u4a16\0\u1773\0\u4a6d\0\u4ac4\0\u4b1b\0\u4b72\0\u4bc9"+
+    "\0\u4c20\0\u4c77\0\u4cce\0\u4d25\0\u4d7c\0\u4dd3\0\u4e2a\0\u4e81"+
+    "\0\u4ed8\0\u4f2f\0\u4f86\0\u4fdd\0\u5034\0\u508b\0\u50e2\0\u5139"+
+    "\0\u5190\0\u51e7\0\u523e\0\u5295\0\u52ec\0\u5343\0\u539a\0\u53f1"+
+    "\0\u5448\0\u549f\0\u54f6\0\u554d\0\u55a4\0\u55fb\0\u5652\0\u56a9"+
+    "\0\u5700\0\u5757\0\u57ae\0\u5805\0\u585c\0\u58b3\0\u590a\0\u092d"+
+    "\0\u5961\0\u59b8\0\u5a0f\0\u092d\0\u5a66\0\u5abd\0\u5b14\0\u5b6b"+
+    "\0\u5bc2\0\u5c19\0\u092d\0\u5c70\0\u5cc7\0\u5d1e\0\u5d75\0\u5dcc"+
+    "\0\u5e23\0\u5e7a\0\u5ed1\0\u5f28\0\u5f7f\0\u5fd6\0\u602d\0\u6084"+
+    "\0\u60db\0\u6132\0\u092d\0\u6189\0\u61e0\0\u6237\0\u628e\0\u62e5"+
+    "\0\u2871\0\u633c\0\u092d\0\u092d\0\u6393\0\u63ea\0\u6441\0\u6498"+
+    "\0\u2b29\0\u64ef\0\u6546\0\u659d\0\u092d\0\u65f4\0\u664b\0\u66a2"+
+    "\0\u66f9\0\u6750\0\u67a7\0\u67fe\0\u6855\0\u68ac\0\u6903\0\u695a"+
+    "\0\u69b1\0\u6a08\0\u6a5f\0\u6ab6\0\u6b0d\0\u6b64\0\u6bbb\0\u6c12"+
+    "\0\u6c69\0\u6cc0\0\u6d17\0\u6d6e\0\u6dc5\0\u6e1c\0\u6e73\0\u6eca"+
+    "\0\u6f21\0\u6f78\0\u6fcf\0\u7026\0\u707d\0\u70d4\0\u712b\0\u3765"+
+    "\0\u7182\0\u71d9\0\u7230\0\u7287\0\u72de\0\u7335\0\u738c\0\u73e3"+
+    "\0\u743a\0\u7491\0\u74e8\0\u753f\0\u7596\0\u75ed\0\u7644\0\u11ac"+
+    "\0\u769b\0\u76f2\0\u7749\0\u77a0\0\u77f7\0\u784e\0\u78a5\0\u78fc"+
+    "\0\u7953\0\u79aa\0\u7a01\0\u7a58\0\u7aaf\0\u7b06\0\u7b5d\0\u7bb4"+
+    "\0\u7c0b\0\u7c62\0\u7cb9\0\u7d10\0\u7d67\0\u7dbe\0\u7e15\0\u7e6c"+
+    "\0\u475e\0\u7ec3\0\u7f1a\0\u7f71\0\u7fc8\0\u801f\0\u8076\0\u80cd"+
+    "\0\u8124\0\u817b\0\u81d2\0\u8229\0\u8280\0\u82d7\0\u832e\0\u8385"+
+    "\0\u83dc\0\u8433\0\u848a\0\u84e1\0\u8538\0\u858f\0\u85e6\0\u1773"+
+    "\0\u863d\0\u8694\0\u86eb\0\u8742\0\u8799\0\u87f0\0\u8847\0\u889e"+
+    "\0\u88f5\0\u894c\0\u89a3\0\u89fa\0\u8a51\0\u8aa8\0\u8aff\0\u8b56"+
+    "\0\u8bad\0\u8c04\0\u8c5b\0\u8cb2\0\u8d09\0\u8d60\0\u8db7\0\u8e0e"+
+    "\0\u8e65\0\u8ebc\0\u8f13\0\u8f6a\0\u8fc1\0\u9018\0\u906f\0\u90c6"+
+    "\0\u911d\0\u9174\0\u91cb\0\u9222\0\u9279\0\u92d0\0\u9327\0\u937e"+
+    "\0\u93d5\0\u942c\0\u9483\0\u94da\0\u9531\0\u9588\0\u95df\0\u9636"+
+    "\0\u968d\0\u96e4\0\u973b\0\u9792\0\u97e9\0\u9840\0\u9897\0\u98ee"+
+    "\0\u9945\0\u999c\0\u99f3\0\u9a4a\0\u9aa1\0\u9af8\0\u9b4f\0\u9ba6"+
+    "\0\u9bfd\0\u9c54\0\u9cab\0\u092d\0\u9d02\0\u9d59\0\u9db0\0\u9e07"+
+    "\0\u9e5e\0\u9eb5\0\u9f0c\0\u9f63\0\u9fba\0\ua011\0\ua068\0\ua0bf"+
+    "\0\ua116\0\ua16d\0\ua1c4\0\ua21b\0\ua272\0\ua2c9\0\ua320\0\ua377"+
+    "\0\ua3ce\0\ua425\0\ua47c\0\ua4d3\0\ua52a\0\u386a\0\ua581\0\u7026"+
+    "\0\ua5d8\0\ua62f\0\ua686\0\ua6dd\0\ua734\0\ua78b\0\ua7e2\0\ua839"+
+    "\0\ua890\0\ua8e7\0\ua93e\0\u092d\0\ua995\0\ua9ec\0\uaa43\0\uaa9a"+
+    "\0\uaaf1\0\uab48\0\uab9f\0\uabf6\0\uac4d\0\u1773\0\uaca4\0\uacfb"+
+    "\0\uad52\0\uada9\0\uae00\0\uae57\0\u1773\0\uaeae\0\uaf05\0\uaf5c"+
+    "\0\uafb3\0\ub00a\0\ub061\0\ub0b8\0\ub10f\0\ub166\0\ub1bd\0\ub214"+
+    "\0\ub26b\0\ub2c2\0\ub319\0\u1773\0\ub370\0\u1773\0\ub3c7\0\ub41e"+
+    "\0\ub475\0\ub4cc\0\u59b8\0\u092d\0\ub523\0\ub57a\0\ub5d1\0\ub628"+
+    "\0\ub67f\0\ub6d6\0\ub72d\0\ub784\0\ub7db\0\ub832\0\ub889\0\u092d"+
+    "\0\ub8e0\0\ub937\0\ub98e\0\ub9e5\0\uba3c\0\uba93\0\ubaea\0\ubb41"+
+    "\0\ubb98\0\ubbef\0\ubc46\0\ubc9d\0\ubcf4\0\ubd4b\0\ubda2\0\ubdf9"+
+    "\0\ube50\0\ubea7\0\ubefe\0\u9db0\0\ubf55\0\ubfac\0\uc003\0\uc05a"+
+    "\0\uc0b1\0\uc108\0\uc15f\0\uc1b6\0\uc20d\0\uc264\0\uc264\0\uc2bb"+
+    "\0\uc312\0\uc369\0\uc3c0\0\uc417\0\uc46e\0\uc4c5\0\uc51c\0\uc573"+
+    "\0\uc5ca\0\uc621\0\uc678\0\uc6cf\0\uc726\0\uc77d\0\uc7d4\0\uc82b"+
+    "\0\uc882\0\u8280\0\uc8d9\0\uc930\0\uc987\0\uc9de\0\uca35\0\uca8c"+
+    "\0\ucae3\0\ucb3a\0\ucb91\0\ucbe8\0\ucc3f\0\ucc96\0\ucced\0\ucd44"+
+    "\0\ucd9b\0\ucdf2\0\uce49\0\ub628\0\ucea0\0\ucef7\0\ucf4e\0\ucfa5"+
+    "\0\ucffc\0\ud053\0\ud0aa\0\ud101\0\ud158\0\ud1af\0\ud206\0\ud25d"+
+    "\0\ud2b4\0\ud30b\0\ud362\0\ud3b9\0\ubdf9\0\ud410\0\u2bd7\0\ud467"+
+    "\0\ud4be\0\ud515\0\ud56c\0\ud5c3\0\ud61a\0\ud671\0\ud6c8\0\ud71f"+
+    "\0\ud776\0\ud7cd\0\ud824\0\ud87b\0\ud8d2\0\ud929\0\ud980\0\ud9d7"+
+    "\0\u1773\0\uda2e\0\uda85\0\udadc\0\udb33\0\udb8a\0\udbe1\0\udc38"+
+    "\0\udc8f\0\udce6\0\udd3d\0\udd94\0\uddeb\0\ude42\0\ude99\0\udef0"+
+    "\0\udf47\0\udf9e\0\udff5\0\ue04c\0\ue0a3\0\ue0fa\0\ue151\0\u2bd7"+
+    "\0\ue1a8\0\ue1ff\0\ue256\0\ue2ad\0\ue304\0\ue35b\0\ue3b2\0\ue409"+
+    "\0\ue460\0\ue4b7\0\ue50e\0\ue565\0\ue5bc\0\ue613\0\ue66a\0\ue6c1"+
+    "\0\ue718\0\ue76f\0\ue7c6\0\ue81d\0\ue874\0\ue8cb\0\ue922\0\ue979"+
+    "\0\ue9d0\0\uea27\0\uea7e\0\u092d\0\uead5\0\ueb2c\0\ueb83\0\uebda"+
+    "\0\uec31\0\u092d\0\uec88\0\u092d\0\u092d\0\uecdf\0\ued36\0\ued8d"+
+    "\0\uede4\0\uee3b\0\uee92\0\u092d";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[804];
+    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\32\1\33\1\34\1\35\1\36\1\37\121\32\2\40"+
+    "\1\41\26\40\1\42\31\40\1\43\5\40\1\44\15\40"+
+    "\1\45\17\40\2\46\1\47\47\46\1\50\54\46\2\51"+
+    "\1\52\14\51\1\53\107\51\1\54\1\55\1\0\1\54"+
+    "\1\36\2\54\1\56\1\57\6\54\1\60\26\54\1\61"+
+    "\37\54\1\62\20\54\2\63\1\0\1\63\1\64\2\63"+
+    "\2\64\1\65\1\66\1\67\1\70\1\71\1\72\1\64"+
+    "\1\63\1\73\1\74\3\63\1\75\3\63\1\76\6\63"+
+    "\1\77\4\63\1\64\6\63\1\70\1\63\1\67\1\100"+
+    "\1\72\1\101\1\102\1\66\1\73\1\103\1\104\1\65"+
+    "\1\77\1\63\1\71\1\74\1\105\1\106\1\107\1\75"+
+    "\5\63\1\64\1\63\1\104\1\100\1\101\1\105\1\103"+
+    "\1\76\1\63\1\106\1\110\1\107\1\102\4\63\7\111"+
+    "\1\112\117\111\106\113\1\112\20\113\1\54\1\55\1\0"+
+    "\1\54\1\36\2\54\1\114\1\115\6\54\1\116\26\54"+
+    "\1\61\37\54\1\117\20\54\7\111\1\120\117\111\106\113"+
+    "\1\120\20\113\1\54\1\55\1\0\1\54\1\36\2\54"+
+    "\1\121\1\115\6\54\1\122\26\54\1\61\37\54\1\123"+
+    "\20\54\7\111\1\124\117\111\106\113\1\124\20\113\1\125"+
+    "\1\36\1\126\1\127\1\36\1\130\1\131\1\132\1\133"+
+    "\3\134\1\135\2\134\1\136\4\134\1\137\1\140\1\134"+
+    "\1\137\1\134\1\141\1\142\1\143\2\125\1\134\1\144"+
+    "\2\134\1\145\1\146\1\147\1\131\4\144\3\61\1\150"+
+    "\1\151\1\152\1\134\1\153\1\154\1\134\1\155\1\156"+
+    "\1\157\1\160\1\161\1\162\1\134\1\163\1\164\2\134"+
+    "\1\165\1\166\1\125\2\147\1\134\1\147\1\167\1\170"+
+    "\2\134\1\171\10\134\1\137\2\134\1\147\2\172\1\173"+
+    "\4\172\1\174\25\172\1\175\71\172\2\176\1\177\32\176"+
+    "\1\200\50\176\1\201\20\176\2\202\1\203\1\204\33\202"+
+    "\1\205\23\202\1\206\5\202\1\207\15\202\1\210\17\202"+
+    "\2\211\1\212\1\213\57\211\1\206\5\211\1\207\15\211"+
+    "\1\210\17\211\1\214\1\36\1\215\1\216\1\36\1\214"+
+    "\1\147\1\217\1\220\6\221\1\61\4\221\2\214\1\221"+
+    "\1\214\3\221\1\214\1\222\1\214\1\61\3\221\1\61"+
+    "\1\221\1\214\1\131\2\61\3\214\1\223\1\61\24\221"+
+    "\1\224\2\147\1\221\1\147\1\225\14\221\1\214\2\221"+
+    "\1\226\1\227\1\36\1\230\1\231\1\36\3\227\1\232"+
+    "\6\233\1\227\4\233\2\227\1\233\1\227\3\233\4\227"+
+    "\1\234\2\233\2\227\1\235\6\227\1\236\1\227\24\233"+
+    "\3\227\1\233\2\227\14\233\1\227\2\233\1\227\1\237"+
+    "\1\36\1\240\1\241\1\36\1\237\1\242\1\217\1\243"+
+    "\6\244\1\237\4\244\2\245\1\244\1\245\1\244\1\246"+
+    "\1\244\1\237\1\247\1\244\2\237\2\244\1\237\1\131"+
+    "\1\235\1\131\3\237\1\250\3\237\24\244\1\237\1\251"+
+    "\1\252\1\244\1\237\1\225\14\244\1\245\2\244\1\237"+
+    "\2\172\1\253\4\172\1\254\25\172\1\255\71\172\2\176"+
+    "\1\256\32\176\1\255\50\176\1\257\20\176\2\260\1\261"+
+    "\34\260\1\262\23\260\1\263\5\260\1\264\15\260\1\265"+
+    "\17\260\2\32\4\0\122\32\1\33\2\0\1\36\1\0"+
+    "\121\32\137\0\1\266\1\267\5\270\1\0\10\270\2\0"+
+    "\1\270\5\0\2\270\7\0\1\271\1\272\2\0\13\270"+
+    "\1\267\10\270\3\0\1\270\2\0\17\270\2\0\1\36"+
+    "\2\0\1\36\122\0\4\37\1\0\1\37\1\273\120\37"+
+    "\2\40\1\0\26\40\1\0\31\40\1\0\5\40\1\0"+
+    "\15\40\1\0\17\40\31\0\1\274\156\0\1\275\122\0"+
+    "\1\276\3\0\1\277\154\0\1\300\17\0\2\46\1\0"+
+    "\47\46\1\0\54\46\17\0\1\301\107\0\2\51\1\0"+
+    "\14\51\1\0\107\51\2\54\1\0\1\54\1\0\2\54"+
+    "\2\0\6\54\1\0\26\54\1\0\37\54\1\0\21\54"+
+    "\1\55\1\0\1\54\1\36\2\54\2\0\6\54\1\0"+
+    "\26\54\1\0\37\54\1\0\20\54\17\0\1\60\107\0"+
+    "\2\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+    "\26\63\1\0\37\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\1\63\1\302\2\63\1\303\1\304\1\0"+
+    "\2\63\1\305\7\63\1\306\13\63\1\0\11\63\1\307"+
+    "\1\304\2\63\1\302\2\63\1\310\3\63\1\303\1\305"+
+    "\1\311\10\63\1\0\1\63\1\310\1\307\1\63\1\311"+
+    "\1\63\1\306\13\63\1\0\1\63\1\0\2\63\2\0"+
+    "\3\63\1\312\2\63\1\0\2\63\1\313\23\63\1\0"+
+    "\6\63\1\312\2\63\1\314\6\63\1\315\4\63\1\313"+
+    "\11\63\1\0\1\63\1\315\1\314\17\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\12\63\1\316\13\63"+
+    "\1\0\37\63\1\0\6\63\1\316\13\63\1\0\1\63"+
+    "\1\0\2\63\2\0\1\317\5\63\1\0\1\63\1\320"+
+    "\17\63\1\321\4\63\1\0\13\63\1\322\2\63\1\320"+
+    "\2\63\1\317\1\321\3\63\1\323\10\63\1\0\3\63"+
+    "\1\322\1\323\15\63\1\0\1\63\1\0\2\63\2\0"+
+    "\2\63\1\324\3\63\1\0\1\63\1\325\24\63\1\0"+
+    "\10\63\1\324\5\63\1\325\1\63\1\326\16\63\1\0"+
+    "\1\63\1\326\20\63\1\0\1\63\1\0\2\63\2\0"+
+    "\2\63\1\110\1\327\1\63\1\110\1\0\2\63\1\330"+
+    "\3\63\1\331\12\63\1\332\4\63\1\0\6\63\1\327"+
+    "\1\63\1\110\1\63\1\110\1\63\1\333\2\63\1\110"+
+    "\1\334\1\63\1\332\2\63\1\330\3\63\1\331\5\63"+
+    "\1\0\1\63\1\334\3\63\1\110\5\63\1\333\6\63"+
+    "\1\0\1\63\1\0\2\63\2\0\3\63\1\335\2\63"+
+    "\1\0\2\63\1\336\23\63\1\0\6\63\1\335\11\63"+
+    "\1\337\4\63\1\336\11\63\1\0\1\63\1\337\20\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+    "\1\0\26\63\1\340\1\63\1\341\6\63\1\0\4\63"+
+    "\1\340\5\63\1\341\7\63\1\0\1\63\1\0\2\63"+
+    "\2\0\2\63\1\110\1\323\2\63\1\0\1\63\1\342"+
+    "\10\63\1\343\13\63\1\0\6\63\1\323\1\344\1\110"+
+    "\1\345\4\63\1\342\1\346\1\347\16\63\1\0\1\63"+
+    "\1\347\1\345\2\63\1\346\1\343\1\344\12\63\1\0"+
+    "\1\63\1\0\2\63\2\0\6\63\1\0\1\63\1\110"+
+    "\24\63\1\0\16\63\1\110\20\63\1\0\22\63\1\0"+
+    "\1\63\1\0\2\63\2\0\2\63\1\350\1\351\2\63"+
+    "\1\0\26\63\1\0\6\63\1\351\1\63\1\350\1\352"+
+    "\25\63\1\0\2\63\1\352\17\63\1\0\1\63\1\0"+
+    "\2\63\2\0\4\63\1\353\1\63\1\0\1\63\1\110"+
+    "\4\63\1\354\3\63\1\355\13\63\1\0\16\63\1\110"+
+    "\5\63\1\353\4\63\1\354\5\63\1\0\6\63\1\355"+
+    "\13\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+    "\2\63\1\356\23\63\1\0\11\63\1\357\6\63\1\360"+
+    "\4\63\1\356\11\63\1\0\1\63\1\360\1\357\17\63"+
+    "\1\0\1\63\1\0\2\63\2\0\2\63\1\110\2\63"+
+    "\1\361\1\0\2\63\1\362\23\63\1\0\10\63\1\110"+
+    "\1\63\1\361\12\63\1\362\11\63\1\0\14\63\1\110"+
+    "\5\63\1\0\1\63\1\0\2\63\2\0\3\63\1\363"+
+    "\1\63\1\110\1\0\1\63\1\110\1\364\16\63\1\365"+
+    "\4\63\1\0\6\63\1\363\3\63\1\110\3\63\2\110"+
+    "\1\366\1\63\1\365\2\63\1\364\11\63\1\0\1\63"+
+    "\1\366\3\63\1\110\14\63\1\0\1\63\1\0\2\63"+
+    "\2\0\1\367\1\370\1\371\1\63\1\372\1\63\1\0"+
+    "\6\63\1\373\3\63\1\374\13\63\1\0\10\63\1\371"+
+    "\4\63\1\370\1\63\1\375\1\63\1\367\2\63\1\372"+
+    "\4\63\1\373\5\63\1\0\5\63\1\375\1\374\13\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\2\63"+
+    "\1\376\7\63\1\377\13\63\1\0\20\63\1\u0100\4\63"+
+    "\1\376\11\63\1\0\1\63\1\u0100\4\63\1\377\13\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\2\63"+
+    "\1\u0101\3\63\1\u0102\17\63\1\0\25\63\1\u0101\3\63"+
+    "\1\u0102\5\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+    "\2\0\3\63\1\u0103\2\63\1\0\26\63\1\0\6\63"+
+    "\1\u0103\11\63\1\u0104\16\63\1\0\1\63\1\u0104\16\63"+
+    "\7\111\1\0\117\111\106\113\1\0\20\113\17\0\1\u0105"+
+    "\107\0\1\125\10\0\6\125\1\0\11\125\1\0\1\125"+
+    "\1\0\3\125\1\0\2\125\13\0\25\125\2\0\1\125"+
+    "\2\0\17\125\4\0\1\u0106\4\0\1\u0107\35\0\1\61"+
+    "\65\0\1\61\40\0\1\61\60\0\10\u0108\1\u0109\24\u0108"+
+    "\1\u010a\1\u0108\1\u010b\6\u0108\1\u010c\60\u0108\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\24\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\5\134\1\u010e\16\134\1\125\2\0\1\134\2\0"+
+    "\17\134\20\0\1\u010f\26\0\1\61\60\0\1\u0110\10\0"+
+    "\6\u0110\1\0\1\u0110\1\u0111\1\u0112\1\u0110\2\137\1\u0110"+
+    "\1\137\1\u0110\1\0\1\u0110\1\0\3\u0110\1\0\1\u0110"+
+    "\1\u0113\1\0\1\u0114\11\0\10\u0110\1\u0111\1\u0113\2\u0110"+
+    "\1\u0113\2\u0110\1\u0112\5\u0110\2\0\1\u0110\2\0\5\u0110"+
+    "\1\u0113\6\u0110\1\137\2\u0110\1\0\1\u0110\10\0\6\u0110"+
+    "\1\0\1\u0110\1\u0111\1\u0112\1\u0110\1\u0115\1\u0116\1\u0110"+
+    "\1\u0116\1\u0110\1\0\1\u0110\1\0\3\u0110\1\0\1\u0117"+
+    "\1\u0113\1\0\1\u0114\11\0\10\u0110\1\u0111\1\u0113\2\u0110"+
+    "\1\u0113\2\u0110\1\u0112\5\u0110\2\0\1\u0117\2\0\5\u0110"+
+    "\1\u0113\6\u0110\1\u0116\2\u0110\32\0\1\61\14\0\1\61"+
+    "\60\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\5\134"+
+    "\1\u0118\16\134\1\125\2\0\1\134\2\0\17\134\47\0"+
+    "\1\61\122\0\1\61\3\0\1\61\104\0\2\u0114\1\0"+
+    "\1\u0114\73\0\1\u0114\3\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\5\134\1\u0119\5\134\1\u011a\1\u011b\3\134"+
+    "\1\u011c\3\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\3\134\1\u011d"+
+    "\20\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\17\134\1\u011e\4\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\2\134\1\u011f\3\134\1\u0120"+
+    "\6\134\1\u0121\6\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\u0122"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\12\134"+
+    "\1\u0123\4\134\1\u0124\4\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\3\134\1\u0125\2\134\1\u0126\1\134\1\u0127\1\134\1\u0128"+
+    "\11\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\3\134\1\u0129\13\134"+
+    "\1\u012a\4\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\3\134\1\u012b"+
+    "\13\134\1\u012c\4\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\23\134"+
+    "\1\u012d\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\u012e\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u012f\1\134"+
+    "\1\u0130\6\134\1\u0131\6\134\1\125\2\0\1\134\2\0"+
+    "\1\u0132\16\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\u0133\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\1\u0134\2\134\1\u0135\4\134\1\u0136\1\134\1\u0137"+
+    "\11\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\u0138\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\2\134\1\u0139\7\134"+
+    "\1\u013a\11\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\5\134\1\u013b"+
+    "\2\134\1\u013c\1\134\1\u013d\1\u013e\6\134\1\u013f\1\134"+
+    "\1\125\2\0\1\u0140\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\3\134\1\u0141\6\134\1\u0135"+
+    "\11\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\2\134\1\u0142\1\u0143"+
+    "\11\134\1\u0144\6\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\1\u0145"+
+    "\5\134\1\u0146\15\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\12\134"+
+    "\1\u0147\11\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\2\172\1\0\4\172\1\0\25\172\1\0\71\172\2\u0148"+
+    "\1\0\27\u0148\1\u0149\51\u0148\1\u014a\22\u0148\2\176\1\0"+
+    "\32\176\1\0\50\176\1\0\20\176\2\202\2\0\33\202"+
+    "\1\0\23\202\1\0\5\202\1\0\15\202\1\0\17\202"+
+    "\10\0\1\u014b\126\0\1\u014c\177\0\1\u014d\122\0\1\u014e"+
+    "\3\0\1\u014f\154\0\1\u0150\17\0\2\211\2\0\57\211"+
+    "\1\0\5\211\1\0\15\211\1\0\17\211\10\0\1\u0151"+
+    "\126\0\1\u0152\155\0\1\u0153\100\0\6\221\1\0\13\221"+
+    "\5\0\2\221\1\0\1\221\11\0\24\221\3\0\1\221"+
+    "\2\0\17\221\12\0\6\u0154\1\0\4\u0154\2\0\1\u0154"+
+    "\1\0\3\u0154\4\0\3\u0154\1\0\1\u0154\11\0\24\u0154"+
+    "\3\0\1\u0154\2\0\14\u0154\1\0\2\u0154\54\0\1\u0155"+
+    "\3\0\1\u0156\1\u0157\1\u0158\1\u0159\1\u015a\1\u015b\1\u015c"+
+    "\1\u015d\1\u015e\1\0\1\u015f\2\0\1\u0160\2\0\1\u0161"+
+    "\40\0\6\u0162\1\0\4\u0162\2\0\1\u0162\1\0\3\u0162"+
+    "\4\0\3\u0162\1\0\1\u0162\11\0\24\u0162\3\0\1\u0162"+
+    "\2\0\14\u0162\1\0\2\u0162\12\0\6\233\1\0\13\233"+
+    "\5\0\2\233\13\0\24\233\3\0\1\233\2\0\17\233"+
+    "\12\0\6\233\1\0\4\233\2\0\1\233\1\0\3\233"+
+    "\5\0\2\233\13\0\24\233\3\0\1\233\2\0\14\233"+
+    "\1\0\2\233\11\0\7\244\1\0\4\244\2\0\1\244"+
+    "\1\0\3\244\2\0\1\244\1\0\1\u0153\2\244\13\0"+
+    "\24\244\2\0\1\252\1\244\2\0\14\244\1\0\2\244"+
+    "\11\0\7\244\1\0\4\244\2\0\1\244\1\0\3\244"+
+    "\2\0\1\244\2\0\2\244\13\0\24\244\2\0\1\252"+
+    "\1\244\2\0\14\244\1\0\2\244\25\0\2\245\1\0"+
+    "\1\245\13\0\1\245\4\0\1\u0163\4\0\1\u0164\6\0"+
+    "\1\u0165\3\0\1\u0163\2\0\1\u0166\1\u0167\1\u0168\25\0"+
+    "\1\245\13\0\7\244\1\0\4\244\2\245\1\244\1\245"+
+    "\3\244\2\0\1\244\2\0\2\244\13\0\24\244\2\0"+
+    "\1\252\1\244\2\0\14\244\1\245\2\244\13\0\1\u0169"+
+    "\7\0\1\u0169\1\0\4\u0169\11\0\1\u0169\22\0\1\u0169"+
+    "\1\0\2\u0169\1\0\1\u0169\2\0\1\u0169\3\0\1\u0169"+
+    "\7\0\1\u0169\3\0\1\u0169\6\0\1\u0169\60\0\1\u016a"+
+    "\51\0\2\u016b\1\0\124\u016b\2\260\1\0\34\260\1\0"+
+    "\23\260\1\0\5\260\1\0\15\260\1\0\17\260\10\0"+
+    "\1\u016c\177\0\1\u016d\122\0\1\u016e\3\0\1\u016f\154\0"+
+    "\1\u0170\30\0\6\u0171\1\0\10\u0171\2\0\1\u0171\5\0"+
+    "\2\u0171\13\0\24\u0171\3\0\1\u0171\2\0\17\u0171\12\0"+
+    "\1\270\1\u0172\3\270\1\u0173\1\0\10\270\2\0\1\270"+
+    "\5\0\2\270\13\0\4\270\1\u0173\2\270\1\u0172\14\270"+
+    "\3\0\1\270\2\0\17\270\12\0\6\270\1\0\10\270"+
+    "\2\0\1\270\5\0\2\270\13\0\24\270\3\0\1\270"+
+    "\2\0\17\270\32\0\1\u0174\114\0\1\u0175\170\0\1\u0176"+
+    "\132\0\1\u0177\134\0\1\u0178\142\0\1\u0179\17\0\2\63"+
+    "\1\0\1\63\1\0\2\63\2\0\2\63\1\u017a\3\63"+
+    "\1\0\26\63\1\0\10\63\1\u017a\26\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+    "\1\0\20\63\1\u017b\16\63\1\0\1\63\1\u017b\20\63"+
+    "\1\0\1\63\1\0\2\63\2\0\2\63\1\u017c\3\63"+
+    "\1\0\1\316\25\63\1\0\10\63\1\u017c\12\63\1\316"+
+    "\13\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+    "\1\63\1\u017d\1\u017e\3\63\1\0\1\63\1\u017f\24\63"+
+    "\1\0\10\63\1\u017e\4\63\1\u017d\1\u017f\20\63\1\0"+
+    "\22\63\1\0\1\63\1\0\2\63\2\0\4\63\1\110"+
+    "\1\63\1\0\6\63\1\110\17\63\1\0\24\63\1\110"+
+    "\4\63\1\110\5\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\12\63\1\u0180\13\63\1\0"+
+    "\37\63\1\0\6\63\1\u0180\13\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\26\63\1\u0181"+
+    "\10\63\1\0\4\63\1\u0181\15\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\20\63\1\u0182"+
+    "\16\63\1\0\1\63\1\u0182\20\63\1\0\1\63\1\0"+
+    "\2\63\2\0\5\63\1\u0183\1\0\26\63\1\0\12\63"+
+    "\1\u0183\24\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+    "\2\0\6\63\1\0\26\63\1\0\13\63\1\u0184\23\63"+
+    "\1\0\3\63\1\u0184\16\63\1\0\1\63\1\0\2\63"+
+    "\2\0\6\63\1\0\1\63\1\u0185\24\63\1\0\16\63"+
+    "\1\u0185\1\u0183\6\63\1\u0186\10\63\1\0\4\63\1\u0186"+
+    "\1\u0183\14\63\1\0\1\63\1\0\2\63\2\0\4\63"+
+    "\1\u017d\1\63\1\0\26\63\1\0\13\63\1\u0187\10\63"+
+    "\1\u017d\12\63\1\0\3\63\1\u0187\16\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\1\63\1\u0183\24\63"+
+    "\1\0\16\63\1\u0183\20\63\1\0\22\63\1\0\1\63"+
+    "\1\0\2\63\2\0\3\63\1\u0188\2\63\1\0\26\63"+
+    "\1\0\6\63\1\u0188\30\63\1\0\22\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\20\63"+
+    "\1\u0189\16\63\1\0\1\63\1\u0189\20\63\1\0\1\63"+
+    "\1\0\2\63\2\0\2\63\1\u018a\3\63\1\0\26\63"+
+    "\1\0\10\63\1\u018a\26\63\1\0\22\63\1\0\1\63"+
+    "\1\0\2\63\2\0\1\110\3\63\1\u018b\1\63\1\0"+
+    "\26\63\1\0\21\63\1\110\2\63\1\u018b\12\63\1\0"+
+    "\22\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+    "\26\63\1\0\7\63\1\110\27\63\1\0\7\63\1\110"+
+    "\12\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+    "\2\63\1\110\23\63\1\0\11\63\1\u018c\13\63\1\110"+
+    "\11\63\1\0\2\63\1\u018c\17\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\20\63\1\u018d"+
+    "\16\63\1\0\1\63\1\u018d\20\63\1\0\1\63\1\0"+
+    "\2\63\2\0\2\63\1\u018e\3\63\1\0\26\63\1\0"+
+    "\10\63\1\u018e\26\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\5\63\1\316\1\0\26\63\1\0\12\63"+
+    "\1\316\13\63\1\u0183\10\63\1\0\4\63\1\u0183\15\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\20\63"+
+    "\1\u018f\5\63\1\0\35\63\1\u018f\1\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+    "\1\0\11\63\1\345\25\63\1\0\2\63\1\345\17\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+    "\1\0\11\63\1\u0190\25\63\1\0\2\63\1\u0190\17\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\2\63"+
+    "\1\u0191\23\63\1\0\25\63\1\u0191\11\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\6\63"+
+    "\1\316\17\63\1\0\31\63\1\316\5\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+    "\1\0\13\63\1\u0192\23\63\1\0\3\63\1\u0192\16\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+    "\1\0\7\63\1\u0193\27\63\1\0\7\63\1\u0193\12\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\1\u0194"+
+    "\5\63\1\u0195\17\63\1\0\23\63\1\u0194\5\63\1\u0195"+
+    "\5\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\6\63\1\u0196\17\63\1\0\31\63\1\u0196"+
+    "\5\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\2\63\1\u0197\23\63\1\0\25\63\1\u0197"+
+    "\11\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+    "\3\63\1\u0198\2\63\1\0\26\63\1\0\6\63\1\u0198"+
+    "\2\63\1\u0199\25\63\1\0\2\63\1\u0199\17\63\1\0"+
+    "\1\63\1\0\2\63\2\0\5\63\1\u019a\1\0\26\63"+
+    "\1\0\12\63\1\u019a\24\63\1\0\22\63\1\0\1\63"+
+    "\1\0\2\63\2\0\1\u019b\5\63\1\0\26\63\1\0"+
+    "\21\63\1\u019b\15\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\17\63\1\u019c"+
+    "\17\63\1\0\5\63\1\u019c\14\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\11\63\1\110"+
+    "\25\63\1\0\2\63\1\110\17\63\1\0\1\63\1\0"+
+    "\2\63\2\0\1\u019d\5\63\1\0\26\63\1\0\21\63"+
+    "\1\u019d\15\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+    "\2\0\6\63\1\0\26\63\1\0\20\63\1\u019e\16\63"+
+    "\1\0\1\63\1\u019e\20\63\1\0\1\63\1\0\2\63"+
+    "\2\0\6\63\1\0\2\63\1\u019f\23\63\1\0\7\63"+
+    "\1\u01a0\15\63\1\u019f\11\63\1\0\7\63\1\u01a0\12\63"+
+    "\1\0\1\63\1\0\2\63\2\0\2\63\1\u01a1\3\63"+
+    "\1\0\26\63\1\0\10\63\1\u01a1\1\u0184\1\63\1\u01a2"+
+    "\23\63\1\0\2\63\1\u0184\1\u01a2\16\63\1\0\1\63"+
+    "\1\0\2\63\2\0\5\63\1\u01a3\1\0\26\63\1\0"+
+    "\12\63\1\u01a3\24\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\37\63\1\0"+
+    "\15\63\1\u017f\4\63\1\0\1\63\1\0\2\63\2\0"+
+    "\5\63\1\u01a4\1\0\26\63\1\0\12\63\1\u01a4\24\63"+
+    "\1\0\22\63\1\0\1\63\1\0\2\63\2\0\1\u01a2"+
+    "\5\63\1\0\26\63\1\0\21\63\1\u01a2\15\63\1\0"+
+    "\22\63\1\0\1\63\1\0\2\63\2\0\1\u01a5\5\63"+
+    "\1\0\1\63\1\320\1\u01a6\3\63\1\u0104\12\63\1\u01a7"+
+    "\4\63\1\0\16\63\1\320\2\63\1\u01a5\1\u01a7\2\63"+
+    "\1\u01a6\3\63\1\u0104\5\63\1\0\22\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\30\63"+
+    "\1\110\6\63\1\0\12\63\1\110\7\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\26\63"+
+    "\1\u01a8\10\63\1\0\4\63\1\u01a8\15\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\20\63"+
+    "\1\u01a9\16\63\1\0\1\63\1\u01a9\20\63\1\0\1\63"+
+    "\1\0\2\63\2\0\2\63\1\110\3\63\1\0\26\63"+
+    "\1\0\10\63\1\110\7\63\1\u01aa\7\63\1\110\6\63"+
+    "\1\0\1\63\1\u01aa\10\63\1\110\7\63\1\0\1\63"+
+    "\1\0\2\63\2\0\5\63\1\u01ab\1\0\1\63\1\110"+
+    "\24\63\1\0\12\63\1\u01ab\3\63\1\110\20\63\1\0"+
+    "\22\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+    "\26\63\1\0\13\63\1\110\23\63\1\0\3\63\1\110"+
+    "\16\63\1\0\1\63\1\0\2\63\2\0\5\63\1\u01ac"+
+    "\1\0\26\63\1\0\12\63\1\u01ac\24\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\3\63\1\u01ad\2\63"+
+    "\1\0\26\63\1\0\6\63\1\u01ad\30\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\2\63\1\u01ae\3\63"+
+    "\1\0\26\63\1\0\10\63\1\u01ae\26\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\5\63\1\u01af\1\0"+
+    "\2\63\1\u01b0\23\63\1\0\12\63\1\u01af\12\63\1\u01b0"+
+    "\11\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+    "\4\63\1\u01b1\1\63\1\0\26\63\1\0\24\63\1\u01b1"+
+    "\12\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\6\63\1\u0104\17\63\1\0\31\63\1\u0104"+
+    "\5\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\26\63\1\0\17\63\1\u01b2\17\63\1\0"+
+    "\5\63\1\u01b2\14\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\26\63\1\0\17\63\1\u01b3\17\63\1\0"+
+    "\5\63\1\u01b3\14\63\1\0\1\63\1\0\2\63\2\0"+
+    "\5\63\1\u01b4\1\0\26\63\1\0\12\63\1\u01b4\1\u01b5"+
+    "\23\63\1\0\3\63\1\u01b5\16\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\1\63\1\u01b6\24\63\1\0"+
+    "\16\63\1\u01b6\20\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\2\63\1\u01b7\1\63\1\110\1\63\1\0"+
+    "\26\63\1\0\10\63\1\u01b7\13\63\1\110\12\63\1\0"+
+    "\22\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+    "\1\u01b8\25\63\1\0\23\63\1\u01b8\13\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+    "\1\0\17\63\1\110\17\63\1\0\5\63\1\110\14\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+    "\1\0\17\63\1\u01b9\17\63\1\0\5\63\1\u01b9\14\63"+
+    "\1\0\1\63\1\0\2\63\2\0\2\63\1\110\3\63"+
+    "\1\0\26\63\1\0\10\63\1\110\26\63\1\0\20\63"+
+    "\11\0\1\u01ba\56\0\1\u01ba\36\0\10\u0108\1\u01bb\24\u0108"+
+    "\1\u010a\73\u0108\1\0\124\u0108\37\0\1\u01bc\67\0\1\125"+
+    "\10\0\6\125\1\0\11\125\1\0\1\u01bd\1\0\3\125"+
+    "\1\0\2\125\13\0\25\125\2\0\1\125\2\0\17\125"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\14\134"+
+    "\1\u01be\7\134\1\125\2\0\1\134\2\0\17\134\20\0"+
+    "\1\144\26\0\1\61\60\0\1\u0110\10\0\6\u0110\1\0"+
+    "\11\u0110\1\0\1\u0110\1\0\3\u0110\1\0\2\u0110\13\0"+
+    "\25\u0110\2\0\1\u0110\2\0\17\u0110\1\0\1\u0110\10\0"+
+    "\6\u0110\1\0\4\u0110\2\u01bf\1\u0110\1\u01bf\1\u0110\1\u01c0"+
+    "\1\u0110\1\0\3\u0110\1\0\2\u0110\1\u01c0\12\0\25\u0110"+
+    "\2\0\1\u0110\2\0\14\u0110\1\u01bf\2\u0110\1\0\1\u0110"+
+    "\10\0\6\u0110\1\0\2\u0110\1\u0112\1\u0110\2\u0114\1\u0110"+
+    "\1\u0114\1\u0110\1\0\1\u0110\1\0\3\u0110\1\0\1\u0110"+
+    "\1\u0113\13\0\11\u0110\1\u0113\2\u0110\1\u0113\2\u0110\1\u0112"+
+    "\5\u0110\2\0\1\u0110\2\0\5\u0110\1\u0113\6\u0110\1\u0114"+
+    "\2\u0110\1\0\1\u0110\10\0\6\u0110\1\0\2\u0110\1\u0112"+
+    "\1\u0110\2\u0115\1\u0110\1\u0115\1\u0110\1\0\1\u0110\1\0"+
+    "\3\u0110\1\0\1\u0110\1\u0113\1\0\1\u0114\11\0\11\u0110"+
+    "\1\u0113\2\u0110\1\u0113\2\u0110\1\u0112\5\u0110\2\0\1\u0110"+
+    "\2\0\5\u0110\1\u0113\6\u0110\1\u0115\2\u0110\1\0\1\u0110"+
+    "\10\0\6\u0110\1\0\1\u0110\1\u01c1\1\u0112\1\u0110\1\u0115"+
+    "\1\u0116\1\u0110\1\u0116\1\u0110\1\0\1\u0110\1\0\3\u0110"+
+    "\1\0\1\u0110\1\u0113\1\0\1\u0114\11\0\10\u0110\1\u01c1"+
+    "\1\u0113\2\u0110\1\u0113\2\u0110\1\u0112\5\u0110\2\0\1\u0110"+
+    "\2\0\5\u0110\1\u0113\6\u0110\1\u0116\2\u0110\1\0\1\u0110"+
+    "\10\0\1\u0110\1\u01c2\4\u0110\1\0\2\u0110\1\u01c2\1\u0110"+
+    "\4\u01c2\1\u0110\1\0\1\u0110\1\0\3\u0110\1\0\1\u0110"+
+    "\1\u01c2\13\0\7\u0110\1\u01c2\1\u0110\2\u01c2\1\u0110\1\u01c2"+
+    "\2\u0110\1\u01c2\3\u0110\1\u01c2\1\u0110\2\0\1\u0110\2\0"+
+    "\1\u0110\1\u01c2\3\u0110\1\u01c2\6\u0110\1\u01c2\2\u0110\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\17\134\1\u01c3"+
+    "\4\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u01c4\6\134"+
+    "\1\u01c5\10\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\1\134\1\u01c6\13\0\24\134"+
+    "\1\125\2\0\1\134\2\0\3\134\1\u01c7\13\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\16\134\1\u01c8"+
+    "\5\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u01c9\17\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\4\134\1\u01ca\17\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\u01cb\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\12\134\1\u01cc\2\134\1\u011b\6\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\1\u01cd\1\134\1\u01ce\21\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\16\134\1\u01cf\5\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\10\134\1\u01d0\13\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\4\134\1\u01d1\17\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\24\134\1\125\2\0\1\134\2\0\1\u011b\16\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\5\134"+
+    "\1\u01d2\16\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u01d3"+
+    "\11\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u01d4\11\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\4\134\1\u01d5\6\134\1\u01d6"+
+    "\10\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\5\134\1\u01d7\16\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\4\134\1\u01d8\17\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\u01d9\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\24\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\10\134\1\u01da\3\134\1\u01db\6\134\1\u01dc\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\13\134\1\u01dd\10\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\16\134\1\u01de\5\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\12\134\1\u01df\11\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\3\134"+
+    "\1\u01e0\20\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\5\134\1\u01e1"+
+    "\16\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\1\u01e2\23\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\5\134\1\u01e3\16\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\5\134\1\u01e4\16\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\2\134\1\u011b\21\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\3\134\1\u01e5\20\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\10\134"+
+    "\1\u01e6\13\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\23\134\1\u01e7"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\1\u01e8\2\134\1\u01e9\20\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\2\134\1\u01ea\4\134\1\u01eb"+
+    "\14\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\u01ec\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\24\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\13\134\1\u01d6\10\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\7\134\1\u01ed\14\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\7\134\1\u01ee\14\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\12\134"+
+    "\1\u01ef\11\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u01f0"+
+    "\11\134\1\u01f1\5\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\1\u01f2"+
+    "\7\134\1\u01f3\13\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\17\134"+
+    "\1\u01f4\4\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\3\134\1\u01f5"+
+    "\20\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u01f6\17\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\4\134\1\u01f7\17\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\1\u01f8\23\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\24\134\1\125\2\0\1\134\2\0\3\134\1\u011b"+
+    "\13\134\13\0\1\u01f9\7\0\1\u01f9\1\0\4\u01f9\11\0"+
+    "\1\u01f9\22\0\1\u01f9\1\0\2\u01f9\1\0\1\u01f9\2\0"+
+    "\1\u01f9\3\0\1\u01f9\7\0\1\u01f9\3\0\1\u01f9\6\0"+
+    "\1\u01f9\15\0\1\u01fa\7\0\1\u01fa\1\0\4\u01fa\11\0"+
+    "\1\u01fa\22\0\1\u01fa\1\0\2\u01fa\1\0\1\u01fa\2\0"+
+    "\1\u01fa\3\0\1\u01fa\7\0\1\u01fa\3\0\1\u01fa\6\0"+
+    "\1\u01fa\14\0\1\u01fb\56\0\1\u01fb\117\0\1\u01fc\132\0"+
+    "\1\u01fd\134\0\1\u01fe\142\0\1\u01ff\30\0\1\u0200\56\0"+
+    "\1\u0200\47\0\1\u0201\56\0\1\u0201\47\0\6\u0154\1\0"+
+    "\13\u0154\5\0\2\u0154\1\0\1\u0154\11\0\24\u0154\3\0"+
+    "\1\u0154\2\0\17\u0154\70\0\1\u0202\1\0\1\u0203\6\0"+
+    "\1\u0204\106\0\1\u0205\130\0\1\u0206\133\0\1\u0207\117\0"+
+    "\1\u0208\1\u0209\125\0\1\u020a\131\0\1\u020b\120\0\1\u020c"+
+    "\11\0\1\u020d\114\0\1\u020e\135\0\1\u020f\117\0\1\u0210"+
+    "\2\0\1\u0211\130\0\1\u0212\12\0\1\u0213\106\0\1\u0214"+
+    "\62\0\6\u0162\1\0\13\u0162\5\0\2\u0162\1\0\1\u0162"+
+    "\11\0\24\u0162\3\0\1\u0162\2\0\17\u0162\63\0\1\u0163"+
+    "\141\0\1\u0163\112\0\1\u0163\2\0\1\u0163\17\0\1\u0163"+
+    "\117\0\1\u0163\6\0\1\u0163\112\0\1\u0163\4\0\1\u0163"+
+    "\126\0\1\u0215\112\0\1\u0216\132\0\1\u0217\134\0\1\u0218"+
+    "\142\0\1\u0219\30\0\2\270\1\u021a\3\270\1\0\10\270"+
+    "\2\0\1\270\5\0\2\270\13\0\2\270\1\u021a\21\270"+
+    "\3\0\1\270\2\0\17\270\12\0\6\270\1\0\1\u021b"+
+    "\7\270\2\0\1\270\5\0\2\270\13\0\15\270\1\u021b"+
+    "\6\270\3\0\1\270\2\0\17\270\32\0\1\u021c\170\0"+
+    "\1\u021d\127\0\1\u0178\105\0\1\u021e\116\0\1\u021f\63\0"+
+    "\2\63\1\0\1\63\1\0\2\63\2\0\3\63\1\u0220"+
+    "\2\63\1\0\26\63\1\0\6\63\1\u0220\30\63\1\0"+
+    "\22\63\1\0\1\63\1\0\2\63\2\0\1\63\1\u0194"+
+    "\4\63\1\0\26\63\1\0\13\63\1\110\1\63\1\u0194"+
+    "\21\63\1\0\3\63\1\110\16\63\1\0\1\63\1\0"+
+    "\2\63\2\0\3\63\1\u0221\2\63\1\0\26\63\1\0"+
+    "\6\63\1\u0221\2\63\1\u0222\25\63\1\0\2\63\1\u0222"+
+    "\17\63\1\0\1\63\1\0\2\63\2\0\5\63\1\u0223"+
+    "\1\0\26\63\1\0\12\63\1\u0223\24\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+    "\1\0\30\63\1\u0194\6\63\1\0\12\63\1\u0194\7\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\2\63"+
+    "\1\u0224\23\63\1\0\25\63\1\u0224\11\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\2\63\1\u0225\3\63"+
+    "\1\0\26\63\1\0\10\63\1\u0225\26\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\4\63\1\110\1\63"+
+    "\1\0\26\63\1\0\24\63\1\110\12\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\1\63"+
+    "\1\u01a8\24\63\1\0\16\63\1\u01a8\20\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\2\63"+
+    "\1\110\23\63\1\0\25\63\1\110\11\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\5\63\1\u0194\1\0"+
+    "\26\63\1\0\12\63\1\u0194\24\63\1\0\22\63\1\0"+
+    "\1\63\1\0\2\63\2\0\6\63\1\0\26\63\1\0"+
+    "\7\63\1\u0226\27\63\1\0\7\63\1\u0226\12\63\1\0"+
+    "\1\63\1\0\2\63\2\0\6\63\1\0\26\63\1\0"+
+    "\26\63\1\u0227\10\63\1\0\4\63\1\u0227\15\63\1\0"+
+    "\1\63\1\0\2\63\2\0\6\63\1\0\26\63\1\0"+
+    "\30\63\1\u0228\6\63\1\0\12\63\1\u0228\7\63\1\0"+
+    "\1\63\1\0\2\63\2\0\6\63\1\0\26\63\1\0"+
+    "\13\63\1\u0229\23\63\1\0\3\63\1\u0229\16\63\1\0"+
+    "\1\63\1\0\2\63\2\0\6\63\1\0\1\u0194\25\63"+
+    "\1\0\23\63\1\u0194\13\63\1\0\22\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\20\63"+
+    "\1\u022a\16\63\1\0\1\63\1\u022a\20\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\12\63\1\u01a2\13\63"+
+    "\1\0\37\63\1\0\6\63\1\u01a2\13\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\7\63"+
+    "\1\u01b3\27\63\1\0\7\63\1\u01b3\12\63\1\0\1\63"+
+    "\1\0\2\63\2\0\3\63\1\u022b\2\63\1\0\26\63"+
+    "\1\0\6\63\1\u022b\30\63\1\0\22\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\20\63"+
+    "\1\u01a1\16\63\1\0\1\63\1\u01a1\20\63\1\0\1\63"+
+    "\1\0\2\63\2\0\5\63\1\u022c\1\0\26\63\1\0"+
+    "\12\63\1\u022c\24\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\11\63\1\u01a2"+
+    "\25\63\1\0\2\63\1\u01a2\17\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\20\63\1\u0102"+
+    "\16\63\1\0\1\63\1\u0102\20\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\27\63\1\110"+
+    "\7\63\1\0\10\63\1\110\11\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\2\63\1\u022d\23\63\1\0"+
+    "\25\63\1\u022d\11\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\2\63\1\u0104\23\63\1\0"+
+    "\25\63\1\u0104\11\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\2\63\1\u01a8\23\63\1\0"+
+    "\25\63\1\u01a8\11\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\2\63\1\u0102\23\63\1\0"+
+    "\25\63\1\u0102\11\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\13\63\1\u022e"+
+    "\23\63\1\0\3\63\1\u022e\16\63\1\0\1\63\1\0"+
+    "\2\63\2\0\1\63\1\u022f\4\63\1\0\26\63\1\0"+
+    "\15\63\1\u022f\21\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\5\63\1\u0230\1\0\26\63\1\0\12\63"+
+    "\1\u0230\24\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+    "\2\0\6\63\1\0\26\63\1\0\11\63\1\u0231\25\63"+
+    "\1\0\2\63\1\u0231\17\63\1\0\1\63\1\0\2\63"+
+    "\2\0\6\63\1\0\1\110\25\63\1\0\23\63\1\110"+
+    "\13\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\2\63\1\u0232\23\63\1\0\25\63\1\u0232"+
+    "\11\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\26\63\1\0\26\63\1\u0233\10\63\1\0"+
+    "\4\63\1\u0233\15\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\1\63\1\u0234\24\63\1\0\16\63\1\u0234"+
+    "\20\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\12\63\1\u0235\13\63\1\0\37\63\1\0"+
+    "\6\63\1\u0235\13\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\26\63\1\0\26\63\1\110\10\63\1\0"+
+    "\4\63\1\110\15\63\1\0\1\63\1\0\2\63\2\0"+
+    "\5\63\1\110\1\0\26\63\1\0\12\63\1\110\24\63"+
+    "\1\0\22\63\1\0\1\63\1\0\2\63\2\0\3\63"+
+    "\1\u0230\2\63\1\0\26\63\1\0\6\63\1\u0230\1\u0226"+
+    "\27\63\1\0\7\63\1\u0226\12\63\1\0\1\63\1\0"+
+    "\2\63\2\0\4\63\1\u018b\1\63\1\0\26\63\1\0"+
+    "\24\63\1\u018b\12\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\1\63\1\302\4\63\1\0\26\63\1\0"+
+    "\15\63\1\302\21\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\26\63\1\u0236"+
+    "\10\63\1\0\4\63\1\u0236\15\63\1\0\1\63\1\0"+
+    "\2\63\2\0\2\63\1\u0237\3\63\1\0\26\63\1\0"+
+    "\10\63\1\u0237\26\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\17\63\1\u0238"+
+    "\17\63\1\0\5\63\1\u0238\14\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\1\63\1\u0239\24\63\1\0"+
+    "\16\63\1\u0239\20\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\20\63\1\u023a"+
+    "\16\63\1\0\1\63\1\u023a\20\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\20\63\1\u023b"+
+    "\16\63\1\0\1\63\1\u023b\20\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\17\63\1\u0183"+
+    "\17\63\1\0\5\63\1\u0183\14\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\11\63\1\u023c"+
+    "\25\63\1\0\2\63\1\u023c\17\63\1\0\1\63\1\0"+
+    "\2\63\2\0\3\63\1\u023d\2\63\1\0\26\63\1\0"+
+    "\6\63\1\u023d\30\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\20\63\1\110"+
+    "\16\63\1\0\1\63\1\110\20\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\1\63\1\u023e\24\63\1\0"+
+    "\16\63\1\u023e\20\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\3\63\1\346\2\63\1\0\26\63\1\0"+
+    "\6\63\1\346\30\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\2\63\1\u023f\3\63\1\0\26\63\1\0"+
+    "\10\63\1\u023f\26\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\2\63\1\u0104\23\63\1\0"+
+    "\20\63\1\110\4\63\1\u0104\11\63\1\0\1\63\1\110"+
+    "\20\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+    "\12\63\1\110\13\63\1\0\37\63\1\0\6\63\1\110"+
+    "\13\63\1\0\1\63\1\0\2\63\2\0\5\63\1\u0240"+
+    "\1\0\26\63\1\0\12\63\1\u0240\24\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+    "\1\0\27\63\1\110\7\63\1\0\10\63\1\110\1\u0241"+
+    "\10\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+    "\26\63\1\0\7\63\1\u0242\27\63\1\0\7\63\1\u0242"+
+    "\12\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+    "\2\63\1\346\23\63\1\0\25\63\1\346\11\63\1\0"+
+    "\20\63\12\0\1\u0243\51\0\1\u0243\117\0\2\u01bb\16\0"+
+    "\1\u01bb\41\0\1\u0244\116\0\1\125\10\0\1\125\1\u0245"+
+    "\4\125\1\0\2\125\1\u0245\1\125\4\u0245\1\125\1\0"+
+    "\1\125\1\0\3\125\1\0\1\125\1\u0245\13\0\7\125"+
+    "\1\u0245\1\125\2\u0245\1\125\1\u0245\2\125\1\u0245\3\125"+
+    "\1\u0245\1\125\2\0\1\125\2\0\1\125\1\u0245\3\125"+
+    "\1\u0245\6\125\1\u0245\2\125\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\1\u0246\23\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\u0110\10\0\6\u0110\1\0\4\u0110"+
+    "\2\u01bf\1\u0110\1\u01bf\1\u0110\1\0\1\u0110\1\0\3\u0110"+
+    "\1\0\1\u0110\1\u0113\13\0\11\u0110\1\u0113\2\u0110\1\u0113"+
+    "\10\u0110\2\0\1\u0110\2\0\5\u0110\1\u0113\6\u0110\1\u01bf"+
+    "\2\u0110\25\0\2\u01bf\1\0\1\u01bf\73\0\1\u01bf\3\0"+
+    "\1\u0110\10\0\1\u0110\1\u01c2\4\u0110\1\0\1\u0110\1\u01c1"+
+    "\1\u01c2\1\u0110\4\u01c2\1\u0110\1\0\1\u0110\1\0\3\u0110"+
+    "\1\0\1\u0110\1\u01c2\13\0\7\u0110\1\u01c2\1\u01c1\2\u01c2"+
+    "\1\u0110\1\u01c2\2\u0110\1\u01c2\3\u0110\1\u01c2\1\u0110\2\0"+
+    "\1\u0110\2\0\1\u0110\1\u01c2\3\u0110\1\u01c2\6\u0110\1\u01c2"+
+    "\2\u0110\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\13\134\1\u013e\10\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\17\134"+
+    "\1\u0247\4\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u0248"+
+    "\17\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\1\u0249\23\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\12\134\1\u024a\11\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\3\134\1\u024b\4\134\1\u024c\13\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\3\134\1\u011b\20\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\u024d\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\24\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\17\134"+
+    "\1\u024e\4\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\5\134\1\u024f"+
+    "\16\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\13\134\1\u011b\10\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\3\134\1\u0250\20\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\17\134\1\u0251\4\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\10\134\1\u011b\13\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\1\u0252\23\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134"+
+    "\1\u0253\6\134\1\u0254\10\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\2\134\1\u0255\21\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\13\134"+
+    "\1\u01cd\10\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\7\134\1\u01f7"+
+    "\14\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\17\134\1\u011b\4\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\1\134\1\u0255\22\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\23\134\1\u0256\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\17\134\1\u0257\4\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\12\134\1\u0258\11\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\u0259"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\24\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\4\134\1\u025a\17\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\17\134\1\u0135\4\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\4\134\1\u025b\17\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\2\134\1\u025c\21\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\7\134\1\u025d\14\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134"+
+    "\1\u01d5\17\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\7\134\1\u025e"+
+    "\14\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u025f\11\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\12\134\1\u025c\11\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\13\134\1\u01cb\10\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\10\134\1\u025b\13\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\22\134\1\u0260\1\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\4\134\1\u0261\17\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\13\134"+
+    "\1\u0262\10\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\21\134\1\u0263"+
+    "\2\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\20\134\1\u011b\3\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\6\134\1\u0264\15\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\12\134\1\u0265\11\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\10\134\1\u0266\13\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\17\134\1\u0267\4\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\3\134\1\u024b\20\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\11\134"+
+    "\1\u011b\12\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u0268"+
+    "\11\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u0269\11\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\10\134\1\u026a\13\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\17\134\1\u0255\4\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\6\134\1\u011b\15\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\10\134\1\u01d6\13\134\1\125\2\0\1\134\2\0"+
+    "\17\134\13\0\1\u026b\7\0\1\u026b\1\0\4\u026b\11\0"+
+    "\1\u026b\22\0\1\u026b\1\0\2\u026b\1\0\1\u026b\2\0"+
+    "\1\u026b\3\0\1\u026b\7\0\1\u026b\3\0\1\u026b\6\0"+
+    "\1\u026b\15\0\1\u026c\7\0\1\u026c\1\0\4\u026c\11\0"+
+    "\1\u026c\22\0\1\u026c\1\0\2\u026c\1\0\1\u026c\2\0"+
+    "\1\u026c\3\0\1\u026c\7\0\1\u026c\3\0\1\u026c\6\0"+
+    "\1\u026c\15\0\1\u026d\51\0\1\u026d\135\0\1\u026e\127\0"+
+    "\1\u01fe\105\0\1\u026f\116\0\1\u0270\75\0\1\u0271\51\0"+
+    "\1\u0271\60\0\1\u0272\42\0\1\u0272\136\0\1\u0273\112\0"+
+    "\1\u0274\145\0\1\u0275\112\0\1\u0208\133\0\1\u0276\120\0"+
+    "\1\u0277\130\0\1\u0278\130\0\1\u0279\142\0\1\u027a\123\0"+
+    "\1\u027b\114\0\1\u027c\126\0\1\u027d\5\0\1\u027e\126\0"+
+    "\1\u0212\117\0\1\u027f\124\0\1\u0280\133\0\1\u0281\131\0"+
+    "\1\u0282\132\0\1\u0283\123\0\1\u0284\131\0\1\u0285\126\0"+
+    "\1\u0286\127\0\1\u0218\105\0\1\u0287\116\0\1\u0288\74\0"+
+    "\3\270\1\u0289\2\270\1\0\10\270\2\0\1\270\5\0"+
+    "\2\270\13\0\1\u0289\23\270\3\0\1\270\2\0\17\270"+
+    "\12\0\6\270\1\0\1\270\1\u028a\6\270\2\0\1\270"+
+    "\5\0\2\270\13\0\10\270\1\u028a\13\270\3\0\1\270"+
+    "\2\0\17\270\54\0\1\u021e\14\0\1\u0178\46\0\1\u028b"+
+    "\123\0\2\u028c\1\0\7\u021f\1\0\10\u021f\2\u028c\1\u021f"+
+    "\1\0\1\u028c\1\0\1\u021f\1\u028c\2\u021f\2\u028c\1\0"+
+    "\2\u028c\1\0\5\u028c\24\u021f\3\u028c\1\u021f\2\u028c\17\u021f"+
+    "\1\0\2\63\1\0\1\63\1\0\2\63\2\0\4\63"+
+    "\1\u01a2\1\63\1\0\26\63\1\0\24\63\1\u01a2\12\63"+
+    "\1\0\22\63\1\0\1\63\1\0\2\63\2\0\6\63"+
+    "\1\0\26\63\1\0\27\63\1\u0183\7\63\1\0\10\63"+
+    "\1\u0183\11\63\1\0\1\63\1\0\2\63\2\0\6\63"+
+    "\1\0\26\63\1\0\13\63\1\323\23\63\1\0\3\63"+
+    "\1\323\16\63\1\0\1\63\1\0\2\63\2\0\3\63"+
+    "\1\u0230\2\63\1\0\26\63\1\0\6\63\1\u0230\30\63"+
+    "\1\0\22\63\1\0\1\63\1\0\2\63\2\0\1\63"+
+    "\1\u01a2\4\63\1\0\26\63\1\0\15\63\1\u01a2\21\63"+
+    "\1\0\22\63\1\0\1\63\1\0\2\63\2\0\1\63"+
+    "\1\u0183\4\63\1\0\26\63\1\0\15\63\1\u0183\21\63"+
+    "\1\0\22\63\1\0\1\63\1\0\2\63\2\0\2\63"+
+    "\1\u028d\3\63\1\0\26\63\1\0\10\63\1\u028d\26\63"+
+    "\1\0\22\63\1\0\1\63\1\0\2\63\2\0\6\63"+
+    "\1\0\2\63\1\u028e\23\63\1\0\20\63\1\u022d\4\63"+
+    "\1\u028e\11\63\1\0\1\63\1\u022d\20\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\20\63"+
+    "\1\u028f\16\63\1\0\1\63\1\u028f\20\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\17\63"+
+    "\1\u0290\17\63\1\0\5\63\1\u0290\14\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\26\63"+
+    "\1\u0183\10\63\1\0\4\63\1\u0183\15\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\13\63"+
+    "\1\u0291\23\63\1\0\3\63\1\u0291\16\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\20\63"+
+    "\1\u0292\16\63\1\0\1\63\1\u0292\20\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\13\63"+
+    "\1\u0102\23\63\1\0\3\63\1\u0102\16\63\1\0\1\63"+
+    "\1\0\2\63\2\0\5\63\1\u0293\1\0\26\63\1\0"+
+    "\12\63\1\u0293\24\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\27\63\1\u0294"+
+    "\7\63\1\0\10\63\1\u0294\11\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\11\63\1\365"+
+    "\25\63\1\0\2\63\1\365\17\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\12\63\1\u022d\13\63\1\0"+
+    "\37\63\1\0\6\63\1\u022d\13\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\21\63\1\u0295\4\63\1\0"+
+    "\22\63\1\u0295\14\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\2\63\1\u0296\23\63\1\0"+
+    "\25\63\1\u0296\11\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\17\63\1\u0297"+
+    "\17\63\1\0\5\63\1\u0297\14\63\1\0\1\63\1\0"+
+    "\2\63\2\0\2\63\1\u0183\3\63\1\0\26\63\1\0"+
+    "\10\63\1\u0183\26\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\20\63\1\u0298"+
+    "\16\63\1\0\1\63\1\u0298\20\63\1\0\1\63\1\0"+
+    "\2\63\2\0\6\63\1\0\26\63\1\0\11\63\1\323"+
+    "\25\63\1\0\2\63\1\323\17\63\1\0\1\63\1\0"+
+    "\2\63\2\0\3\63\1\u0299\2\63\1\0\26\63\1\0"+
+    "\6\63\1\u0299\30\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\5\63\1\u029a\1\0\1\63\1\u029b\24\63"+
+    "\1\0\7\63\1\u029c\2\63\1\u029a\3\63\1\u029b\20\63"+
+    "\1\0\7\63\1\u029c\12\63\1\0\1\63\1\0\2\63"+
+    "\2\0\6\63\1\0\26\63\1\0\13\63\1\u029d\23\63"+
+    "\1\0\3\63\1\u029d\16\63\1\0\1\63\1\0\2\63"+
+    "\2\0\1\63\1\316\4\63\1\0\26\63\1\0\15\63"+
+    "\1\316\21\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+    "\2\0\6\63\1\0\2\63\1\u01a2\23\63\1\0\25\63"+
+    "\1\u01a2\11\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+    "\2\0\6\63\1\0\2\63\1\u029e\23\63\1\0\25\63"+
+    "\1\u029e\11\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+    "\2\0\3\63\1\u029f\2\63\1\0\26\63\1\0\6\63"+
+    "\1\u029f\30\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+    "\2\0\6\63\1\0\12\63\1\u02a0\13\63\1\0\37\63"+
+    "\1\0\6\63\1\u02a0\13\63\1\0\1\63\1\0\2\63"+
+    "\2\0\6\63\1\0\2\63\1\365\23\63\1\0\25\63"+
+    "\1\365\11\63\1\0\20\63\13\0\1\u02a1\43\0\1\u02a1"+
+    "\47\0\1\125\10\0\1\125\1\u02a2\4\125\1\0\2\125"+
+    "\1\u02a2\1\125\4\u02a2\1\125\1\0\1\125\1\0\3\125"+
+    "\1\0\1\125\1\u02a2\13\0\7\125\1\u02a2\1\125\2\u02a2"+
+    "\1\125\1\u02a2\2\125\1\u02a2\3\125\1\u02a2\1\125\2\0"+
+    "\1\125\2\0\1\125\1\u02a2\3\125\1\u02a2\6\125\1\u02a2"+
+    "\2\125\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\5\134\1\u02a3\16\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\2\134"+
+    "\1\u02a4\21\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u02a5"+
+    "\11\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\5\134\1\u02a6\16\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\24\134\1\125\2\0\1\134"+
+    "\2\0\3\134\1\u0266\13\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\2\134\1\u0254\21\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\17\134\1\u02a7\4\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\2\134\1\u02a8\21\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\13\134\1\u02a9\10\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\24\134"+
+    "\1\125\2\0\1\134\2\0\1\u02aa\16\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\3\134\1\u02ab\20\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\22\134\1\u01d6\1\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\1\u02ac\23\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\4\134\1\u011b\17\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\10\134\1\u01f6\13\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134"+
+    "\1\u01d6\17\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\u02ad\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\24\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\1\134\1\u02ae\22\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\2\134\1\u02af\21\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\1\u02b0\23\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134"+
+    "\1\u0255\17\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\6\134\1\u02b1"+
+    "\15\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u02b2\17\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\10\134\1\u02b3\13\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\12\134\1\u0257\11\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\17\134\1\u02b4\4\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\17\134\1\u02b5\4\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\12\134\1\u02b6\11\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\16\134"+
+    "\1\u02b7\5\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\5\134\1\u02b8"+
+    "\16\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u0146\17\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\21\134\1\u011b\2\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\17\134\1\u02b9\4\134\1\125\2\0"+
+    "\1\134\2\0\17\134\14\0\1\u02ba\43\0\1\u02ba\122\0"+
+    "\1\u026f\14\0\1\u01fe\46\0\1\u02bb\123\0\2\u02bc\1\0"+
+    "\7\u0270\1\0\10\u0270\2\u02bc\1\u0270\1\0\1\u02bc\1\0"+
+    "\1\u0270\1\u02bc\2\u0270\2\u02bc\1\0\2\u02bc\1\0\5\u02bc"+
+    "\24\u0270\3\u02bc\1\u0270\2\u02bc\17\u0270\14\0\1\u02bd\43\0"+
+    "\1\u02bd\67\0\1\u02be\51\0\1\u02be\115\0\1\u027a\124\0"+
+    "\1\u02bf\140\0\1\u02c0\127\0\1\u02c1\112\0\1\u02c2\101\0"+
+    "\1\u02c3\171\0\1\u02c4\116\0\1\u02c5\140\0\1\u0278\106\0"+
+    "\1\u0278\131\0\1\u02c1\122\0\1\u02c6\141\0\1\u027e\70\0"+
+    "\1\u02c7\174\0\1\u02c8\107\0\1\u02c9\122\0\1\u02ca\131\0"+
+    "\1\u02cb\121\0\1\u0287\14\0\1\u0218\46\0\1\u02cc\123\0"+
+    "\2\u02cd\1\0\7\u0288\1\0\10\u0288\2\u02cd\1\u0288\1\0"+
+    "\1\u02cd\1\0\1\u0288\1\u02cd\2\u0288\2\u02cd\1\0\2\u02cd"+
+    "\1\0\5\u02cd\24\u0288\3\u02cd\1\u0288\2\u02cd\17\u0288\12\0"+
+    "\4\270\1\u02ce\1\270\1\0\10\270\2\0\1\270\5\0"+
+    "\2\270\13\0\16\270\1\u02ce\5\270\3\0\1\270\2\0"+
+    "\17\270\12\0\6\270\1\0\2\270\1\u02cf\5\270\2\0"+
+    "\1\270\5\0\2\270\13\0\17\270\1\u02cf\4\270\3\0"+
+    "\1\270\2\0\17\270\11\0\1\u021f\116\0\2\63\1\0"+
+    "\1\63\1\0\2\63\2\0\6\63\1\0\26\63\1\0"+
+    "\11\63\1\u02d0\25\63\1\0\2\63\1\u02d0\17\63\1\0"+
+    "\1\63\1\0\2\63\2\0\6\63\1\0\26\63\1\0"+
+    "\13\63\1\u01a2\23\63\1\0\3\63\1\u01a2\16\63\1\0"+
+    "\1\63\1\0\2\63\2\0\1\110\5\63\1\0\26\63"+
+    "\1\0\21\63\1\110\15\63\1\0\22\63\1\0\1\63"+
+    "\1\0\2\63\2\0\6\63\1\0\2\63\1\u02d1\23\63"+
+    "\1\0\25\63\1\u02d1\11\63\1\0\22\63\1\0\1\63"+
+    "\1\0\2\63\2\0\5\63\1\u02d2\1\0\26\63\1\0"+
+    "\12\63\1\u02d2\24\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\2\63\1\u02d3\3\63\1\0\26\63\1\0"+
+    "\10\63\1\u02d3\26\63\1\0\22\63\1\0\1\63\1\0"+
+    "\2\63\2\0\1\u02d4\5\63\1\0\26\63\1\0\21\63"+
+    "\1\u02d4\15\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+    "\2\0\6\63\1\0\26\63\1\0\37\63\1\0\11\63"+
+    "\1\u02d5\10\63\1\0\1\63\1\0\2\63\2\0\6\63"+
+    "\1\0\26\63\1\0\11\63\1\u028e\25\63\1\0\2\63"+
+    "\1\u028e\17\63\1\0\1\63\1\0\2\63\2\0\1\u023e"+
+    "\5\63\1\0\26\63\1\0\21\63\1\u023e\15\63\1\0"+
+    "\22\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+    "\26\63\1\0\26\63\1\u02d6\10\63\1\0\4\63\1\u02d6"+
+    "\15\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+    "\1\63\1\u028f\24\63\1\0\16\63\1\u028f\20\63\1\0"+
+    "\22\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+    "\2\63\1\u02d7\23\63\1\0\25\63\1\u02d7\11\63\1\0"+
+    "\22\63\1\0\1\63\1\0\2\63\2\0\3\63\1\356"+
+    "\2\63\1\0\26\63\1\0\6\63\1\356\30\63\1\0"+
+    "\22\63\1\0\1\63\1\0\2\63\2\0\2\63\1\u02d8"+
+    "\3\63\1\0\26\63\1\0\10\63\1\u02d8\26\63\1\0"+
+    "\22\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+    "\1\u01a1\25\63\1\0\23\63\1\u01a1\13\63\1\0\22\63"+
+    "\1\0\1\63\1\0\2\63\2\0\1\u028f\5\63\1\0"+
+    "\26\63\1\0\21\63\1\u028f\15\63\1\0\22\63\1\0"+
+    "\1\63\1\0\2\63\2\0\1\63\1\u02d9\4\63\1\0"+
+    "\26\63\1\0\15\63\1\u02d9\21\63\1\0\22\63\1\0"+
+    "\1\63\1\0\2\63\2\0\6\63\1\0\2\63\1\u0183"+
+    "\23\63\1\0\25\63\1\u0183\11\63\1\0\20\63\14\0"+
+    "\1\u02da\40\0\1\u02da\51\0\1\125\10\0\1\125\1\u02db"+
+    "\4\125\1\0\2\125\1\u02db\1\125\4\u02db\1\125\1\0"+
+    "\1\125\1\0\3\125\1\0\1\125\1\u02db\13\0\7\125"+
+    "\1\u02db\1\125\2\u02db\1\125\1\u02db\2\125\1\u02db\3\125"+
+    "\1\u02db\1\125\2\0\1\125\2\0\1\125\1\u02db\3\125"+
+    "\1\u02db\6\125\1\u02db\2\125\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\1\u02dc\23\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\14\134\1\u02dd\7\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\5\134\1\u02de\16\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\1\u02df"+
+    "\23\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\20\134\1\u02e0\3\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\5\134\1\u02e1\16\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\1\u02e2\23\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\14\134\1\u011b\7\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\5\134\1\u02e3\16\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\10\134"+
+    "\1\u0254\13\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\1\134\1\u01de"+
+    "\22\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u02e4\11\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\7\134\1\u011b\14\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\2\134\1\u02e5\21\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\1\u02e6\23\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\10\134\1\u02e7\13\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\7\134"+
+    "\1\u02e8\14\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\3\134\1\u02e9\2\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\1\134\1\u02ea"+
+    "\13\0\24\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\1\134\1\u01d6"+
+    "\22\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\17\134\1\u0266\4\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\11\134\1\u01cd\12\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\12\134\1\u02eb\11\134\1\125\2\0"+
+    "\1\134\2\0\17\134\15\0\1\u02ec\40\0\1\u02ec\61\0"+
+    "\1\u0270\132\0\1\u02ed\40\0\1\u02ed\72\0\1\u02ee\43\0"+
+    "\1\u02ee\131\0\1\u02ef\116\0\1\u02f0\77\0\1\u02f1\171\0"+
+    "\1\u0208\112\0\1\u02f2\3\0\1\u02f3\1\u02f4\120\0\1\u0278"+
+    "\145\0\1\u02f5\127\0\1\u02f6\117\0\1\u0278\123\0\1\u02f5"+
+    "\133\0\1\u0278\115\0\1\u02f5\124\0\1\u02f7\57\0\1\u0288"+
+    "\127\0\5\270\1\u02f8\1\0\10\270\2\0\1\270\5\0"+
+    "\2\270\13\0\4\270\1\u02f8\17\270\3\0\1\270\2\0"+
+    "\17\270\1\0\2\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\12\63\1\u0181\13\63\1\0\37\63\1\0"+
+    "\6\63\1\u0181\13\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\20\63\1\110\5\63\1\0\35\63\1\110"+
+    "\1\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\2\63\1\u02f9\23\63\1\0\25\63\1\u02f9"+
+    "\11\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\2\63\1\u01b0\23\63\1\0\25\63\1\u01b0"+
+    "\11\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\26\63\1\0\11\63\1\307\25\63\1\0"+
+    "\2\63\1\307\17\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\12\63\1\u02fa\13\63\1\0\37\63\1\0"+
+    "\6\63\1\u02fa\13\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\2\63\1\u028f\23\63\1\0\25\63\1\u028f"+
+    "\11\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\26\63\1\0\26\63\1\u02fb\10\63\1\0"+
+    "\4\63\1\u02fb\15\63\1\0\1\63\1\0\2\63\2\0"+
+    "\3\63\1\u0102\2\63\1\0\26\63\1\0\6\63\1\u0102"+
+    "\30\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\26\63\1\0\11\63\1\u01a8\25\63\1\0"+
+    "\2\63\1\u01a8\15\63\15\0\1\u02fc\55\0\1\u02fc\33\0"+
+    "\1\125\10\0\1\125\1\134\4\125\1\0\2\125\1\134"+
+    "\1\125\4\134\1\125\1\0\1\125\1\0\3\125\1\0"+
+    "\1\125\1\134\13\0\7\125\1\134\1\125\2\134\1\125"+
+    "\1\134\2\125\1\134\3\125\1\134\1\125\2\0\1\125"+
+    "\2\0\1\125\1\134\3\125\1\134\6\125\1\134\2\125"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134"+
+    "\1\u02e7\17\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u02fd"+
+    "\11\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\7\134\1\u01cf\14\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\4\134\1\u02b7\17\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\17\134\1\u02fe\4\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\17\134\1\u02ff\4\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\u01d6\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\24\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\7\134\1\u0254"+
+    "\14\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\3\134\1\u0300\20\134"+
+    "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\3\134\1\u0301\20\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\15\134\1\u011b\6\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\4\134\1\u0302\17\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\5\134\1\u0303\16\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\10\134\1\u0304\13\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\5\134"+
+    "\1\u0255\16\134\1\125\2\0\1\134\2\0\17\134\16\0"+
+    "\1\u0305\55\0\1\u0305\50\0\1\u0306\55\0\1\u0306\55\0"+
+    "\1\u0307\51\0\1\u0307\113\0\1\u0308\124\0\1\u02f6\127\0"+
+    "\1\u02f2\3\0\1\u02f3\133\0\1\u0309\120\0\1\u030a\132\0"+
+    "\1\u0280\133\0\1\u030b\126\0\1\u0278\113\0\1\u030c\45\0"+
+    "\2\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+    "\20\63\1\u01a2\5\63\1\0\35\63\1\u01a2\1\63\1\0"+
+    "\22\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+    "\26\63\1\0\11\63\1\312\25\63\1\0\2\63\1\312"+
+    "\17\63\1\0\1\63\1\0\2\63\2\0\4\63\1\u030d"+
+    "\1\63\1\0\26\63\1\0\24\63\1\u030d\12\63\1\0"+
+    "\20\63\16\0\1\u030e\42\0\1\u030e\45\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\7\134\1\u01d6\14\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\5\134\1\u030f\16\134\1\125\2\0"+
+    "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+    "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+    "\2\134\13\0\5\134\1\u0254\16\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\5\134\1\u0310\16\134\1\125\2\0\1\134\2\0"+
+    "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+    "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+    "\5\134\1\u011b\16\134\1\125\2\0\1\134\2\0\17\134"+
+    "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+    "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\17\134"+
+    "\1\u01f2\4\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+    "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+    "\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u0266"+
+    "\17\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\3\134\1\u0311\20\134"+
+    "\1\125\2\0\1\134\2\0\17\134\17\0\1\u0312\42\0"+
+    "\1\u0312\63\0\1\u0313\42\0\1\u0313\64\0\1\u0314\140\0"+
+    "\1\u0315\126\0\1\u0316\152\0\1\u0317\137\0\1\u0278\127\0"+
+    "\1\u0318\37\0\2\63\1\0\1\63\1\0\2\63\2\0"+
+    "\6\63\1\0\1\63\1\u0319\24\63\1\0\16\63\1\u0319"+
+    "\20\63\1\0\20\63\17\0\1\u031a\107\0\1\125\10\0"+
+    "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+    "\1\134\1\0\2\134\13\0\4\134\1\u01cd\17\134\1\125"+
+    "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+    "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+    "\1\0\2\134\13\0\1\u031b\23\134\1\125\2\0\1\134"+
+    "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+    "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+    "\13\0\12\134\1\u0303\11\134\1\125\2\0\1\134\2\0"+
+    "\17\134\20\0\1\u031c\126\0\1\u031d\174\0\1\u031e\122\0"+
+    "\1\u031f\132\0\1\u030b\123\0\1\u0320\44\0\2\63\1\0"+
+    "\1\63\1\0\2\63\2\0\6\63\1\0\26\63\1\0"+
+    "\20\63\1\312\16\63\1\0\1\63\1\312\16\63\1\125"+
+    "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+    "\1\u010d\1\134\1\0\2\134\13\0\24\134\1\125\2\0"+
+    "\1\134\2\0\16\134\1\u0302\56\0\1\u0321\16\0\1\u0322"+
+    "\124\0\1\u0323\115\0\1\u0324\127\0\1\u02f6\125\0\1\u0273"+
+    "\140\0\1\u02f6\33\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[61161];
+    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 =
+    "\6\0\2\1\1\0\2\1\1\0\2\1\7\0\1\1"+
+    "\3\0\2\1\1\11\4\1\1\11\5\1\1\11\2\1"+
+    "\2\11\2\1\1\11\1\1\3\11\1\1\1\11\25\1"+
+    "\1\11\1\1\1\11\1\1\7\11\1\1\1\11\2\1"+
+    "\2\11\10\1\1\11\3\1\1\11\17\1\1\11\3\1"+
+    "\2\11\2\1\1\11\1\1\1\11\1\1\1\11\6\1"+
+    "\1\11\1\1\2\11\1\1\1\11\5\1\4\11\4\1"+
+    "\4\11\1\1\1\11\6\1\4\11\1\1\2\11\1\1"+
+    "\1\11\10\1\2\11\5\0\1\11\103\1\1\11\3\0"+
+    "\1\11\1\0\75\1\1\11\2\1\1\0\1\11\6\0"+
+    "\1\11\1\1\15\0\1\1\1\11\5\0\1\1\1\0"+
+    "\2\11\4\0\3\1\1\0\1\11\4\0\100\1\1\0"+
+    "\1\1\1\0\3\1\1\0\70\1\41\0\2\1\1\11"+
+    "\2\0\44\1\1\0\1\11\46\1\1\0\1\11\3\0"+
+    "\1\1\7\0\1\11\17\0\3\1\2\0\24\1\1\0"+
+    "\30\1\24\0\14\1\1\0\21\1\14\0\4\1\1\0"+
+    "\10\1\10\0\1\1\1\0\3\1\2\0\1\11\4\0"+
+    "\1\1\1\11\1\1\2\11\6\0\1\11";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[804];
+    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;
+
+  /* user code: */
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to HTMLTokenMaker; this signals that the user has
+	 * ended a line with an unclosed HTML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to HTMLTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code><script></code> tag.
+	 */
+	public static final int INTERNAL_INTAG_SCRIPT			= -4;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+	/**
+	 * Token type specific to HTMLTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code><style></code> tag.
+	 */
+	public static final int INTERNAL_INTAG_STYLE			= -7;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * style tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_STYLE = -8;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * style tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_STYLE = -9;
+
+	/**
+	 * Token type specifying we're in JavaScript.
+	 */
+	public static final int INTERNAL_IN_JS					= -10;
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	public static final int INTERNAL_IN_JS_MLC				= -11;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_INVALID	= -12;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_VALID		= -13;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_INVALID	= -14;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_VALID		= -15;
+
+	/**
+	 * Internal type denoting a line ending in CSS.
+	 */
+	public static final int INTERNAL_CSS					= -16;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property.
+	 */
+	public static final int INTERNAL_CSS_PROPERTY			= -17;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property value.
+	 */
+	public static final int INTERNAL_CSS_VALUE				= -18;
+
+	/**
+	 * Internal type denoting line ending in a CSS double-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_STRING				= -(1<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS single-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_CHAR				= -(2<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS multi-line comment.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_MLC				= -(3<<11);
+
+	/**
+	 * The state previous CSS-related state we were in before going into a CSS
+	 * string, multi-line comment, etc.
+	 */
+	private int cssPrevState;
+
+	/**
+	 * Whether closing markup tags are automatically completed for HTML.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+	/**
+	 * Language state set on HTML tokens.  Must be 0.
+	 */
+	private static final int LANG_INDEX_DEFAULT = 0;
+
+	/**
+	 * Language state set on JavaScript tokens.
+	 */
+	private static final int LANG_INDEX_JS = 1;
+
+	/**
+	 * Language state set on CSS tokens.
+	 */
+	private static final int LANG_INDEX_CSS = 2;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public HTMLTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * 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;
+		cssPrevState = CSS; // Shouldn't be necessary
+		int languageIndex = 0;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.MARKUP_COMMENT:
+				state = COMMENT;
+				break;
+			case Token.PREPROCESSOR:
+				state = PI;
+				break;
+			case Token.VARIABLE:
+				state = DTD;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				break;
+			case INTERNAL_INTAG_STYLE:
+				state = INTAG_STYLE;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_STYLE:
+				state = INATTR_DOUBLE_STYLE;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_STYLE:
+				state = INATTR_SINGLE_STYLE;
+				break;
+			case INTERNAL_IN_JS:
+				state = JAVASCRIPT;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				validJSString = false;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				validJSString = true;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				validJSString = false;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				validJSString = true;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_CSS:
+				state = CSS;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			case INTERNAL_CSS_PROPERTY:
+				state = CSS_PROPERTY;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			case INTERNAL_CSS_VALUE:
+				state = CSS_VALUE;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			default:
+				if (initialTokenType<-1024) {
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_CSS_STRING:
+							state = CSS_STRING;
+							break;
+						case INTERNAL_CSS_CHAR:
+							state = CSS_CHAR_LITERAL;
+							break;
+						case INTERNAL_CSS_MLC:
+							state = CSS_C_STYLE_COMMENT;
+							break;
+					}
+					cssPrevState = -initialTokenType&0xff;
+					languageIndex = LANG_INDEX_CSS;
+				}
+				else {
+					state = Token.NULL;
+				}
+				break;
+		}
+
+		setLanguageIndex(languageIndex);
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 HTMLTokenMaker(java.io.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 HTMLTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 194) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 54: 
+          { addToken(Token.OPERATOR); yybegin(CSS_VALUE);
+          }
+        case 104: break;
+        case 73: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 105: break;
+        case 63: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+          }
+        case 106: break;
+        case 23: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT);
+          }
+        case 107: break;
+        case 10: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD);
+          }
+        case 108: break;
+        case 49: 
+          { addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY);
+          }
+        case 109: break;
+        case 4: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+          }
+        case 110: break;
+        case 97: 
+          { addToken(Token.RESERVED_WORD_2);
+          }
+        case 111: break;
+        case 83: 
+          { addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState);
+          }
+        case 112: break;
+        case 80: 
+          { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT);
+          }
+        case 113: break;
+        case 39: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+          }
+        case 114: break;
+        case 5: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 115: break;
+        case 98: 
+          { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+          }
+        case 116: break;
+        case 82: 
+          { addToken(Token.REGEX);
+          }
+        case 117: break;
+        case 41: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+          }
+        case 118: break;
+        case 102: 
+          { int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+							  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 119: break;
+        case 93: 
+          { addToken(Token.FUNCTION);
+          }
+        case 120: break;
+        case 8: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+          }
+        case 121: break;
+        case 35: 
+          { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 122: break;
+        case 45: 
+          { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING);
+          }
+        case 123: break;
+        case 20: 
+          { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 124: break;
+        case 25: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_STYLE);
+          }
+        case 125: break;
+        case 76: 
+          { /* Skip all escaped chars. */
+          }
+        case 126: break;
+        case 70: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL);
+          }
+        case 127: break;
+        case 28: 
+          { yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 128: break;
+        case 92: 
+          { if(JavaScriptTokenMaker.isJavaScriptCompatible("1.6")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+          }
+        case 129: break;
+        case 87: 
+          { if(JavaScriptTokenMaker.isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+          }
+        case 130: break;
+        case 55: 
+          { /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER);
+          }
+        case 131: break;
+        case 17: 
+          { /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG);
+          }
+        case 132: break;
+        case 26: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(CSS, LANG_INDEX_CSS);
+          }
+        case 133: break;
+        case 64: 
+          { addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState);
+          }
+        case 134: break;
+        case 27: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_STYLE);
+          }
+        case 135: break;
+        case 7: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+          }
+        case 136: break;
+        case 78: 
+          { /* Invalid latin-1 character \xXX */ validJSString = false;
+          }
+        case 137: break;
+        case 24: 
+          { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 138: break;
+        case 36: 
+          { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+          }
+        case 139: break;
+        case 90: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 140: break;
+        case 68: 
+          { start = zzMarkedPos-2; yybegin(PI);
+          }
+        case 141: break;
+        case 99: 
+          { yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+						  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+						  addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+						  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 142: break;
+        case 50: 
+          { /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER);
+          }
+        case 143: break;
+        case 9: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+          }
+        case 144: break;
+        case 66: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+									yybegin(INTAG_CHECK_TAG_NAME);
+          }
+        case 145: break;
+        case 62: 
+          { /* Skip escaped chars. */
+          }
+        case 146: break;
+        case 77: 
+          { /* Invalid Unicode character \\uXXXX */ validJSString = false;
+          }
+        case 147: break;
+        case 96: 
+          { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-5,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; cssPrevState = zzLexicalState; yybegin(INTAG_STYLE);
+          }
+        case 148: break;
+        case 69: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION);
+          }
+        case 149: break;
+        case 79: 
+          { yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 150: break;
+        case 30: 
+          { addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 151: break;
+        case 38: 
+          { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 152: break;
+        case 15: 
+          { addToken(Token.OPERATOR);
+          }
+        case 153: break;
+        case 57: 
+          { addToken(Token.OPERATOR); yybegin(CSS_PROPERTY);
+          }
+        case 154: break;
+        case 88: 
+          { start = zzMarkedPos-4; yybegin(COMMENT);
+          }
+        case 155: break;
+        case 85: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT);
+          }
+        case 156: break;
+        case 101: 
+          { yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 157: break;
+        case 81: 
+          { addToken(Token.VARIABLE);
+          }
+        case 158: break;
+        case 43: 
+          { /*System.out.println("CSS: " + yytext());*/ addToken(Token.IDENTIFIER);
+          }
+        case 159: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 160: break;
+        case 95: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 161: break;
+        case 22: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JAVASCRIPT, LANG_INDEX_JS);
+          }
+        case 162: break;
+        case 94: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 163: break;
+        case 53: 
+          { addToken(Token.SEPARATOR); yybegin(CSS);
+          }
+        case 164: break;
+        case 31: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING);
+          }
+        case 165: break;
+        case 61: 
+          { addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState);
+          }
+        case 166: break;
+        case 51: 
+          { addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+          }
+        case 167: break;
+        case 40: 
+          { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+          }
+        case 168: break;
+        case 34: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR);
+          }
+        case 169: break;
+        case 72: 
+          { start = zzMarkedPos-2; yybegin(JS_MLC);
+          }
+        case 170: break;
+        case 75: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 171: break;
+        case 59: 
+          { int temp = zzMarkedPos - 2;
+						  addToken(zzStartRead, temp, Token.FUNCTION);
+						  addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+						  zzStartRead = zzCurrentPos = zzMarkedPos;
+          }
+        case 172: break;
+        case 103: 
+          { addToken(Token.ANNOTATION);
+          }
+        case 173: break;
+        case 29: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 174: break;
+        case 56: 
+          { addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+          }
+        case 175: break;
+        case 89: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos;
+          }
+        case 176: break;
+        case 6: 
+          { addToken(Token.MARKUP_ENTITY_REFERENCE);
+          }
+        case 177: break;
+        case 91: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 178: break;
+        case 18: 
+          { /* Shouldn't happen */ yypushback(1); yybegin(INTAG);
+          }
+        case 179: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 180: break;
+        case 44: 
+          { addEndToken(INTERNAL_CSS); return firstToken;
+          }
+        case 181: break;
+        case 100: 
+          { yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 182: break;
+        case 48: 
+          { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL);
+          }
+        case 183: break;
+        case 52: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 184: break;
+        case 12: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+          }
+        case 185: break;
+        case 14: 
+          { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 186: break;
+        case 46: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 187: break;
+        case 33: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 188: break;
+        case 84: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-2); //yypushback(count-2);
+									yybegin(INTAG_CHECK_TAG_NAME);
+          }
+        case 189: break;
+        case 60: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+          }
+        case 190: break;
+        case 58: 
+          { /* End of a function */ addToken(Token.SEPARATOR);
+          }
+        case 191: break;
+        case 19: 
+          { addToken(Token.MARKUP_TAG_NAME);
+          }
+        case 192: break;
+        case 11: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 193: break;
+        case 71: 
+          { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT);
+          }
+        case 194: break;
+        case 37: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+          }
+        case 195: break;
+        case 74: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 196: break;
+        case 16: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+          }
+        case 197: break;
+        case 86: 
+          { boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+          }
+        case 198: break;
+        case 13: 
+          { addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 199: break;
+        case 65: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+          }
+        case 200: break;
+        case 32: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 201: break;
+        case 67: 
+          { start = zzMarkedPos-2; yybegin(DTD);
+          }
+        case 202: break;
+        case 21: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT);
+          }
+        case 203: break;
+        case 42: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 204: break;
+        case 47: 
+          { /* Unknown pseudo class */ addToken(Token.DATA_TYPE);
+          }
+        case 205: break;
+        case 1: 
+          { 
+          }
+        case 206: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case INATTR_SINGLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 805: break;
+            case JS_CHAR: {
+              addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 806: break;
+            case CSS_STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+            }
+            case 807: break;
+            case JS_MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+            }
+            case 808: break;
+            case CSS_CHAR_LITERAL: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+            }
+            case 809: break;
+            case INTAG_SCRIPT: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken;
+            }
+            case 810: break;
+            case CSS_PROPERTY: {
+              addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+            }
+            case 811: break;
+            case CSS_C_STYLE_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+            }
+            case 812: break;
+            case CSS: {
+              addEndToken(INTERNAL_CSS); return firstToken;
+            }
+            case 813: break;
+            case CSS_VALUE: {
+              addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+            }
+            case 814: break;
+            case COMMENT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+            }
+            case 815: break;
+            case INATTR_DOUBLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 816: break;
+            case PI: {
+              addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+            }
+            case 817: break;
+            case JAVASCRIPT: {
+              addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 818: break;
+            case INTAG: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 819: break;
+            case INTAG_CHECK_TAG_NAME: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 820: break;
+            case INATTR_SINGLE_STYLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_STYLE); return firstToken;
+            }
+            case 821: break;
+            case DTD: {
+              addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+            }
+            case 822: break;
+            case JS_EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 823: break;
+            case INATTR_DOUBLE_STYLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_STYLE); return firstToken;
+            }
+            case 824: break;
+            case INATTR_SINGLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+            }
+            case 825: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 826: break;
+            case INATTR_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+            }
+            case 827: break;
+            case JS_STRING: {
+              addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 828: break;
+            case INTAG_STYLE: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_STYLE); return firstToken;
+            }
+            case 829: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.flex
new file mode 100644
index 0000000..f72dfc5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.flex
@@ -0,0 +1,1563 @@
+/*
+ * 02/11/2008
+ *
+ * JSPTokenMaker.java - Generates tokens for JSP syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for JSP files (supporting HTML 5).
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated JSPTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+%%
+
+%public
+%class JSPTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	private static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	private static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to JSPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed HTML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	private static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to JSPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code><script></code> tag.
+	 */
+	private static final int INTERNAL_INTAG_SCRIPT			= -4;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * script tag.
+	 */
+	private static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * script tag.
+	 */
+	private static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+	/**
+	 * Token type specifying that the user has
+	 * ended a line with an unclosed <code><style></code> tag.
+	 */
+	private static final int INTERNAL_INTAG_STYLE			= -7;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * style tag.
+	 */
+	private static final int INTERNAL_ATTR_DOUBLE_QUOTE_STYLE = -8;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * style tag.
+	 */
+	private static final int INTERNAL_ATTR_SINGLE_QUOTE_STYLE = -9;
+
+	/**
+	 * Token type specifying we're in a JSP hidden comment ("<%-- ... --%>").
+	 */
+	private static final int INTERNAL_IN_HIDDEN_COMMENT		= -10;
+
+	/**
+	 * Token type specifying we're in a JSP directive (either include, page
+	 * or taglib).
+	 */
+	private static final int INTERNAL_IN_JSP_DIRECTIVE			= -11;
+
+	/**
+	 * Token type specifying we're in JavaScript.
+	 */
+	private static final int INTERNAL_IN_JS					= -12;
+
+	/**
+	 * Token type specifying we're in a JavaScript multi-line comment.
+	 */
+	private static final int INTERNAL_IN_JS_MLC				= -13;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	private static final int INTERNAL_IN_JS_STRING_INVALID	= -14;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	private static final int INTERNAL_IN_JS_STRING_VALID		= -15;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	private static final int INTERNAL_IN_JS_CHAR_INVALID	= -16;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	private static final int INTERNAL_IN_JS_CHAR_VALID		= -17;
+
+	/**
+	 * Internal type denoting a line ending in CSS.
+	 */
+	private static final int INTERNAL_CSS					= -18;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property.
+	 */
+	private static final int INTERNAL_CSS_PROPERTY			= -19;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property value.
+	 */
+	private static final int INTERNAL_CSS_VALUE				= -20;
+
+	/**
+	 * Internal type denoting line ending in a CSS double-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	private static final int INTERNAL_CSS_STRING				= -(1<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS single-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	private static final int INTERNAL_CSS_CHAR				= -(2<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS multi-line comment.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	private static final int INTERNAL_CSS_MLC				= -(3<<11);
+
+	/**
+	 * Token type specifying we're in a Java documentation comment.
+	 */
+	private static final int INTERNAL_IN_JAVA_DOCCOMMENT		= -(4<<11);
+
+	/**
+	 * Token type specifying we're in Java code.
+	 */
+	private static final int INTERNAL_IN_JAVA_EXPRESSION		= -(5<<11);
+
+	/**
+	 * Token type specifying we're in Java multiline comment.
+	 */
+	private static final int INTERNAL_IN_JAVA_MLC			= -(6<<11);
+
+	/**
+	 * The state previous CSS-related state we were in before going into a CSS
+	 * string, multi-line comment, etc.
+	 */
+	private int cssPrevState;
+
+	/**
+	 * The state JSP was started in (YYINITIAL, INTERNAL_IN_JS, etc.).
+	 */
+	private int jspInState;
+
+	/**
+	 * Whether closing markup tags are automatically completed for JSP.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+	/**
+	 * Language state set on HTML tokens.  Must be 0.
+	 */
+	private static final int LANG_INDEX_DEFAULT = 0;
+
+	/**
+	 * Language state set on JavaScript tokens.
+	 */
+	private static final int LANG_INDEX_JS = 1;
+
+	/**
+	 * Language state set on CSS tokens.
+	 */
+	private static final int LANG_INDEX_CSS = 2;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public JSPTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * 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;
+		jspInState = YYINITIAL; // Shouldn't be necessary
+		cssPrevState = CSS; // Shouldn't be necessary
+		int languageIndex = 0;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.MARKUP_COMMENT:
+				state = COMMENT;
+				break;
+			case Token.PREPROCESSOR:
+				state = PI;
+				break;
+			case Token.VARIABLE:
+				state = DTD;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				break;
+			case INTERNAL_INTAG_STYLE:
+				state = INTAG_STYLE;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_STYLE:
+				state = INATTR_DOUBLE_STYLE;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_STYLE:
+				state = INATTR_SINGLE_STYLE;
+				break;
+			case INTERNAL_IN_HIDDEN_COMMENT:
+				state = HIDDEN_COMMENT;
+				break;
+			case INTERNAL_IN_JSP_DIRECTIVE:
+				state = JSP_DIRECTIVE;
+				break;
+			case INTERNAL_IN_JS:
+				state = JAVASCRIPT;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = false;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = true;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = false;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = true;
+				break;
+			case INTERNAL_CSS:
+				state = CSS;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			case INTERNAL_CSS_PROPERTY:
+				state = CSS_PROPERTY;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			case INTERNAL_CSS_VALUE:
+				state = CSS_VALUE;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			default:
+				if (initialTokenType<-1024) {
+					// INTERNAL_IN_JAVAxxx - jspInState or
+					// INTERNAL_IN_CSSxxx - cssPrevState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_JAVA_DOCCOMMENT:
+							state = JAVA_DOCCOMMENT;
+							jspInState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_IN_JAVA_EXPRESSION:
+							state = JAVA_EXPRESSION;
+							jspInState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_IN_JAVA_MLC:
+							state = JAVA_MLC;
+							jspInState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_CSS_STRING:
+							state = CSS_STRING;
+							languageIndex = LANG_INDEX_CSS;
+							cssPrevState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_CSS_CHAR:
+							state = CSS_CHAR_LITERAL;
+							languageIndex = LANG_INDEX_CSS;
+							cssPrevState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_CSS_MLC:
+							state = CSS_C_STYLE_COMMENT;
+							languageIndex = LANG_INDEX_CSS;
+							cssPrevState = -initialTokenType&0xff;
+							break;
+					}
+				}
+				else {
+					state = Token.NULL;
+				}
+				break;
+		}
+
+		setLanguageIndex(languageIndex);
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * 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(java.io.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;
+	}
+
+
+%}
+
+// HTML-specific stuff.
+Whitespace					= ([ \t\f])
+LineTerminator				= ([\n])
+Identifier					= ([^ \t\n<&]+)
+EntityReference				= ([&][^; \t]*[;]?)
+InTagIdentifier				= ([^ \t\n\"\'/=>]+)
+UnclosedStringLiteral		= ([\"][^\"]*)
+StringLiteral				= ({UnclosedStringLiteral}[\"])
+UnclosedCharLiteral			= ([\'][^\']*)
+CharLiteral					= ({UnclosedCharLiteral}[\'])
+EndScriptTag				= ("</" [sS][cC][rR][iI][pP][tT] ">")
+EndStyleTag					= ("</" [sS][tT][yY][lL][eE] ">")
+
+JspExpressionStart		= ("<%=")
+JspScriptletStart		= ("<%")
+JspDeclarationStart		= ("<%!")
+JspStart				= ({JspExpressionStart}|{JspScriptletStart}|{JspDeclarationStart})
+
+// General stuff.
+Letter							= [A-Za-z]
+NonzeroDigit					= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit						= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+LetterOrUnderscore				= ({Letter}|"_")
+LetterOrUnderscoreOrDash		= ({LetterOrUnderscore}|[\-])
+
+
+// Java stuff.
+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}))
+WhiteSpace				= ([ \t\f])
+JCharLiteral				= ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})[\'])
+JUnclosedCharLiteral			= ([\'][^\'\n]*)
+JErrorCharLiteral			= ({UnclosedCharLiteral}[\'])
+JStringLiteral				= ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
+JUnclosedStringLiteral		= ([\"]([\\].|[^\\\"])*[^\"]?)
+JErrorStringLiteral			= ({UnclosedStringLiteral}[\"])
+MLCBegin					= "/*"
+MLCEnd					= "*/"
+DocCommentBegin			= "/**"
+LineCommentBegin			= "//"
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral				= ({IntegerHelper1}[lL]?)
+HexLiteral				= ({IntegerHelper2}[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})
+DocumentationKeyword		= ("author"|"deprecated"|"exception"|"link"|"param"|"return"|"see"|"serial"|"serialData"|"serialField"|"since"|"throws"|"version")
+JIdentifier				= ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier			= ({NonSeparator}+)
+Annotation				= ("@"{JIdentifier}?)
+PrimitiveTypes				= ("boolean"|"byte"|"char"|"double" |"float"|"int"|"long"|"short")
+
+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")
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+// JavaScript stuff.
+JS_MLCBegin				= ({MLCBegin})
+JS_MLCEnd					= ({MLCEnd})
+JS_LineCommentBegin			= ({LineCommentBegin})
+JS_IntegerLiteral			= ({IntegerLiteral})
+JS_HexLiteral				= ({HexLiteral})
+JS_FloatLiteral			= ({FloatLiteral})
+JS_ErrorNumberFormat		= ({ErrorNumberFormat})
+JS_Separator				= ({Separator})
+JS_Separator2				= ({Separator2})
+JS_Operator				= ({Operator})
+JS_Identifier				= ({JIdentifier})
+JS_ErrorIdentifier			= ({ErrorIdentifier})
+JS_Regex					= ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[gim]*)
+
+
+
+// CSS stuff.
+CSS_SelectorPiece			= (("*"|"."|{LetterOrUnderscoreOrDash})({LetterOrUnderscoreOrDash}|"."|{Digit})*)
+CSS_PseudoClass				= (":"("root"|"nth-child"|"nth-last-child"|"nth-of-type"|"nth-last-of-type"|"first-child"|"last-child"|"first-of-type"|"last-of-type"|"only-child"|"only-of-type"|"empty"|"link"|"visited"|"active"|"hover"|"focus"|"target"|"lang"|"enabled"|"disabled"|"checked"|":first-line"|":first-letter"|":before"|":after"|"not"))
+CSS_AtKeyword				= ("@"{CSS_SelectorPiece})
+CSS_Id						= ("#"{CSS_SelectorPiece})
+CSS_Separator				= ([;\(\)\[\]])
+CSS_MlcStart				= ({JS_MLCBegin})
+CSS_MlcEnd					= ({JS_MLCEnd})
+CSS_Property				= ([\*]?{LetterOrUnderscoreOrDash}({LetterOrUnderscoreOrDash}|{Digit})*)
+CSS_ValueChar				= ({LetterOrUnderscoreOrDash}|[\\/])
+CSS_Value					= ({CSS_ValueChar}*)
+CSS_Function				= ({CSS_Value}\()
+CSS_Digits					= ([\-]?{Digit}+([0-9\.]+)?(pt|pc|in|mm|cm|em|ex|px|ms|s|%)?)
+CSS_Hex						= ("#"[0-9a-fA-F]+)
+CSS_Number					= ({CSS_Digits}|{CSS_Hex})
+
+
+%state COMMENT
+%state PI
+%state DTD
+%state INTAG
+%state INTAG_CHECK_TAG_NAME
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state INTAG_SCRIPT
+%state INATTR_DOUBLE_SCRIPT
+%state INATTR_SINGLE_SCRIPT
+%state INTAG_STYLE
+%state INATTR_DOUBLE_STYLE
+%state INATTR_SINGLE_STYLE
+%state JAVASCRIPT
+%state JS_STRING
+%state JS_CHAR
+%state JS_MLC
+%state JS_EOL_COMMENT
+%state HIDDEN_COMMENT
+%state JAVA_DOCCOMMENT
+%state JAVA_EXPRESSION
+%state JAVA_MLC
+%state JSP_DIRECTIVE
+%state CSS
+%state CSS_PROPERTY
+%state CSS_VALUE
+%state CSS_STRING
+%state CSS_CHAR_LITERAL
+%state CSS_C_STYLE_COMMENT
+
+
+%%
+
+<YYINITIAL> {
+	"<!--"						{ start = zzMarkedPos-4; yybegin(COMMENT); }
+	"<"[sS][cC][rR][iI][pP][tT]	{
+								  addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+								}
+	"<"[sS][tT][yY][lL][eE]		{
+								  addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-5,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; cssPrevState = zzLexicalState; yybegin(INTAG_STYLE);
+								}
+	"<!"						{ start = zzMarkedPos-2; yybegin(DTD); }
+	"<?"						{ start = zzMarkedPos-2; yybegin(PI); }
+	"<%--"					{ start = zzMarkedPos-4; yybegin(HIDDEN_COMMENT); }
+	{JspStart}				{ addToken(Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+	"<%@"                         { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JSP_DIRECTIVE); }
+	"<"({Letter}|{Digit})+		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+									yybegin(INTAG_CHECK_TAG_NAME);
+								}
+	"</"({Letter}|{Digit})+		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-2); //yypushback(count-2);
+									yybegin(INTAG_CHECK_TAG_NAME);
+								}
+	"<"							{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	"</"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	{LineTerminator}			{ addNullToken(); return firstToken; }
+	{Identifier}				{ addToken(Token.IDENTIFIER); } // Catches everything.
+	{EntityReference}			{ addToken(Token.MARKUP_ENTITY_REFERENCE); }
+	{Whitespace}+				{ addToken(Token.WHITESPACE); }
+	<<EOF>>					{ addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+	[^hwf\n\-]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos; }
+	[hwf]					{}
+	"-->"					{ yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); }
+	"-"						{}
+	{LineTerminator} |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken; }
+}
+
+<HIDDEN_COMMENT> {
+	[^hwf\n\-]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos; }
+	[hwf]					{}
+	"--%>"					{ yybegin(YYINITIAL); addToken(start,zzStartRead+3, Token.MARKUP_COMMENT); }
+	"-"						{}
+	{LineTerminator} |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_HIDDEN_COMMENT); return firstToken; }
+}
+
+<PI> {
+	[^\n\?]+					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+	"?>"						{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION); }
+	"?"						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+}
+
+<DTD> {
+	[^\n>]+					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken; }
+	">"						{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken; }
+}
+
+<INTAG_CHECK_TAG_NAME> {
+	[Aa] |
+	[aA][bB][bB][rR] |
+	[aA][cC][rR][oO][nN][yY][mM] |
+	[aA][dD][dD][rR][eE][sS][sS] |
+	[aA][pP][pP][lL][eE][tT] |
+	[aA][rR][eE][aA] |
+	[aA][rR][tT][iI][cC][lL][eE] |
+	[aA][sS][iI][dD][eE] |
+	[aA][uU][dD][iI][oO] |
+	[bB] |
+	[bB][aA][sS][eE] |
+	[bB][aA][sS][eE][fF][oO][nN][tT] |
+	[bB][dD][oO] |
+	[bB][gG][sS][oO][uU][nN][dD] |
+	[bB][iI][gG] |
+	[bB][lL][iI][nN][kK] |
+	[bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE] |
+	[bB][oO][dD][yY] |
+	[bB][rR] |
+	[bB][uU][tT][tT][oO][nN] |
+	[cC][aA][nN][vV][aA][sS] |
+	[cC][aA][pP][tT][iI][oO][nN] |
+	[cC][eE][nN][tT][eE][rR] |
+	[cC][iI][tT][eE] |
+	[cC][oO][dD][eE] |
+	[cC][oO][lL] |
+	[cC][oO][lL][gG][rR][oO][uU][pP] |
+	[cC][oO][mM][mM][aA][nN][dD] |
+	[cC][oO][mM][mM][eE][nN][tT] |
+	[dD][dD] |
+	[dD][aA][tT][aA][gG][rR][iI][dD] |
+	[dD][aA][tT][aA][lL][iI][sS][tT] |
+	[dD][aA][tT][aA][tT][eE][mM][pP][lL][aA][tT][eE] |
+	[dD][eE][lL] |
+	[dD][eE][tT][aA][iI][lL][sS] |
+	[dD][fF][nN] |
+	[dD][iI][aA][lL][oO][gG] |
+	[dD][iI][rR] |
+	[dD][iI][vV] |
+	[dD][lL] |
+	[dD][tT] |
+	[eE][mM] |
+	[eE][mM][bB][eE][dD] |
+	[eE][vV][eE][nN][tT][sS][oO][uU][rR][cC][eE] |
+	[fF][iI][eE][lL][dD][sS][eE][tT] |
+	[fF][iI][gG][uU][rR][eE] |
+	[fF][oO][nN][tT] |
+	[fF][oO][oO][tT][eE][rR] |
+	[fF][oO][rR][mM] |
+	[fF][rR][aA][mM][eE] |
+	[fF][rR][aA][mM][eE][sS][eE][tT] |
+	[hH][123456] |
+	[hH][eE][aA][dD] |
+	[hH][eE][aA][dD][eE][rR] |
+	[hH][rR] |
+	[hH][tT][mM][lL] |
+	[iI] |
+	[iI][fF][rR][aA][mM][eE] |
+	[iI][lL][aA][yY][eE][rR] |
+	[iI][mM][gG] |
+	[iI][nN][pP][uU][tT] |
+	[iI][nN][sS] |
+	[iI][sS][iI][nN][dD][eE][xX] |
+	[kK][bB][dD] |
+	[kK][eE][yY][gG][eE][nN] |
+	[lL][aA][bB][eE][lL] |
+	[lL][aA][yY][eE][rR] |
+	[lL][eE][gG][eE][nN][dD] |
+	[lL][iI] |
+	[lL][iI][nN][kK] |
+	[mM][aA][pP] |
+	[mM][aA][rR][kK] |
+	[mM][aA][rR][qQ][uU][eE][eE] |
+	[mM][eE][nN][uU] |
+	[mM][eE][tT][aA] |
+	[mM][eE][tT][eE][rR] |
+	[mM][uU][lL][tT][iI][cC][oO][lL] |
+	[nN][aA][vV] |
+	[nN][eE][sS][tT] |
+	[nN][oO][bB][rR] |
+	[nN][oO][eE][mM][bB][eE][dD] |
+	[nN][oO][fF][rR][aA][mM][eE][sS] |
+	[nN][oO][lL][aA][yY][eE][rR] |
+	[nN][oO][sS][cC][rR][iI][pP][tT] |
+	[oO][bB][jJ][eE][cC][tT] |
+	[oO][lL] |
+	[oO][pP][tT][gG][rR][oO][uU][pP] |
+	[oO][pP][tT][iI][oO][nN] |
+	[oO][uU][tT][pP][uU][tT] |
+	[pP] |
+	[pP][aA][rR][aA][mM] |
+	[pP][lL][aA][iI][nN][tT][eE][xX][tT] |
+	[pP][rR][eE] |
+	[pP][rR][oO][gG][rR][eE][sS][sS] |
+	[qQ] |
+	[rR][uU][lL][eE] |
+	[sS] |
+	[sS][aA][mM][pP] |
+	[sS][cC][rR][iI][pP][tT] |
+	[sS][eE][cC][tT][iI][oO][nN] |
+	[sS][eE][lL][eE][cC][tT] |
+	[sS][eE][rR][vV][eE][rR] |
+	[sS][mM][aA][lL][lL] |
+	[sS][oO][uU][rR][cC][eE] |
+	[sS][pP][aA][cC][eE][rR] |
+	[sS][pP][aA][nN] |
+	[sS][tT][rR][iI][kK][eE] |
+	[sS][tT][rR][oO][nN][gG] |
+	[sS][tT][yY][lL][eE] |
+	[sS][uU][bB] |
+	[sS][uU][pP] |
+	[tT][aA][bB][lL][eE] |
+	[tT][bB][oO][dD][yY] |
+	[tT][dD] |
+	[tT][eE][xX][tT][aA][rR][eE][aA] |
+	[tT][fF][oO][oO][tT] |
+	[tT][hH] |
+	[tT][hH][eE][aA][dD] |
+	[tT][iI][mM][eE] |
+	[tT][iI][tT][lL][eE] |
+	[tT][rR] |
+	[tT][tT] |
+	[uU] |
+	[uU][lL] |
+	[vV][aA][rR] |
+	[vV][iI][dD][eE][oO]    { addToken(Token.MARKUP_TAG_NAME); }
+	{InTagIdentifier}		{ /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG); }
+	.						{ /* Shouldn't happen */ yypushback(1); yybegin(INTAG); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INTAG> {
+	{JspStart}				{ addToken(Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); }
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	"/>"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	">"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+	{JspStart}				{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+	[^\"<]*					{}
+	"<"						{ /* Allowing JSP expressions, etc. */ }
+	[\"]					{ addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+	{JspStart}				{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+	[^\'<]*					{}
+	"<"						{ /* Allowing JSP expressions, etc. */ }
+	[\']					{ addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<INTAG_SCRIPT> {
+	{JspStart}				{ addToken(Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	"/>"					{	addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+	{Whitespace}+				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	">"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JAVASCRIPT, LANG_INDEX_JS); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken; }
+}
+
+<INATTR_DOUBLE_SCRIPT> {
+	{JspStart}				{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+	[^\"<]*					{}
+	"<"						{ /* Allowing JSP expressions, etc. */ }
+	[\"]					{ yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INATTR_SINGLE_SCRIPT> {
+	{JspStart}				{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+	[^\'<]*					{}
+	"<"						{ /* Allowing JSP expressions, etc. */ }
+	[\']					{ yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INTAG_STYLE> {
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	"/>"					{	addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	">"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(CSS, LANG_INDEX_CSS); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_STYLE); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE_STYLE); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_STYLE); return firstToken; }
+}
+
+<INATTR_DOUBLE_STYLE> {
+	[^\"]*						{}
+	[\"]						{ yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_STYLE); return firstToken; }
+}
+
+<INATTR_SINGLE_STYLE> {
+	[^\']*						{}
+	[\']						{ yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_STYLE); return firstToken; }
+}
+
+<JAVASCRIPT> {
+
+	{EndScriptTag}					{
+								  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+								}
+
+	// ECMA 3+ keywords.
+	"break" |
+	"continue" |
+	"delete" |
+	"else" |
+	"for" |
+	"function" |
+	"if" |
+	"in" |
+	"new" |
+	"this" |
+	"typeof" |
+	"var" |
+	"void" |
+	"while" |
+	"with"						{ addToken(Token.RESERVED_WORD); }
+	"return"					{ addToken(Token.RESERVED_WORD_2); }
+
+	//JavaScript 1.6
+	"each" 						{if(JavaScriptTokenMaker.isJavaScriptCompatible("1.6")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+	//JavaScript 1.7
+	"let" 						{if(JavaScriptTokenMaker.isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+
+	// Reserved (but not yet used) ECMA keywords.
+	"abstract" |
+	"case" |
+	"catch" |
+	"class" |
+	"const" |
+	"debugger" |
+	"default" |
+	"do" |
+	"enum" |
+	"export" |
+	"extends" |
+	"final" |
+	"finally" |
+	"goto" |
+	"implements" |
+	"import" |
+	"instanceof" |
+	"interface" |
+	"native" |
+	"package" |
+	"private" |
+	"protected" |
+	"public" |
+	"static" |
+	"super" |
+	"switch" |
+	"synchronized" |
+	"throw" |
+	"throws" |
+	"transient" |
+	"try" |
+	"volatile" |
+	"null"						{ addToken(Token.RESERVED_WORD); }
+	{PrimitiveTypes}				{ addToken(Token.DATA_TYPE); }
+
+	// Literals.
+	{BooleanLiteral}				{ addToken(Token.LITERAL_BOOLEAN); }
+	"NaN"						{ addToken(Token.RESERVED_WORD); }
+	"Infinity"					{ addToken(Token.RESERVED_WORD); }
+
+	// Functions.
+	"eval" |
+	"parseInt" |
+	"parseFloat" |
+	"escape" |
+	"unescape" |
+	"isNaN" |
+	"isFinite"					{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addEndToken(INTERNAL_IN_JS); return firstToken; }
+	{JS_Identifier}				{ addToken(Token.IDENTIFIER); }
+	{Whitespace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	[\']							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
+	[\"]							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{JS_MLCBegin}					{ start = zzMarkedPos-2; yybegin(JS_MLC); }
+	{JS_LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
+
+	/* Attempt to identify regular expressions (not foolproof) - do after comments! */
+	{JS_Regex}						{
+										boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+									}
+
+	/* Separators. */
+	{JS_Separator}					{ addToken(Token.SEPARATOR); }
+	{JS_Separator2}				{ addToken(Token.IDENTIFIER); }
+
+	{JspStart}				{ addToken(Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+
+	/* Operators. */
+	{JS_Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{JS_IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{JS_HexLiteral}				{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{JS_FloatLiteral}				{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{JS_ErrorNumberFormat}			{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{JS_ErrorIdentifier}			{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<JS_STRING> {
+	[^\n\\\"]+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+							}
+	\"						{ int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_CHAR> {
+	[^\n\\\']+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+							}
+	\'						{ int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+
+<JS_MLC> {
+	// JavaScript MLC's.  This state is essentially Java's MLC state.
+	[^hwf<\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	{EndScriptTag}			{
+							  yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+							}
+	"<"						{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+	{JS_MLCEnd}					{ yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+}
+
+
+<JS_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]					{}
+	{EndScriptTag}			{
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+							  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+							}
+	"<"						{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+}
+
+
+<CSS> {
+	{EndStyleTag}		{
+						  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+						  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+						  addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+						  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+						}
+	{CSS_SelectorPiece}	{ addToken(Token.DATA_TYPE); }
+	{CSS_PseudoClass}	{ addToken(Token.RESERVED_WORD); }
+	":"					{ /* Unknown pseudo class */ addToken(Token.DATA_TYPE); }
+	{CSS_AtKeyword}		{ addToken(Token.REGEX); }
+	{CSS_Id}			{ addToken(Token.VARIABLE); }
+	"{"					{ addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY); }
+	[,]					{ addToken(Token.IDENTIFIER); }
+	\"					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+	\'					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+	[+>~\^$\|=]			{ addToken(Token.OPERATOR); }
+	{CSS_Separator}		{ addToken(Token.SEPARATOR); }
+	{Whitespace}		{ addToken(Token.WHITESPACE); }
+	{CSS_MlcStart}		{ start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+	.					{ /*System.out.println("CSS: " + yytext());*/ addToken(Token.IDENTIFIER); }
+	"\n" |
+	<<EOF>>				{ addEndToken(INTERNAL_CSS); return firstToken; }
+}
+
+<CSS_PROPERTY> {
+	{EndStyleTag}		{
+						  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+						  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+						  addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+						  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+						}
+	{CSS_Property}		{ addToken(Token.RESERVED_WORD); }
+	"}"					{ addToken(Token.SEPARATOR); yybegin(CSS); }
+	":"					{ addToken(Token.OPERATOR); yybegin(CSS_VALUE); }
+	{Whitespace}		{ addToken(Token.WHITESPACE); }
+	{CSS_MlcStart}		{ start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+	.					{ /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER); }
+	"\n" |
+	<<EOF>>				{ addEndToken(INTERNAL_CSS_PROPERTY); return firstToken; }
+}
+
+<CSS_VALUE> {
+	{EndStyleTag}		{
+						  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+						  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+						  addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+						  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+						}
+	{CSS_Value}			{ addToken(Token.IDENTIFIER); }
+	"!important"		{ addToken(Token.ANNOTATION); }
+	{CSS_Function}		{ int temp = zzMarkedPos - 2;
+						  addToken(zzStartRead, temp, Token.FUNCTION);
+						  addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+						  zzStartRead = zzCurrentPos = zzMarkedPos;
+						}
+	{CSS_Number}		{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	\"					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+	\'					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+	")"					{ /* End of a function */ addToken(Token.SEPARATOR); }
+	[;]					{ addToken(Token.OPERATOR); yybegin(CSS_PROPERTY); }
+	[,\.]				{ addToken(Token.IDENTIFIER); }
+	"}"					{ addToken(Token.SEPARATOR); yybegin(CSS); }
+	{Whitespace}		{ addToken(Token.WHITESPACE); }
+	{CSS_MlcStart}		{ start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+	.					{ /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER); }
+	"\n" |
+	<<EOF>>				{ addEndToken(INTERNAL_CSS_VALUE); return firstToken; }
+}
+
+<CSS_STRING> {
+	[^\n\\\"]+			{}
+	\\.?				{ /* Skip escaped chars. */ }
+	\"					{ addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState); }
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken; }
+}
+
+<CSS_CHAR_LITERAL> {
+	[^\n\\\']+			{}
+	\\.?				{ /* Skip escaped chars. */ }
+	\'					{ addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState); }
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken; }
+}
+
+<CSS_C_STYLE_COMMENT> {
+	[^hwf\n\*]+			{}
+	{URL}				{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]				{}
+	{CSS_MlcEnd}		{ addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState); }
+	\*					{}
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken; }
+}
+
+
+<JAVA_EXPRESSION> {
+
+	"%>"							{ addToken(Token.MARKUP_TAG_DELIMITER); start = zzMarkedPos; yybegin(jspInState); }
+
+	/* Keywords */
+	"abstract"|
+	"assert" |
+	"break"	 |
+	"case"	 |
+	"catch"	 |
+	"class"	 |
+	"const"	 |
+	"continue" |
+	"default" |
+	"do"	 |
+	"else"	 |
+	"enum"	 |
+	"extends" |
+	"final"	 |
+	"finally" |
+	"for"	 |
+	"goto"	 |
+	"if"	 |
+	"implements" |
+	"import" |
+	"instanceof" |
+	"interface" |
+	"native" |
+	"new"	 |
+	"null"	 |
+	"package" |
+	"private" |
+	"protected" |
+	"public" |
+	"static" |
+	"strictfp" |
+	"super"	 |
+	"switch" |
+	"synchronized" |
+	"this"	 |
+	"throw"	 |
+	"throws" |
+	"transient" |
+	"try"	 |
+	"void"	 |
+	"volatile" |
+	"while"					{ addToken(Token.RESERVED_WORD); }
+	"return"				{ addToken(Token.RESERVED_WORD_2); }
+
+	/* Data types. */
+	{PrimitiveTypes}			{ addToken(Token.DATA_TYPE); }
+
+	/* Booleans. */
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+	/* java.lang classes */
+	"Appendable" |
+	"AutoCloseable" |
+	"CharSequence" |
+	"Cloneable" |
+	"Comparable" |
+	"Iterable" |
+	"Readable" |
+	"Runnable" |
+	"Thread.UncaughtExceptionHandler" |
+	"Boolean" |
+	"Byte" |
+	"Character" |
+	"Character.Subset" | 
+	"Character.UnicodeBlock" | 
+	"Class" |
+	"ClassLoader" |
+	"Compiler" |
+	"Double" |
+	"Enum" |
+	"Float" |
+	"InheritableThreadLocal" |
+	"Integer" |
+	"Long" |
+	"Math" |
+	"Number" |
+	"Object" |
+	"Package" |
+	"Process" |
+	"ProcessBuilder" |
+	"ProcessBuilder.Redirect" |
+	"Runtime" |
+	"RuntimePermission" |
+	"SecurityManager" |
+	"Short" |
+	"StackTraceElement" |
+	"StrictMath" |
+	"String" |
+	"StringBuffer" |
+	"StringBuilder" |
+	"System" |
+	"Thread" |
+	"ThreadGroup" |
+	"ThreadLocal" |
+	"Throwable" |
+	"Void" |
+	"Character.UnicodeScript" |
+	"ProcessBuilder.Redirect.Type" |
+	"Thread.State" |
+	"ArithmeticException" |
+	"ArrayIndexOutOfBoundsException" |
+	"ArrayStoreException" |
+	"ClassCastException" |
+	"ClassNotFoundException" |
+	"CloneNotSupportedException" |
+	"EnumConstantNotPresentException" |
+	"Exception" |
+	"IllegalAccessException" |
+	"IllegalArgumentException" |
+	"IllegalMonitorStateException" |
+	"IllegalStateException" |
+	"IllegalThreadStateException" |
+	"IndexOutOfBoundsException" |
+	"InstantiationException" |
+	"InterruptedException" |
+	"NegativeArraySizeException" |
+	"NoSuchFieldException" |
+	"NoSuchMethodException" |
+	"NullPointerException" |
+	"NumberFormatException" |
+	"RuntimeException" |
+	"SecurityException" |
+	"StringIndexOutOfBoundsException" |
+	"TypeNotPresentException" |
+	"UnsupportedOperationException" |
+	"AbstractMethodError" |
+	"AssertionError" |
+	"ClassCircularityError" |
+	"ClassFormatError" |
+	"Error" |
+	"ExceptionInInitializerError" |
+	"IllegalAccessError" |
+	"IncompatibleClassChangeError" |
+	"InstantiationError" |
+	"InternalError" |
+	"LinkageError" |
+	"NoClassDefFoundError" |
+	"NoSuchFieldError" |
+	"NoSuchMethodError" |
+	"OutOfMemoryError" |
+	"StackOverflowError" |
+	"ThreadDeath" |
+	"UnknownError" |
+	"UnsatisfiedLinkError" |
+	"UnsupportedClassVersionError" |
+	"VerifyError" |
+	"VirtualMachineError" 			{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
+
+	{JIdentifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	{JCharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{JUnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
+	{JErrorCharLiteral}				{ addToken(Token.ERROR_CHAR); }
+	{JStringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{JUnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
+	{JErrorStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(JAVA_MLC); }
+	{DocCommentBegin}				{ start = zzMarkedPos-3; yybegin(JAVA_DOCCOMMENT); }
+	{LineCommentBegin}.*			{ addToken(Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
+
+	/* Annotations. */
+	{Annotation}					{ addToken(Token.ANNOTATION); }
+
+	/* Separators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{Operator}					{ 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); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<JAVA_MLC> {
+	[^hwf\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+	{MLCEnd}					{ yybegin(JAVA_EXPRESSION); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JAVA_MLC - jspInState); return firstToken; }
+}
+
+
+<JAVA_DOCCOMMENT> {
+
+	[^hwf\@\{\n\<\*]+			{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
+	[hwf]						{}
+
+	"@"{BlockTag}				{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+	"@"							{}
+	"{@"{InlineTag}[^\}]*"}"	{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+	"{"							{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JAVA_DOCCOMMENT - jspInState); return firstToken; }
+	"<"[/]?({Letter}[^\>]*)?">"	{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos; }
+	\<							{}
+	{MLCEnd}					{ yybegin(JAVA_EXPRESSION); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION); }
+	\*							{}
+	<<EOF>>						{ yybegin(JAVA_EXPRESSION); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JAVA_DOCCOMMENT - jspInState); return firstToken; }
+
+}
+
+
+<JSP_DIRECTIVE> {
+	"include" |
+	"page" |
+	"taglib"					{ addToken(Token.RESERVED_WORD); }
+	"/"						{ addToken(Token.RESERVED_WORD); }
+	{InTagIdentifier}			{ addToken(Token.IDENTIFIER); }
+	{Whitespace}+				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	"%>"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	"%"						{ addToken(Token.IDENTIFIER); }
+	">"						{ addToken(Token.IDENTIFIER); /* Needed as InTagIdentifier ignores it. */ }
+	{UnclosedStringLiteral}		{ addToken(Token.ERROR_STRING_DOUBLE); }
+	{StringLiteral}			{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedCharLiteral}		{ addToken(Token.ERROR_CHAR); }
+	{CharLiteral}				{ addToken(Token.LITERAL_CHAR); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_IN_JSP_DIRECTIVE); return firstToken; }
+}
+
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.java
new file mode 100644
index 0000000..714c41c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.java
@@ -0,0 +1,5316 @@
+/* The following code was generated by JFlex 1.4.1 on 3/23/13 9:52 AM */
+
+/*
+ * 02/11/2008
+ *
+ * JSPTokenMaker.java - Generates tokens for JSP syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for JSP files (supporting HTML 5).
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated JSPTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+
+public class JSPTokenMaker extends AbstractMarkupTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int INATTR_SINGLE_SCRIPT = 10;
+  public static final int JS_CHAR = 16;
+  public static final int JAVA_EXPRESSION = 21;
+  public static final int CSS_STRING = 27;
+  public static final int HIDDEN_COMMENT = 19;
+  public static final int JS_MLC = 17;
+  public static final int CSS_CHAR_LITERAL = 28;
+  public static final int JAVA_DOCCOMMENT = 20;
+  public static final int INTAG_SCRIPT = 8;
+  public static final int CSS_PROPERTY = 25;
+  public static final int CSS_C_STYLE_COMMENT = 29;
+  public static final int CSS = 24;
+  public static final int CSS_VALUE = 26;
+  public static final int JSP_DIRECTIVE = 23;
+  public static final int COMMENT = 1;
+  public static final int INATTR_DOUBLE_SCRIPT = 9;
+  public static final int PI = 2;
+  public static final int JAVASCRIPT = 14;
+  public static final int INTAG = 4;
+  public static final int INTAG_CHECK_TAG_NAME = 5;
+  public static final int INATTR_SINGLE_STYLE = 13;
+  public static final int DTD = 3;
+  public static final int JS_EOL_COMMENT = 18;
+  public static final int INATTR_DOUBLE_STYLE = 12;
+  public static final int INATTR_SINGLE = 7;
+  public static final int YYINITIAL = 0;
+  public static final int INATTR_DOUBLE = 6;
+  public static final int JS_STRING = 15;
+  public static final int JAVA_MLC = 22;
+  public static final int INTAG_STYLE = 11;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\4\1\2\1\0\1\1\1\45\22\0\1\4\1\26\1\10"+
+    "\1\46\1\47\1\25\1\5\1\11\1\111\1\110\1\50\1\54\1\63"+
+    "\1\35\1\55\1\12\1\31\3\44\3\124\1\33\2\30\1\66\1\6"+
+    "\1\3\1\7\1\21\1\65\1\104\1\112\1\32\1\14\1\101\1\24"+
+    "\1\52\1\117\1\123\1\16\1\125\1\120\1\23\1\115\1\114\1\113"+
+    "\1\17\1\121\1\15\1\13\1\20\1\116\1\122\1\27\1\51\1\22"+
+    "\1\27\1\107\1\36\1\107\1\64\1\34\1\0\1\57\1\43\1\74"+
+    "\1\72\1\56\1\53\1\106\1\70\1\76\1\131\1\77\1\60\1\100"+
+    "\1\42\1\71\1\73\1\130\1\40\1\61\1\41\1\37\1\103\1\102"+
+    "\1\75\1\105\1\126\1\127\1\64\1\62\1\67\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 =
+    "\6\0\2\1\1\0\2\1\1\0\2\1\14\0\1\2"+
+    "\3\0\2\2\1\3\1\4\1\5\1\6\1\1\1\7"+
+    "\5\1\1\10\2\1\1\11\1\12\2\13\1\5\1\14"+
+    "\1\15\1\16\1\17\1\20\1\21\1\22\1\23\2\21"+
+    "\2\23\3\21\2\23\2\21\1\23\6\21\1\23\1\1"+
+    "\1\24\1\25\1\1\1\13\1\26\1\27\1\17\1\30"+
+    "\1\31\1\32\1\33\1\34\1\1\1\35\1\1\1\36"+
+    "\1\37\2\14\1\2\1\14\1\40\1\41\1\14\2\2"+
+    "\1\14\2\42\1\14\5\2\1\36\1\2\1\14\5\2"+
+    "\1\43\10\2\1\1\1\44\1\45\1\46\1\1\1\47"+
+    "\1\50\1\51\1\1\1\52\6\1\1\53\1\1\1\54"+
+    "\2\1\1\55\7\1\1\56\1\14\1\57\1\60\1\14"+
+    "\10\2\1\14\16\2\1\61\6\2\1\1\1\62\4\1"+
+    "\2\2\1\63\1\64\1\65\1\66\4\2\1\67\1\70"+
+    "\1\67\1\71\1\72\1\67\1\73\1\67\1\74\1\67"+
+    "\1\75\1\76\1\77\2\76\1\65\1\76\1\100\1\101"+
+    "\1\102\1\103\1\102\1\104\2\2\1\102\1\42\1\2"+
+    "\1\102\1\105\1\106\1\107\1\110\1\111\1\112\1\113"+
+    "\1\114\1\1\1\4\2\115\1\116\1\117\1\120\1\6"+
+    "\5\0\1\121\1\116\32\21\2\23\2\21\1\23\44\21"+
+    "\1\122\1\123\2\0\1\116\1\0\1\14\1\124\1\0"+
+    "\1\125\1\36\1\2\1\14\1\126\1\42\1\126\2\127"+
+    "\1\126\1\130\1\126\37\2\1\65\7\2\2\65\7\2"+
+    "\1\131\1\132\1\133\1\0\1\134\10\0\1\135\1\136"+
+    "\20\0\1\57\1\137\1\57\1\60\1\0\1\64\1\60"+
+    "\1\140\1\141\25\2\1\142\12\2\1\61\17\2\1\143"+
+    "\4\0\1\144\3\2\1\0\1\145\1\146\15\0\1\147"+
+    "\1\0\1\42\5\0\1\42\1\111\1\150\1\151\2\115"+
+    "\1\116\1\0\1\152\1\0\1\153\4\0\1\116\14\21"+
+    "\1\23\63\21\1\122\1\0\1\154\1\0\1\36\1\2"+
+    "\1\127\1\0\2\130\30\2\1\155\23\2\1\73\11\2"+
+    "\40\0\1\63\1\57\1\0\2\57\1\60\1\0\1\64"+
+    "\3\60\1\156\41\2\1\36\23\2\4\0\3\2\25\0"+
+    "\2\115\1\157\1\160\2\0\1\161\21\21\1\23\12\21"+
+    "\1\23\6\21\1\0\1\162\1\36\2\2\1\163\6\2"+
+    "\1\73\3\2\1\164\3\2\1\165\23\2\1\0\1\1"+
+    "\3\0\1\166\1\0\1\167\2\0\1\170\10\0\1\171"+
+    "\15\0\3\57\1\60\30\2\1\165\4\2\1\36\22\2"+
+    "\2\0\1\172\1\2\1\65\1\2\23\0\2\115\2\0"+
+    "\12\21\1\23\11\21\1\0\1\36\3\2\1\65\3\2"+
+    "\1\65\16\2\35\0\3\57\1\60\5\2\1\165\25\2"+
+    "\1\36\20\2\2\0\2\2\16\0\1\115\1\173\12\21"+
+    "\1\0\1\36\1\2\1\174\14\2\24\0\2\57\1\60"+
+    "\1\165\24\2\1\165\6\2\1\36\10\2\1\165\10\2"+
+    "\12\0\1\175\3\21\1\0\6\2\4\0\1\171\6\0"+
+    "\1\57\14\2\1\165\7\2\1\165\1\2\1\0\6\2"+
+    "\1\36\21\2\6\0\1\21\1\0\2\2\13\0\1\57"+
+    "\31\2\2\0\22\2\1\176\4\0\1\21\1\177\1\2"+
+    "\1\200\1\201\5\0\13\2\1\165\15\2\2\0\3\2"+
+    "\1\165\15\2\10\0\10\2\1\0\15\2\2\0\16\2"+
+    "\3\0\1\61\2\0\6\2\2\0\13\2\2\0\17\2"+
+    "\2\0\12\2\1\165\1\0\15\2\2\0\10\2\1\0"+
+    "\11\2\2\0\4\2\1\165\1\0\5\2\2\0\3\2"+
+    "\2\0\4\2\1\0\2\2\2\0\3\2\1\0\2\2"+
+    "\2\0\3\2\2\0\1\2\2\0\3\2\2\0\1\2"+
+    "\2\0\3\2\2\0\1\2\2\0\1\2\4\0\1\2"+
+    "\2\0\1\165\13\0";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[1643];
+    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\132\0\264\0\u010e\0\u0168\0\u01c2\0\u021c\0\u0276"+
+    "\0\u02d0\0\u032a\0\u0384\0\u03de\0\u0438\0\u0492\0\u04ec\0\u0546"+
+    "\0\u05a0\0\u05fa\0\u0654\0\u06ae\0\u0708\0\u0762\0\u07bc\0\u0816"+
+    "\0\u0870\0\u08ca\0\u0924\0\u097e\0\u09d8\0\u0a32\0\u0a8c\0\u0ae6"+
+    "\0\u0b40\0\u0b9a\0\u0bf4\0\u0c4e\0\u0ca8\0\u0b40\0\u0d02\0\u0d5c"+
+    "\0\u0db6\0\u0e10\0\u0e6a\0\u0b40\0\u0ec4\0\u0f1e\0\u0b40\0\u0b40"+
+    "\0\u0f78\0\u0fd2\0\u0b40\0\u0b40\0\u0b40\0\u0b40\0\u102c\0\u0b40"+
+    "\0\u1086\0\u0b40\0\u10e0\0\u113a\0\u1194\0\u11ee\0\u1248\0\u12a2"+
+    "\0\u12fc\0\u1356\0\u13b0\0\u140a\0\u1464\0\u14be\0\u1518\0\u1572"+
+    "\0\u15cc\0\u1626\0\u1680\0\u16da\0\u1734\0\u1086\0\u178e\0\u17e8"+
+    "\0\u0b40\0\u1842\0\u189c\0\u0b40\0\u0b40\0\u18f6\0\u0b40\0\u0b40"+
+    "\0\u0b40\0\u0b40\0\u0b40\0\u1950\0\u0b40\0\u19aa\0\u1a04\0\u0b40"+
+    "\0\u1a5e\0\u1ab8\0\u0b40\0\u1b12\0\u0b40\0\u0b40\0\u1b6c\0\u1bc6"+
+    "\0\u1c20\0\u1c7a\0\u1cd4\0\u1d2e\0\u1d88\0\u1de2\0\u1e3c\0\u1e96"+
+    "\0\u1ef0\0\u1f4a\0\u0b40\0\u1fa4\0\u1ffe\0\u2058\0\u20b2\0\u210c"+
+    "\0\u2166\0\u21c0\0\u0b40\0\u221a\0\u2274\0\u22ce\0\u2328\0\u2382"+
+    "\0\u23dc\0\u2436\0\u2490\0\u24ea\0\u0b40\0\u0b40\0\u2544\0\u259e"+
+    "\0\u0b40\0\u0b40\0\u2544\0\u25f8\0\u0b40\0\u2652\0\u26ac\0\u2706"+
+    "\0\u2760\0\u27ba\0\u2814\0\u0b40\0\u286e\0\u0b40\0\u28c8\0\u2922"+
+    "\0\u0b40\0\u297c\0\u29d6\0\u2a30\0\u2a8a\0\u2ae4\0\u2b3e\0\u2b98"+
+    "\0\u0b40\0\u2bf2\0\u2c4c\0\u2ca6\0\u2d00\0\u2d5a\0\u2db4\0\u2e0e"+
+    "\0\u2e68\0\u2ec2\0\u2f1c\0\u2f76\0\u2fd0\0\u302a\0\u3084\0\u30de"+
+    "\0\u3138\0\u3192\0\u31ec\0\u3246\0\u32a0\0\u32fa\0\u3354\0\u33ae"+
+    "\0\u3408\0\u3462\0\u34bc\0\u3516\0\u3570\0\u35ca\0\u3624\0\u367e"+
+    "\0\u36d8\0\u3732\0\u378c\0\u37e6\0\u0b40\0\u3840\0\u389a\0\u38f4"+
+    "\0\u394e\0\u39a8\0\u3a02\0\u3a5c\0\u3ab6\0\u0b40\0\u0b40\0\u3b10"+
+    "\0\u3b6a\0\u3bc4\0\u3c1e\0\u0b40\0\u0b40\0\u3c78\0\u0b40\0\u0b40"+
+    "\0\u3cd2\0\u3d2c\0\u3d86\0\u3de0\0\u3e3a\0\u0b40\0\u0b40\0\u0b40"+
+    "\0\u3c78\0\u3cd2\0\u3e94\0\u3eee\0\u0b40\0\u0b40\0\u0b40\0\u0b40"+
+    "\0\u3c78\0\u0b40\0\u3f48\0\u3fa2\0\u3ffc\0\u4056\0\u40b0\0\u410a"+
+    "\0\u0b40\0\u0b40\0\u0b40\0\u0b40\0\u4164\0\u0b40\0\u0b40\0\u0b40"+
+    "\0\u41be\0\u4218\0\u4272\0\u42cc\0\u4326\0\u4380\0\u0b40\0\u0b40"+
+    "\0\u43da\0\u4434\0\u448e\0\u44e8\0\u4542\0\u0b40\0\u459c\0\u45f6"+
+    "\0\u4650\0\u46aa\0\u4704\0\u475e\0\u47b8\0\u4812\0\u486c\0\u48c6"+
+    "\0\u4920\0\u497a\0\u49d4\0\u4a2e\0\u4a88\0\u4ae2\0\u4b3c\0\u4b96"+
+    "\0\u4bf0\0\u4c4a\0\u4ca4\0\u4cfe\0\u4d58\0\u4db2\0\u4e0c\0\u4e66"+
+    "\0\u4ec0\0\u4f1a\0\u4f74\0\u4fce\0\u5028\0\u5082\0\u50dc\0\u5136"+
+    "\0\u5190\0\u51ea\0\u5244\0\u529e\0\u52f8\0\u5352\0\u53ac\0\u5406"+
+    "\0\u5460\0\u54ba\0\u5514\0\u556e\0\u55c8\0\u5622\0\u567c\0\u56d6"+
+    "\0\u5730\0\u578a\0\u57e4\0\u583e\0\u5898\0\u58f2\0\u594c\0\u59a6"+
+    "\0\u5a00\0\u5a5a\0\u5ab4\0\u5b0e\0\u5b68\0\u5bc2\0\u5c1c\0\u5c76"+
+    "\0\u5cd0\0\u5d2a\0\u5d84\0\u0b40\0\u1b12\0\u5dde\0\u5e38\0\u5e92"+
+    "\0\u5e92\0\u0b40\0\u5eec\0\u5f46\0\u5fa0\0\u5ffa\0\u6054\0\u60ae"+
+    "\0\u60ae\0\u6108\0\u60ae\0\u6162\0\u61bc\0\u6216\0\u6270\0\u62ca"+
+    "\0\u6324\0\u637e\0\u63d8\0\u6432\0\u648c\0\u64e6\0\u6540\0\u659a"+
+    "\0\u65f4\0\u664e\0\u66a8\0\u6702\0\u675c\0\u67b6\0\u6810\0\u686a"+
+    "\0\u68c4\0\u691e\0\u6978\0\u69d2\0\u6a2c\0\u6a86\0\u6ae0\0\u6b3a"+
+    "\0\u6b94\0\u6bee\0\u6c48\0\u6ca2\0\u6cfc\0\u6d56\0\u6db0\0\u6e0a"+
+    "\0\u6e64\0\u6ebe\0\u6f18\0\u6f72\0\u6fcc\0\u7026\0\u7080\0\u1bc6"+
+    "\0\u70da\0\u7134\0\u718e\0\u71e8\0\u7242\0\u729c\0\u72f6\0\u0b40"+
+    "\0\u7350\0\u73aa\0\u7404\0\u0b40\0\u745e\0\u74b8\0\u7512\0\u756c"+
+    "\0\u75c6\0\u7620\0\u767a\0\u76d4\0\u0b40\0\u0b40\0\u772e\0\u7788"+
+    "\0\u77e2\0\u783c\0\u7896\0\u78f0\0\u794a\0\u79a4\0\u79fe\0\u7a58"+
+    "\0\u7ab2\0\u7b0c\0\u7b66\0\u7bc0\0\u7c1a\0\u7c74\0\u7cce\0\u0b40"+
+    "\0\u7d28\0\u7d82\0\u7ddc\0\u0b40\0\u7e36\0\u7e90\0\u7eea\0\u7f44"+
+    "\0\u7f9e\0\u7ff8\0\u8052\0\u80ac\0\u8106\0\u8160\0\u81ba\0\u8214"+
+    "\0\u826e\0\u82c8\0\u8322\0\u837c\0\u83d6\0\u8430\0\u848a\0\u84e4"+
+    "\0\u853e\0\u8598\0\u85f2\0\u864c\0\u0b40\0\u86a6\0\u8700\0\u875a"+
+    "\0\u87b4\0\u880e\0\u8868\0\u88c2\0\u891c\0\u7080\0\u8976\0\u89d0"+
+    "\0\u8a2a\0\u8a84\0\u8ade\0\u8b38\0\u8b92\0\u8bec\0\u8c46\0\u8ca0"+
+    "\0\u8cfa\0\u8d54\0\u8dae\0\u8e08\0\u8e62\0\u8ebc\0\u8f16\0\u0b40"+
+    "\0\u8f70\0\u8fca\0\u9024\0\u907e\0\u0b40\0\u90d8\0\u9132\0\u918c"+
+    "\0\u91e6\0\u0b40\0\u9240\0\u929a\0\u92f4\0\u934e\0\u93a8\0\u9402"+
+    "\0\u945c\0\u94b6\0\u9510\0\u956a\0\u95c4\0\u961e\0\u9678\0\u96d2"+
+    "\0\u972c\0\u9786\0\u0b40\0\u97e0\0\u983a\0\u9894\0\u98ee\0\u9948"+
+    "\0\u410a\0\u0b40\0\u0b40\0\u4218\0\u99a2\0\u99fc\0\u0b40\0\u9a56"+
+    "\0\u0b40\0\u9ab0\0\u0b40\0\u9b0a\0\u9b64\0\u9bbe\0\u9c18\0\u0f78"+
+    "\0\u9c72\0\u9ccc\0\u9d26\0\u9d80\0\u9dda\0\u9e34\0\u9e8e\0\u9ee8"+
+    "\0\u9f42\0\u9f9c\0\u9ff6\0\ua050\0\ua0aa\0\ua104\0\ua15e\0\ua1b8"+
+    "\0\ua212\0\ua26c\0\ua2c6\0\ua320\0\ua37a\0\ua3d4\0\ua42e\0\ua488"+
+    "\0\ua4e2\0\ua53c\0\ua596\0\ua5f0\0\ua64a\0\ua6a4\0\u4f74\0\ua6fe"+
+    "\0\ua758\0\ua7b2\0\ua80c\0\ua866\0\ua8c0\0\ua91a\0\ua974\0\ua9ce"+
+    "\0\uaa28\0\uaa82\0\uaadc\0\uab36\0\uab90\0\uabea\0\uac44\0\uac9e"+
+    "\0\uacf8\0\uad52\0\uadac\0\u140a\0\uae06\0\uae60\0\uaeba\0\uaf14"+
+    "\0\uaf6e\0\uafc8\0\ub022\0\ub07c\0\ub0d6\0\ub130\0\ub18a\0\ub1e4"+
+    "\0\u0b40\0\ub23e\0\ub298\0\ub2f2\0\ub34c\0\ub3a6\0\ub400\0\ub45a"+
+    "\0\u60ae\0\ub4b4\0\ub50e\0\ub568\0\ub5c2\0\ub61c\0\ub676\0\ub6d0"+
+    "\0\ub72a\0\ub784\0\ub7de\0\ub838\0\ub892\0\ub8ec\0\ub946\0\ub9a0"+
+    "\0\ub9fa\0\uba54\0\ubaae\0\ubb08\0\ubb62\0\ubbbc\0\ubc16\0\ubc70"+
+    "\0\ubcca\0\ubd24\0\u1bc6\0\ubd7e\0\ubdd8\0\ube32\0\ube8c\0\ubee6"+
+    "\0\ubf40\0\ubf9a\0\ubff4\0\uc04e\0\uc0a8\0\uc102\0\uc15c\0\uc1b6"+
+    "\0\uc210\0\uc26a\0\uc2c4\0\uc31e\0\uc378\0\uc3d2\0\uc42c\0\uc486"+
+    "\0\uc4e0\0\uc53a\0\uc594\0\uc5ee\0\uc648\0\uc6a2\0\uc6fc\0\uc756"+
+    "\0\uc7b0\0\uc80a\0\uc864\0\uc8be\0\uc918\0\uc972\0\uc9cc\0\uca26"+
+    "\0\uca80\0\ucada\0\ucb34\0\ucb8e\0\ucbe8\0\ucc42\0\ucc9c\0\uccf6"+
+    "\0\ucd50\0\ucdaa\0\uce04\0\uce5e\0\uceb8\0\ucf12\0\ucf6c\0\ucfc6"+
+    "\0\ud020\0\ud07a\0\ud0d4\0\ud12e\0\ud188\0\ud1e2\0\ud23c\0\ud296"+
+    "\0\u0b40\0\ud2f0\0\ud34a\0\ud3a4\0\ud3fe\0\ud458\0\ud4b2\0\ud50c"+
+    "\0\ud566\0\ud5c0\0\ud61a\0\ub2f2\0\ud674\0\ud6ce\0\ud728\0\ud782"+
+    "\0\ud7dc\0\ud836\0\ud890\0\ud8ea\0\ud944\0\ud99e\0\ud9f8\0\uda52"+
+    "\0\udaac\0\udb06\0\udb60\0\udbba\0\udc14\0\udc6e\0\udcc8\0\udd22"+
+    "\0\udd7c\0\uddd6\0\ude30\0\ude8a\0\udee4\0\udf3e\0\udf98\0\udff2"+
+    "\0\ue04c\0\ue0a6\0\ue100\0\ue15a\0\ue1b4\0\ue20e\0\ue268\0\ue2c2"+
+    "\0\ue31c\0\ue376\0\ue3d0\0\ue42a\0\ue484\0\ue4de\0\ue538\0\ue592"+
+    "\0\ue5ec\0\ue646\0\ue6a0\0\ue6fa\0\ue754\0\ue7ae\0\ue808\0\ue862"+
+    "\0\ue8bc\0\ue916\0\ue970\0\ue9ca\0\uea24\0\uea7e\0\uead8\0\ueb32"+
+    "\0\ueb8c\0\uebe6\0\uec40\0\uec9a\0\uecf4\0\ued4e\0\ueda8\0\uee02"+
+    "\0\uee5c\0\ueeb6\0\uef10\0\uef6a\0\uefc4\0\uf01e\0\uf078\0\uf0d2"+
+    "\0\uf12c\0\uf186\0\uf1e0\0\uf23a\0\uf294\0\uf2ee\0\uf348\0\u0b40"+
+    "\0\u0b40\0\uf3a2\0\uf3fc\0\uf456\0\uf4b0\0\uf50a\0\uf564\0\uf5be"+
+    "\0\uf618\0\uf672\0\uf6cc\0\uf726\0\uf780\0\uf7da\0\uf834\0\uf88e"+
+    "\0\uf8e8\0\uf942\0\uf99c\0\uf9f6\0\ufa50\0\ufaaa\0\ufb04\0\u5082"+
+    "\0\ufb5e\0\ufbb8\0\ufc12\0\ufc6c\0\ufcc6\0\ufd20\0\ufd7a\0\ufdd4"+
+    "\0\ua596\0\ufe2e\0\ufe88\0\ufee2\0\uff3c\0\uff96\0\ufff0\1\112"+
+    "\0\u0b40\1\244\1\376\1\u0158\0\u1bc6\1\u01b2\1\u020c\1\u0266"+
+    "\1\u02c0\1\u031a\1\u0374\0\u1bc6\1\u03ce\1\u0428\1\u0482\0\u1bc6"+
+    "\1\u04dc\1\u0536\1\u0590\0\u1bc6\1\u05ea\1\u0644\1\u069e\1\u06f8"+
+    "\1\u0752\1\u07ac\1\u0806\1\u0860\1\u08ba\1\u0914\1\u096e\1\u09c8"+
+    "\1\u0a22\1\u0a7c\1\u0ad6\1\u0b30\1\u0b8a\1\u0be4\1\u0c3e\0\u73aa"+
+    "\0\u0b40\1\u0c98\1\u0cf2\1\u0d4c\1\u0da6\1\u0e00\0\u0b40\1\u0e5a"+
+    "\1\u0eb4\1\u0f0e\1\u0f68\1\u0fc2\1\u101c\1\u1076\1\u10d0\1\u112a"+
+    "\1\u1184\1\u11de\0\u0b40\1\u1238\1\u1292\1\u12ec\1\u1346\1\u13a0"+
+    "\1\u13fa\1\u1454\1\u14ae\1\u1508\1\u1562\1\u15bc\1\u1616\1\u1670"+
+    "\1\u16ca\1\u1724\1\u177e\1\u17d8\1\u1832\1\u188c\1\u18e6\1\u1940"+
+    "\1\u199a\1\u19f4\1\u1a4e\1\u1aa8\1\u1b02\1\u1b5c\1\u1bb6\1\u1c10"+
+    "\1\u1c6a\1\u1cc4\1\u1d1e\1\u1d78\1\u1dd2\1\u1e2c\1\u1e86\1\u1ee0"+
+    "\1\u1f3a\1\u1f94\1\u1fee\1\u2048\1\u20a2\1\u20fc\1\u2156\1\u21b0"+
+    "\1\u220a\1\u2264\1\u22be\1\u2318\1\u2372\1\u23cc\1\u2426\1\u2480"+
+    "\1\u24da\1\u2534\1\u258e\1\u25e8\1\u2642\1\u269c\1\u26f6\1\u2750"+
+    "\1\u27aa\1\u2804\1\u285e\1\u28b8\1\u2912\1\u296c\1\u29c6\1\u2a20"+
+    "\0\u39a8\1\u2a7a\1\u2ad4\1\u2b2e\1\u2b88\1\u2be2\1\u2c3c\1\u2c96"+
+    "\1\u2cf0\1\u2d4a\1\u2da4\1\u2dfe\1\u2e58\1\u2eb2\1\u2f0c\1\u2f66"+
+    "\1\u2fc0\1\u301a\1\u3074\1\u30ce\1\u3128\1\u3182\1\u31dc\1\u3236"+
+    "\0\uf456\1\u3290\1\u32ea\1\u3344\1\u339e\1\u33f8\1\u3452\1\u34ac"+
+    "\1\u3506\1\u3560\1\u35ba\1\u3614\1\u3614\1\u366e\1\u36c8\1\u3722"+
+    "\1\u377c\1\u37d6\1\u3830\1\u388a\1\u38e4\1\u393e\1\u3998\1\u39f2"+
+    "\1\u3a4c\1\u3aa6\0\ub6d0\1\u3b00\1\u3b5a\1\u3bb4\1\u3c0e\1\u3c68"+
+    "\1\u3cc2\1\u3d1c\1\u3d76\1\u3dd0\1\u3e2a\1\u3e84\1\u3ede\1\u3f38"+
+    "\1\u3f92\1\u3fec\1\u4046\1\u40a0\1\u40fa\1\u4154\1\u41ae\1\u0da6"+
+    "\1\u4208\1\u4262\1\u0f0e\1\u42bc\1\u4316\1\u4370\1\u43ca\1\u4424"+
+    "\1\u447e\1\u44d8\1\u4532\1\u458c\1\u45e6\1\u4640\1\u469a\1\u46f4"+
+    "\1\u474e\1\u47a8\1\u4802\1\u485c\1\u48b6\1\u4910\1\u496a\1\u49c4"+
+    "\1\u4a1e\1\u4a78\1\u4ad2\1\u4b2c\1\u4b86\1\u4be0\1\u4c3a\1\u4c94"+
+    "\1\u4cee\1\u4d48\1\u4da2\1\u4dfc\1\u4e56\1\u4eb0\1\u4f0a\1\u4f64"+
+    "\1\u4fbe\1\u5018\1\u5072\1\u50cc\1\u5126\1\u5180\1\u51da\1\u5234"+
+    "\1\u528e\1\u52e8\1\u5342\1\u539c\1\u53f6\1\u5450\1\u54aa\1\u5504"+
+    "\1\u555e\1\u55b8\1\u5612\1\u566c\1\u56c6\1\u5720\1\u577a\1\u57d4"+
+    "\1\u582e\1\u5888\1\u58e2\1\u593c\1\u5996\1\u59f0\1\u5a4a\1\u5aa4"+
+    "\1\u5afe\1\u5b58\1\u5bb2\1\u29c6\1\u5c0c\1\u5c66\1\u5cc0\1\u5d1a"+
+    "\1\u5d74\1\u5dce\1\u5e28\1\u5e82\1\u5edc\1\u5f36\1\u5f90\1\u5fea"+
+    "\1\u6044\1\u609e\1\u60f8\1\u6152\1\u61ac\0\u42cc\1\u6206\1\u6260"+
+    "\1\u62ba\1\u6314\1\u636e\1\u63c8\1\u6422\1\u647c\1\u64d6\1\u6530"+
+    "\1\u658a\1\u65e4\1\u663e\0\u1bc6\1\u6698\1\u66f2\1\u674c\1\u67a6"+
+    "\1\u6800\1\u685a\1\u68b4\1\u690e\1\u6968\1\u69c2\1\u6a1c\1\u6a76"+
+    "\1\u6ad0\1\u6b2a\1\u6b84\1\u6bde\1\u6c38\1\u6c92\1\u6cec\1\u6d46"+
+    "\1\u6da0\1\u6dfa\1\u6e54\1\u6eae\1\u6f08\1\u6f62\1\u6fbc\1\u7016"+
+    "\1\u7070\1\u70ca\1\u7124\1\u717e\1\u71d8\1\u7232\1\u728c\1\u72e6"+
+    "\1\u7340\1\u739a\1\u73f4\1\u744e\1\u74a8\1\u7502\1\u755c\1\u75b6"+
+    "\1\u7610\1\u766a\1\u76c4\1\u771e\1\u7778\1\u77d2\1\u782c\1\u7886"+
+    "\1\u78e0\1\u793a\1\u7994\1\u79ee\1\u7a48\1\u7aa2\1\u7afc\1\u7b56"+
+    "\1\u7bb0\1\u7c0a\1\u7c64\1\u7cbe\1\u7d18\1\u7d72\1\u7dcc\1\u7e26"+
+    "\1\u7e80\1\u7eda\1\u7f34\1\u7f8e\1\u7fe8\1\u8042\1\u809c\1\u80f6"+
+    "\1\u8150\1\u81aa\1\u8204\1\u825e\1\u82b8\1\u8312\1\u836c\1\u83c6"+
+    "\1\u8420\1\u847a\1\u84d4\1\u852e\1\u8588\1\u85e2\1\u863c\0\u42cc"+
+    "\1\u8696\1\u86f0\1\u874a\1\u87a4\1\u87fe\1\u8858\1\u88b2\1\u890c"+
+    "\1\u8966\1\u89c0\1\u8a1a\1\u8a74\1\u8ace\1\u8b28\1\u8b82\1\u8bdc"+
+    "\1\u8c36\1\u8c90\1\u8cea\1\u8d44\1\u8d9e\1\u8df8\1\u8e52\1\u8eac"+
+    "\1\u8f06\1\u8f60\1\u8fba\1\u9014\1\u906e\1\u90c8\1\u9122\1\u917c"+
+    "\1\u91d6\1\u9230\1\u928a\1\u92e4\1\u933e\1\u9398\1\u93f2\1\u944c"+
+    "\1\u94a6\1\u9500\1\u955a\1\u95b4\1\u960e\1\u9668\1\u96c2\1\u971c"+
+    "\1\u9776\1\u97d0\1\u982a\1\u9884\1\u98de\1\u9938\1\u9992\1\u99ec"+
+    "\1\u9a46\1\u9aa0\1\u9afa\1\u9b54\1\u9bae\1\u9c08\1\u9c62\1\u9cbc"+
+    "\1\u9d16\1\u9d70\1\u9dca\1\u9e24\1\u9e7e\1\u9ed8\1\u9f32\1\u9f8c"+
+    "\1\u9fe6\1\ua040\1\ua09a\1\ua0f4\1\ua14e\1\ua1a8\1\ua202\1\ua25c"+
+    "\1\ua2b6\1\ua310\1\ua36a\1\ua3c4\1\ua41e\1\ua478\1\ua4d2\1\ua52c"+
+    "\1\ua586\1\ua5e0\1\ua63a\1\ua694\1\ua6ee\1\ua748\1\ua7a2\1\ua7fc"+
+    "\1\ua856\1\ua8b0\1\ua90a\1\ua964\1\ua9be\1\uaa18\1\uaa72\1\uaacc"+
+    "\1\uab26\1\uab80\1\uabda\1\uac34\1\uac8e\1\uace8\1\uad42\1\uad9c"+
+    "\1\uadf6\1\uae50\1\uaeaa\1\uaf04\1\uaf5e\1\uafb8\1\ub012\1\ub06c"+
+    "\1\ub0c6\1\ub120\1\ub17a\1\ub1d4\1\ub22e\1\ub288\1\ub2e2\1\ub33c"+
+    "\1\ub396\1\ub3f0\1\ub44a\1\ub4a4\1\ub4fe\1\ub558\1\ub5b2\1\ub60c"+
+    "\0\u0b40\1\ub666\1\ub6c0\1\ub71a\1\ub774\1\ub7ce\0\u0b40\1\ub828"+
+    "\0\u0b40\0\u0b40\1\ub882\1\ub8dc\1\ub936\1\ub990\1\ub9ea\1\uba44"+
+    "\1\uba9e\1\ubaf8\1\ubb52\1\ubbac\1\ubc06\1\ubc60\1\ubcba\1\ubd14"+
+    "\1\ubd6e\1\ubdc8\1\ube22\1\ube7c\1\ubed6\1\ubf30\1\ubf8a\1\ubfe4"+
+    "\1\uc03e\1\uc098\1\uc0f2\1\uc14c\1\uc1a6\1\uc200\1\uc25a\1\uc2b4"+
+    "\1\uc30e\1\uc368\1\uc3c2\1\uc41c\1\uc476\1\uc4d0\1\uc52a\1\uc584"+
+    "\1\uc5de\1\uc638\1\uc692\1\uc6ec\1\uc746\1\uc7a0\1\uc7fa\1\uc854"+
+    "\1\uc8ae\1\uc908\1\uc962\1\uc9bc\1\uca16\1\uca70\1\ucaca\1\ucb24"+
+    "\1\ucb7e\1\ucbd8\1\ucc32\1\ucc8c\1\ucce6\1\ucd40\1\ucd9a\1\ucdf4"+
+    "\1\uce4e\1\ucea8\1\ucf02\1\ucf5c\1\ucfb6\1\ud010\1\ud06a\1\ud0c4"+
+    "\1\ud11e\1\ud178\1\ud1d2\1\ud22c\1\ud286\1\ud2e0\1\ud33a\1\ud394"+
+    "\1\ud3ee\1\ud448\1\ud4a2\1\ud4fc\1\ud556\1\ud5b0\1\ud60a\1\ud664"+
+    "\1\ud6be\1\ud718\1\ud772\1\ud7cc\1\ud826\1\ud880\1\ud8da\1\ud934"+
+    "\1\ud98e\1\ud9e8\1\uda42\1\uda9c\0\u0b40\1\udaf6\1\udb50\1\udbaa"+
+    "\1\udc04\1\udc5e\1\udcb8\1\udd12\1\udd6c\1\uddc6\1\ude20\1\ude7a"+
+    "\1\uded4\1\udf2e\1\udf88\1\udfe2\1\ue03c\1\ue096\1\ue0f0\1\ue14a"+
+    "\1\ue1a4\1\ue1fe\1\ue258\1\ue2b2\1\ue30c\1\ue366\1\ue3c0\1\ue41a"+
+    "\1\ue474\1\ue4ce\1\ue528\1\ue582\1\ue5dc\1\ue636\1\ue690\1\ue6ea"+
+    "\1\ue744\1\ue79e\1\ue7f8\1\ue852\1\ue8ac\1\ue906\1\ue960\1\ue9ba"+
+    "\1\uea14\1\uea6e\1\ueac8\1\ueb22\1\ueb7c\1\uebd6\1\uec30\0\u0b40"+
+    "\1\uec8a\1\uece4\1\ued3e\1\ued98\1\uedf2\1\uee4c\1\ueea6\1\uef00"+
+    "\1\uef5a\1\uefb4\1\uf00e\1\uf068\1\uf0c2\1\uf11c\1\uf176\1\uf1d0"+
+    "\1\uf22a\1\uf284\1\uf2de\1\uf338\1\uf392\1\uf3ec\1\uf446\1\uf4a0"+
+    "\1\uf4fa\1\uf554\1\uf5ae\1\uf608\1\uf662\1\uf6bc\1\uf716\1\uf770"+
+    "\1\uf7ca\1\uf824\1\uf87e\1\uf8d8\1\uf932\1\uf98c\1\uf9e6\1\ufa40"+
+    "\1\ufa9a\1\ufaf4\1\ufb4e\1\ufba8\1\ufc02\1\ufc5c\1\ufcb6\1\ufd10"+
+    "\1\ufd6a\1\ufdc4\1\ufe1e\1\ufe78\1\ufed2\1\uff2c\1\uff86\1\uffe0"+
+    "\2\72\2\224\2\356\2\u0148\2\u01a2\2\u01fc\2\u0256\2\u02b0"+
+    "\2\u030a\2\u0364\2\u03be\2\u0418\2\u0472\2\u04cc\2\u0526\2\u0580"+
+    "\2\u05da\2\u0634\2\u068e\2\u06e8\2\u0742\2\u079c\2\u07f6\2\u0850"+
+    "\2\u08aa\2\u0904\2\u095e\2\u09b8\2\u0a12\2\u0a6c\2\u0ac6\2\u0b20"+
+    "\2\u0b7a\2\u0bd4\2\u0c2e\2\u0c88\2\u0ce2\2\u0d3c\2\u0d96\2\u0df0"+
+    "\2\u0e4a\2\u0ea4\2\u0efe\2\u0f58\2\u0fb2\2\u100c\2\u1066\2\u10c0"+
+    "\2\u111a\2\u1174\2\u11ce\2\u1228\2\u1282\2\u12dc\2\u1336\2\u1390"+
+    "\2\u13ea\2\u1444\2\u149e";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[1643];
+    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\37\1\40\1\41\1\42\1\43\1\44\124\37\2\45"+
+    "\1\46\32\45\1\47\15\45\1\50\14\45\1\51\11\45"+
+    "\1\52\27\45\2\53\1\54\62\53\1\55\44\53\2\56"+
+    "\1\57\16\56\1\60\110\56\2\61\1\0\1\62\1\63"+
+    "\2\61\1\64\1\65\1\66\1\67\6\61\1\70\110\61"+
+    "\2\71\1\0\1\71\1\72\2\71\4\72\1\73\1\74"+
+    "\1\75\1\76\1\77\1\100\1\72\1\71\1\101\1\102"+
+    "\5\71\1\103\4\71\1\104\1\75\1\100\1\105\1\103"+
+    "\6\71\2\106\2\71\1\102\1\107\1\101\1\73\6\71"+
+    "\1\110\1\111\1\112\1\77\1\74\1\71\1\76\1\113"+
+    "\1\114\1\112\1\71\1\115\6\71\1\107\1\111\1\105"+
+    "\1\114\1\104\1\71\1\113\1\116\1\115\1\110\4\71"+
+    "\1\116\1\71\3\117\1\120\4\117\1\121\121\117\3\122"+
+    "\1\120\5\122\1\121\120\122\1\61\1\123\1\0\1\62"+
+    "\1\43\2\61\1\64\1\124\1\125\1\126\6\61\1\127"+
+    "\110\61\3\117\1\120\4\117\1\130\121\117\3\122\1\120"+
+    "\5\122\1\130\120\122\2\61\1\0\1\61\1\63\2\61"+
+    "\1\64\1\131\1\132\1\126\6\61\1\133\110\61\10\134"+
+    "\1\135\121\134\11\136\1\135\120\136\1\137\1\43\1\140"+
+    "\1\141\1\43\1\142\1\143\1\144\1\145\1\146\1\147"+
+    "\3\150\1\151\2\150\1\152\3\150\2\144\1\150\1\153"+
+    "\1\154\1\150\1\153\1\150\1\155\1\137\1\156\1\157"+
+    "\1\160\1\161\1\162\1\153\1\163\1\137\1\150\1\144"+
+    "\2\150\1\164\1\165\1\166\1\167\1\170\1\171\1\172"+
+    "\1\173\1\143\1\144\3\64\2\150\1\174\1\175\1\176"+
+    "\1\150\1\177\3\150\1\200\1\201\1\137\1\150\1\202"+
+    "\3\173\2\150\1\203\7\150\1\153\2\150\1\173\2\150"+
+    "\2\204\1\205\5\204\1\206\25\204\1\207\73\204\2\210"+
+    "\1\211\6\210\1\212\24\210\1\213\73\210\2\214\1\215"+
+    "\1\216\44\214\1\217\2\214\1\220\14\214\1\221\11\214"+
+    "\1\222\27\214\2\223\1\224\1\225\47\223\1\220\14\223"+
+    "\1\221\11\223\1\222\27\223\2\45\1\226\32\45\1\227"+
+    "\15\45\1\50\14\45\1\51\11\45\1\52\27\45\2\230"+
+    "\1\231\1\232\44\230\1\233\2\230\1\234\14\230\1\235"+
+    "\11\230\1\236\1\230\1\237\22\230\1\240\2\230\1\137"+
+    "\1\43\1\241\1\242\1\43\1\142\1\143\1\144\1\243"+
+    "\1\244\1\245\1\246\1\247\1\250\1\251\1\252\1\253"+
+    "\1\152\1\150\1\254\1\255\1\256\1\144\1\150\1\153"+
+    "\1\154\1\257\1\153\1\150\1\155\1\137\1\150\1\157"+
+    "\1\260\1\161\1\162\1\153\1\163\1\137\1\150\1\144"+
+    "\1\150\1\261\1\262\1\165\1\166\1\263\1\264\1\265"+
+    "\1\266\1\173\1\143\1\144\3\64\2\150\1\267\1\270"+
+    "\1\176\1\150\1\271\2\150\1\272\1\273\1\274\1\275"+
+    "\1\150\1\202\3\173\1\276\1\277\1\300\1\301\1\302"+
+    "\3\150\1\303\1\150\1\153\2\150\1\173\2\150\2\304"+
+    "\1\305\45\304\1\306\2\304\1\307\14\304\1\310\11\304"+
+    "\1\311\27\304\1\312\1\313\1\0\1\312\1\43\2\312"+
+    "\1\64\1\314\1\315\1\316\6\312\1\317\3\312\1\320"+
+    "\13\312\1\321\31\312\1\322\2\312\1\323\33\312\1\324"+
+    "\1\63\1\325\1\326\1\63\1\324\1\173\1\64\1\327"+
+    "\1\330\1\331\6\332\1\64\3\332\2\324\1\332\2\324"+
+    "\1\332\1\324\2\332\1\324\5\332\2\324\1\333\1\64"+
+    "\4\332\1\64\5\332\1\324\1\143\1\64\1\324\1\334"+
+    "\1\64\14\332\1\335\2\332\3\173\12\332\1\324\2\332"+
+    "\1\336\2\332\1\337\1\63\1\340\1\341\1\63\5\337"+
+    "\1\342\6\343\1\337\3\343\2\337\1\343\2\337\1\343"+
+    "\1\337\2\343\1\337\5\343\4\337\1\344\3\343\2\337"+
+    "\4\343\1\345\3\337\1\346\1\337\14\343\1\337\2\343"+
+    "\3\337\12\343\1\337\2\343\1\337\2\343\1\347\1\63"+
+    "\1\350\1\351\1\63\1\347\1\352\1\347\1\327\1\330"+
+    "\1\353\6\354\1\347\3\354\1\347\1\355\1\354\2\356"+
+    "\1\354\1\356\1\354\1\357\6\354\1\356\1\347\1\360"+
+    "\2\347\3\354\1\347\1\143\4\354\1\345\1\143\4\347"+
+    "\14\354\1\347\2\354\1\347\1\361\1\362\12\354\1\356"+
+    "\2\354\1\347\2\354\2\204\1\363\5\204\1\364\25\204"+
+    "\1\365\73\204\2\210\1\366\6\210\1\367\24\210\1\365"+
+    "\73\210\2\304\1\370\45\304\1\371\2\304\1\307\14\304"+
+    "\1\310\11\304\1\311\27\304\2\37\4\0\125\37\1\40"+
+    "\2\0\1\43\1\0\124\37\144\0\1\372\1\373\5\374"+
+    "\1\0\3\374\1\375\1\376\5\374\3\0\6\374\4\0"+
+    "\3\374\2\0\3\374\1\373\3\0\1\377\2\0\14\374"+
+    "\1\0\2\374\3\0\15\374\1\0\2\374\1\0\1\43"+
+    "\2\0\1\43\125\0\4\44\1\0\1\44\1\u0100\123\44"+
+    "\2\45\1\0\32\45\1\0\15\45\1\0\14\45\1\0"+
+    "\11\45\1\0\27\45\35\0\1\u0101\135\0\1\u0102\34\0"+
+    "\1\u0103\74\0\1\u0104\172\0\1\u0105\27\0\2\53\1\0"+
+    "\62\53\1\0\44\53\21\0\1\u0106\110\0\2\56\1\0"+
+    "\16\56\1\0\110\56\2\61\1\0\1\61\1\0\2\61"+
+    "\4\0\6\61\1\0\112\61\1\0\1\61\1\0\2\61"+
+    "\4\0\6\61\1\0\3\61\1\u0107\104\61\21\0\1\70"+
+    "\110\0\2\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+    "\1\0\112\71\1\0\1\71\1\0\2\71\4\0\1\71"+
+    "\1\u0108\2\71\1\u0109\1\u010a\1\0\2\71\1\u010b\12\71"+
+    "\1\u010c\1\71\1\u010a\14\71\1\u010b\1\u010d\11\71\1\u010e"+
+    "\1\71\1\u0109\1\u0108\3\71\1\u010f\11\71\1\u010d\1\u010e"+
+    "\1\71\1\u010f\1\u010c\15\71\1\0\1\71\1\0\2\71"+
+    "\4\0\3\71\1\u0110\2\71\1\0\2\71\1\u0111\31\71"+
+    "\1\u0111\1\u0112\11\71\1\u0113\4\71\1\u0110\13\71\1\u0112"+
+    "\1\u0113\20\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+    "\1\0\15\71\1\u0114\56\71\1\u0114\15\71\1\0\1\71"+
+    "\1\0\2\71\4\0\1\u0115\5\71\1\0\1\71\1\u0116"+
+    "\16\71\1\u0117\7\71\2\u0118\4\71\1\u0116\1\u0115\16\71"+
+    "\1\u0119\13\71\1\u0117\1\u0119\16\71\1\0\1\71\1\0"+
+    "\2\71\4\0\2\71\1\u011a\3\71\1\0\1\71\1\u011b"+
+    "\14\71\1\u011a\16\71\1\u011c\1\u011b\31\71\1\u011c\21\71"+
+    "\1\0\1\71\1\0\2\71\4\0\2\71\1\116\1\u011d"+
+    "\1\71\1\116\1\0\2\71\1\u011e\5\71\1\u011f\5\71"+
+    "\2\116\1\71\1\u011f\6\71\2\u0120\2\71\1\u011e\1\u0121"+
+    "\10\71\1\u0122\1\71\1\116\3\71\1\u011d\2\71\1\116"+
+    "\10\71\1\u0121\10\71\1\u0122\10\71\1\0\1\71\1\0"+
+    "\2\71\4\0\3\71\1\u0123\2\71\1\0\2\71\1\u0124"+
+    "\31\71\1\u0124\1\u0125\16\71\1\u0123\13\71\1\u0125\21\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\56\71"+
+    "\1\u0126\2\71\1\u0127\11\71\1\u0126\4\71\1\u0127\11\71"+
+    "\1\0\1\71\1\0\2\71\4\0\2\71\1\116\1\u0119"+
+    "\2\71\1\0\1\71\1\u0128\13\71\1\u0129\1\116\16\71"+
+    "\1\u012a\1\u0128\10\71\1\u012b\1\u012c\3\71\1\u0119\2\71"+
+    "\1\u012c\4\71\1\u012d\3\71\1\u012a\1\u012b\2\71\1\u0129"+
+    "\1\u012d\14\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+    "\1\0\1\71\1\116\34\71\1\116\53\71\1\0\1\71"+
+    "\1\0\2\71\4\0\6\71\1\0\2\71\1\u012e\31\71"+
+    "\1\u012e\1\u012f\11\71\1\u0130\20\71\1\u012f\1\u0130\20\71"+
+    "\1\0\1\71\1\0\2\71\4\0\2\71\1\u0131\1\u0132"+
+    "\2\71\1\0\16\71\1\u0131\30\71\1\u0133\4\71\1\u0132"+
+    "\14\71\1\u0133\20\71\1\0\1\71\1\0\2\71\4\0"+
+    "\1\u0134\1\u0135\1\u0136\1\71\1\u0137\1\71\1\0\10\71"+
+    "\1\u0138\4\71\1\u0139\1\u0136\2\71\1\u0138\15\71\1\u0134"+
+    "\10\71\1\u013a\1\u0137\1\u0135\4\71\1\u013a\14\71\1\u0139"+
+    "\15\71\1\0\1\71\1\0\2\71\4\0\2\71\1\116"+
+    "\2\71\1\u013b\1\0\2\71\1\u013c\13\71\1\116\1\u013b"+
+    "\2\71\1\116\11\71\1\u013c\45\71\1\116\7\71\1\0"+
+    "\1\71\1\0\2\71\4\0\4\71\1\u013d\1\71\1\0"+
+    "\1\71\1\116\6\71\1\u013e\4\71\1\u013f\3\71\1\u013e"+
+    "\14\71\1\116\12\71\1\u013d\22\71\1\u013f\15\71\1\0"+
+    "\1\71\1\0\2\71\4\0\3\71\1\u0140\1\71\1\116"+
+    "\1\0\1\71\1\116\1\u0141\14\71\1\116\10\71\2\u0142"+
+    "\2\71\1\u0141\1\u0143\1\116\11\71\1\116\3\71\1\u0140"+
+    "\2\71\1\116\10\71\1\u0143\21\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\2\71\1\u0144\5\71\1\u0145"+
+    "\10\71\1\u0145\12\71\1\u0144\55\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\2\71\1\u0146\12\71\1\u0147"+
+    "\16\71\1\u0146\1\u0148\32\71\1\u0148\3\71\1\u0147\15\71"+
+    "\1\0\1\71\1\0\2\71\4\0\3\71\1\u0149\2\71"+
+    "\1\0\35\71\1\u014a\16\71\1\u0149\13\71\1\u014a\17\71"+
+    "\3\117\1\0\4\117\1\0\121\117\25\0\1\u014b\104\0"+
+    "\3\122\1\0\5\122\1\0\120\122\1\61\1\123\1\0"+
+    "\1\61\1\43\2\61\4\0\6\61\1\0\110\61\21\0"+
+    "\1\u014c\110\0\10\134\1\0\121\134\11\136\1\0\120\136"+
+    "\1\137\12\0\6\137\1\0\3\137\2\0\6\137\1\0"+
+    "\7\137\1\0\2\137\1\0\3\137\2\0\4\137\6\0"+
+    "\17\137\3\0\15\137\1\0\2\137\3\0\1\u014d\3\0"+
+    "\1\64\2\0\1\u014e\12\0\1\u014f\111\0\1\64\1\0"+
+    "\1\64\131\0\1\64\122\0\7\u0150\1\u0151\2\u0150\1\u0152"+
+    "\23\u0150\1\u0153\11\u0150\1\u0154\61\u0150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150"+
+    "\1\u0156\2\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\7\0\1\64\11\0\1\u0157\110\0\1\u0158\12\0"+
+    "\6\u0158\1\0\1\u0158\1\u0159\1\u015a\2\0\1\u0158\2\153"+
+    "\1\u0158\1\153\1\u0158\1\0\6\u0158\1\153\1\0\2\u0158"+
+    "\1\0\1\u0158\2\u015b\1\0\1\u015c\1\u015a\1\u0158\1\u0159"+
+    "\1\u0158\6\0\2\u0158\1\u015b\6\u0158\1\u015b\5\u0158\3\0"+
+    "\12\u0158\1\153\2\u0158\1\0\3\u0158\12\0\6\u0158\1\0"+
+    "\1\u0158\1\u0159\1\u015a\2\0\1\u0158\1\u015d\1\u015e\1\u0158"+
+    "\1\u015e\1\u0158\1\0\6\u0158\1\u015e\1\0\2\u0158\1\0"+
+    "\1\u015f\2\u015b\1\0\1\u015c\1\u015a\1\u0158\1\u0159\1\u0158"+
+    "\6\0\2\u0158\1\u015b\2\u0158\1\u015f\3\u0158\1\u015b\5\u0158"+
+    "\3\0\12\u0158\1\u015e\2\u0158\1\0\2\u0158\7\0\1\64"+
+    "\25\0\1\64\74\0\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\3\150\1\u0160\2\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\u0161\3\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\1\150\1\u0162\4\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\1\u0163\13\150\1\137\1\u0164"+
+    "\1\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u0165\5\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\u0166\1\u0167"+
+    "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u0168\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\1\150\1\u0169\12\150"+
+    "\1\137\1\u016a\1\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\1\u016b\5\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\150\1\u016c\1\u016d\1\150\6\0\1\150\1\u016e\4\150"+
+    "\1\u016f\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\7\0\1\64\44\0\1\64\105\0\2\u015c\1\0\1\u015c"+
+    "\10\0\1\u015c\57\0\1\u015c\5\0\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0170"+
+    "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+    "\1\u0171\1\u0172\1\u0173\6\0\5\150\1\u0174\5\150\1\u0175"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\4\150"+
+    "\1\u0176\1\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\u0177\3\150\6\0\1\150\1\u0178\12\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u0179\1\150"+
+    "\1\u017a\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\1\u017b\11\150\1\u017c\1\150\1\137\1\u017d"+
+    "\1\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\u017e\3\150\6\0"+
+    "\1\150\1\u017f\12\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\u0180\1\u0181\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\150\1\u0182\2\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u0183"+
+    "\1\u0184\1\150\6\0\1\u0185\1\u0186\12\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0187\2\150"+
+    "\1\0\1\137\1\150\1\0\2\150\1\u0188\2\0\3\150"+
+    "\1\u0189\6\0\10\150\1\u018a\3\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\1\u018b\5\150\1\u018c"+
+    "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+    "\1\u016e\2\150\6\0\1\150\1\u018d\12\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\1\150\1\u018e"+
+    "\12\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+    "\1\u018f\2\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\2\204\1\0\5\204\1\0\25\204\1\0"+
+    "\73\204\2\u0190\1\0\34\u0190\1\u0191\35\u0190\1\u0192\34\u0190"+
+    "\2\210\1\0\6\210\1\0\24\210\1\0\73\210\2\214"+
+    "\2\0\44\214\1\0\2\214\1\0\14\214\1\0\11\214"+
+    "\1\0\27\214\12\0\1\u0193\131\0\1\u0194\160\0\1\u0195"+
+    "\34\0\1\u0196\74\0\1\u0197\172\0\1\u0198\27\0\2\223"+
+    "\2\0\47\223\1\0\14\223\1\0\11\223\1\0\27\223"+
+    "\12\0\1\u0199\154\0\1\u019a\74\0\2\230\2\0\44\230"+
+    "\1\0\2\230\1\0\14\230\1\0\11\230\1\0\1\230"+
+    "\1\0\22\230\1\0\2\230\12\0\1\u019b\6\u019c\1\u019d"+
+    "\3\u019c\2\0\1\u019c\2\0\1\u019c\4\0\5\u019c\5\0"+
+    "\3\u019c\2\0\4\u019c\6\0\14\u019c\1\0\2\u019c\3\0"+
+    "\12\u019c\1\0\2\u019c\1\0\2\u019c\12\0\1\u019e\160\0"+
+    "\1\u019f\34\0\1\u01a0\74\0\1\u01a1\172\0\1\u01a2\67\0"+
+    "\1\u01a3\1\u01a4\14\0\1\u01a5\1\u01a6\1\0\1\u01a7\7\0"+
+    "\1\u01a8\1\u01a9\1\u01aa\1\u01ab\1\0\1\u01ac\4\0\1\u01ad"+
+    "\132\0\1\u01ae\30\0\1\u014d\3\0\1\64\122\0\2\243"+
+    "\1\u01af\5\243\1\u01b0\25\243\1\u01b1\73\243\2\u01b2\1\u01b3"+
+    "\6\u01b2\1\u01b4\24\u01b2\1\u01b5\73\u01b2\7\0\1\64\2\0"+
+    "\1\u01b6\35\0\1\u01b7\61\0\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u01b8\3\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\u01b9\3\150"+
+    "\6\0\1\u01ba\13\150\1\137\1\u01bb\1\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\2\150\1\u01bc\1\150\6\0\1\u01bd\1\u01be"+
+    "\12\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\1\u01bf\5\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\u01c0\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\2\150\1\u01c1\1\u01c2\2\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\2\150\1\u01c3\1\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\1\150\1\u01c4\4\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\150\1\u01c5\2\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\u01c6"+
+    "\13\150\1\137\1\u01c7\1\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\1\150\1\u01c8\4\150\1\u01c9\5\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u01ca"+
+    "\1\150\1\u01cb\2\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\5\150\1\u01cc\6\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\7\0\1\64\11\0\1\u01cd"+
+    "\110\0\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\1\150\1\u01ce\12\150\1\137\1\u01cf"+
+    "\1\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0162"+
+    "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\1\u0163\13\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\2\150\1\u01d0\1\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\150\1\u016c\1\u016d\1\150"+
+    "\6\0\1\150\1\u016e\4\150\1\u016f\5\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0170\2\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\2\150\1\u0172"+
+    "\1\150\6\0\5\150\1\u01d1\6\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\4\150\1\u0176\1\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\3\150\1\u01d2\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\1\150\1\u0178\12\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\1\u0179\1\150\1\u01d3\3\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\u017b"+
+    "\11\150\1\u017c\1\150\1\137\1\u017d\1\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\u01d4\3\150\6\0\1\150\1\u017f\12\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u0180"+
+    "\1\u0181\4\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\150\1\u01d5\2\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\3\150\1\u01d6\2\150\1\0"+
+    "\1\137\1\150\1\0\2\150\1\u0188\2\0\4\150\6\0"+
+    "\10\150\1\u018a\3\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\1\150\1\u01d7\12\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\1\u018b\13\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\1\150\1\u018d\12\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\u01d8\1\0\3\u01d8\2\0\1\u01d8"+
+    "\2\137\1\u01d8\1\137\1\u01d8\1\0\1\137\5\u01d8\1\137"+
+    "\1\0\1\137\1\u01d8\1\0\3\u01d8\2\0\4\u01d8\6\0"+
+    "\14\u01d8\1\137\2\u01d8\3\0\12\u01d8\1\137\2\u01d8\1\0"+
+    "\2\u01d8\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\u01d9\1\u01da\2\150\1\u01db\1\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\3\150\1\u01dc\6\0"+
+    "\3\150\1\u01dd\10\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\u01de\3\150\1\u01df\1\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u01e0\5\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\u01e1\3\150"+
+    "\6\0\1\150\1\u01e2\12\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\150\1\u01e3\2\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u01e4"+
+    "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\u01e5\3\150\6\0\1\150\1\u01e6\4\150\1\u01e7\5\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\2\304\1\0"+
+    "\45\304\1\0\2\304\1\0\14\304\1\0\11\304\1\0"+
+    "\27\304\12\0\1\u01e8\160\0\1\u01e9\34\0\1\u01ea\74\0"+
+    "\1\u01eb\172\0\1\u01ec\27\0\2\312\1\0\1\312\1\0"+
+    "\2\312\4\0\6\312\1\0\111\312\1\313\1\0\1\312"+
+    "\1\43\2\312\4\0\6\312\1\0\110\312\10\314\1\u01b0"+
+    "\121\314\11\315\1\u01ed\120\315\2\312\1\0\1\312\1\0"+
+    "\2\312\4\0\6\312\1\70\112\312\1\0\1\312\1\0"+
+    "\2\312\4\0\6\312\1\0\35\312\1\u01ee\54\312\1\0"+
+    "\1\312\1\0\2\312\4\0\6\312\1\0\35\312\1\u01ef"+
+    "\54\312\1\0\1\312\1\0\2\312\4\0\6\312\1\0"+
+    "\20\312\1\u01f0\67\312\12\0\1\u01f1\167\0\1\u01f2\74\0"+
+    "\6\332\1\0\3\332\2\0\7\332\1\0\6\332\4\0"+
+    "\3\332\1\0\5\332\6\0\14\332\1\0\2\332\3\0"+
+    "\15\332\1\0\2\332\13\0\6\u01f3\1\0\3\u01f3\2\0"+
+    "\1\u01f3\2\0\1\u01f3\1\0\2\u01f3\1\0\5\u01f3\4\0"+
+    "\4\u01f3\1\0\5\u01f3\6\0\14\u01f3\1\0\2\u01f3\3\0"+
+    "\12\u01f3\1\0\2\u01f3\1\0\2\u01f3\40\0\1\u01f4\1\u01f5"+
+    "\1\u01f6\10\0\1\u01f7\2\0\1\u01f8\1\u01f9\1\u01fa\5\0"+
+    "\1\u01fb\1\0\1\u01fc\1\u01fd\1\u01fe\1\0\1\u01ff\6\0"+
+    "\1\u0200\41\0\6\u0201\1\0\3\u0201\2\0\1\u0201\2\0"+
+    "\1\u0201\1\0\2\u0201\1\0\5\u0201\4\0\4\u0201\1\0"+
+    "\5\u0201\6\0\14\u0201\1\0\2\u0201\3\0\12\u0201\1\0"+
+    "\2\u0201\1\0\2\u0201\13\0\6\343\1\0\3\343\2\0"+
+    "\7\343\1\0\6\343\4\0\3\343\2\0\4\343\6\0"+
+    "\14\343\1\0\2\343\3\0\15\343\1\0\2\343\13\0"+
+    "\6\343\1\0\3\343\2\0\1\343\2\0\1\343\1\0"+
+    "\2\343\1\0\5\343\5\0\3\343\2\0\4\343\6\0"+
+    "\14\343\1\0\2\343\3\0\12\343\1\0\2\343\1\0"+
+    "\2\343\12\0\7\354\1\0\3\354\2\0\1\354\2\0"+
+    "\1\354\1\0\10\354\4\0\1\u01f2\3\354\2\0\4\354"+
+    "\6\0\14\354\1\0\2\354\2\0\1\362\12\354\1\0"+
+    "\2\354\1\0\2\354\12\0\7\354\1\0\3\354\2\0"+
+    "\1\354\2\0\1\354\1\0\10\354\5\0\3\354\2\0"+
+    "\4\354\6\0\14\354\1\0\2\354\2\0\1\362\12\354"+
+    "\1\0\2\354\1\0\2\354\76\0\1\u0202\60\0\1\u0203"+
+    "\2\0\2\356\1\0\1\356\10\0\1\356\10\0\1\356"+
+    "\1\u0204\2\0\1\u0203\11\0\1\u0205\1\u0206\1\0\1\u0207"+
+    "\1\0\1\u0208\23\0\1\356\17\0\7\354\1\0\3\354"+
+    "\2\0\1\354\2\356\1\354\1\356\10\354\1\356\4\0"+
+    "\3\354\2\0\4\354\6\0\14\354\1\0\2\354\2\0"+
+    "\1\362\12\354\1\356\2\354\1\0\2\354\14\0\1\u0209"+
+    "\7\0\1\u0209\3\0\4\u0209\7\0\2\u0209\5\0\2\u0209"+
+    "\2\0\2\u0209\12\0\1\u0209\1\0\1\u0209\4\0\1\u0209"+
+    "\10\0\1\u0209\11\0\1\u0209\5\0\2\u020a\1\0\127\u020a"+
+    "\12\0\1\u020b\132\0\6\u020c\1\0\3\u020c\2\0\5\u020c"+
+    "\3\0\6\u020c\4\0\3\u020c\2\0\4\u020c\6\0\14\u020c"+
+    "\1\0\2\u020c\3\0\15\u020c\1\0\2\u020c\13\0\1\374"+
+    "\1\u020d\3\374\1\u020e\1\0\3\374\2\0\5\374\3\0"+
+    "\2\374\1\u020e\3\374\4\0\3\374\2\0\4\374\6\0"+
+    "\4\374\1\u020d\7\374\1\0\2\374\3\0\15\374\1\0"+
+    "\2\374\13\0\6\374\1\0\3\374\2\0\5\374\3\0"+
+    "\6\374\4\0\3\374\2\0\4\374\6\0\14\374\1\0"+
+    "\2\374\3\0\15\374\1\0\2\374\7\0\1\u020f\16\0"+
+    "\1\u020f\6\0\1\u0210\46\0\1\u0211\62\0\1\u0212\115\0"+
+    "\1\u0213\203\0\1\u0214\116\0\1\u0215\112\0\1\u0216\172\0"+
+    "\1\u0217\27\0\2\61\1\0\1\61\1\0\2\61\1\u020f"+
+    "\3\0\6\61\1\0\4\61\1\u0218\103\61\2\71\1\0"+
+    "\1\71\1\0\2\71\4\0\2\71\1\u0219\3\71\1\0"+
+    "\16\71\1\u0219\73\71\1\0\1\71\1\0\2\71\4\0"+
+    "\6\71\1\0\35\71\1\u021a\32\71\1\u021a\21\71\1\0"+
+    "\1\71\1\0\2\71\4\0\2\71\1\u021b\3\71\1\0"+
+    "\1\u0114\15\71\1\u021b\44\71\1\u0114\26\71\1\0\1\71"+
+    "\1\0\2\71\4\0\1\71\1\u021c\1\u021d\3\71\1\0"+
+    "\1\71\1\u021e\14\71\1\u021d\17\71\1\u021e\13\71\1\u021c"+
+    "\37\71\1\0\1\71\1\0\2\71\4\0\4\71\1\116"+
+    "\1\71\1\0\10\71\1\116\10\71\1\116\27\71\1\116"+
+    "\40\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\56\71\1\u021f\14\71\1\u021f\16\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\15\71\1\u0220\56\71\1\u0220"+
+    "\15\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\35\71\1\u0221\32\71\1\u0221\21\71\1\0\1\71\1\0"+
+    "\2\71\4\0\5\71\1\u0222\1\0\17\71\1\u0222\72\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\20\71"+
+    "\1\u0223\51\71\1\u0223\17\71\1\0\1\71\1\0\2\71"+
+    "\4\0\4\71\1\u021c\1\71\1\0\20\71\1\u0224\30\71"+
+    "\1\u021c\20\71\1\u0224\17\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\1\71\1\u0225\34\71\1\u0225\11\71"+
+    "\1\u0222\5\71\1\u0226\1\u0222\13\71\1\u0226\16\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\1\71\1\u0222"+
+    "\34\71\1\u0222\53\71\1\0\1\71\1\0\2\71\4\0"+
+    "\3\71\1\u0227\2\71\1\0\54\71\1\u0227\35\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\35\71\1\u0228"+
+    "\32\71\1\u0228\21\71\1\0\1\71\1\0\2\71\4\0"+
+    "\1\116\3\71\1\u0229\1\71\1\0\37\71\1\116\11\71"+
+    "\1\u0229\40\71\1\0\1\71\1\0\2\71\4\0\2\71"+
+    "\1\u022a\3\71\1\0\16\71\1\u022a\73\71\1\0\1\71"+
+    "\1\0\2\71\4\0\6\71\1\0\64\71\1\116\10\71"+
+    "\1\116\14\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+    "\1\0\2\71\1\116\31\71\1\116\12\71\1\u022b\21\71"+
+    "\1\u022b\20\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+    "\1\0\35\71\1\u022c\32\71\1\u022c\21\71\1\0\1\71"+
+    "\1\0\2\71\4\0\2\71\1\u022d\3\71\1\0\16\71"+
+    "\1\u022d\73\71\1\0\1\71\1\0\2\71\4\0\5\71"+
+    "\1\u0114\1\0\17\71\1\u0114\36\71\1\u0222\14\71\1\u0222"+
+    "\16\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\27\71\1\u022e\23\71\1\u022e\36\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\47\71\1\u012b\21\71\1\u012b"+
+    "\20\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\47\71\1\u022f\21\71\1\u022f\20\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\10\71\1\u0114\10\71\1\u0114"+
+    "\70\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\2\71\1\u0230\31\71\1\u0230\55\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\20\71\1\u0231\51\71\1\u0231"+
+    "\17\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\64\71\1\u0232\10\71\1\u0232\14\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\1\u0233\7\71\1\u0234\10\71"+
+    "\1\u0234\41\71\1\u0233\26\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\10\71\1\u0235\10\71\1\u0235\70\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\2\71"+
+    "\1\u0236\31\71\1\u0236\55\71\1\0\1\71\1\0\2\71"+
+    "\4\0\3\71\1\u0237\2\71\1\0\47\71\1\u0238\4\71"+
+    "\1\u0237\14\71\1\u0238\20\71\1\0\1\71\1\0\2\71"+
+    "\4\0\5\71\1\u0239\1\0\17\71\1\u0239\72\71\1\0"+
+    "\1\71\1\0\2\71\4\0\1\u023a\5\71\1\0\37\71"+
+    "\1\u023a\52\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+    "\1\0\50\71\1\u023b\6\71\1\u023b\32\71\1\0\1\71"+
+    "\1\0\2\71\4\0\6\71\1\0\47\71\1\116\21\71"+
+    "\1\116\20\71\1\0\1\71\1\0\2\71\4\0\1\u023c"+
+    "\5\71\1\0\37\71\1\u023c\52\71\1\0\1\71\1\0"+
+    "\2\71\4\0\1\u023d\5\71\1\0\37\71\1\u023d\52\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\61\71"+
+    "\1\116\16\71\1\116\11\71\1\0\1\71\1\0\2\71"+
+    "\4\0\1\u023e\5\71\1\0\1\71\1\u0116\1\u023f\5\71"+
+    "\1\u014a\10\71\1\u014a\6\71\2\u0240\2\71\1\u023f\1\71"+
+    "\1\u0116\1\u023e\52\71\1\0\1\71\1\0\2\71\4\0"+
+    "\6\71\1\0\35\71\1\u0241\32\71\1\u0241\21\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\2\71\1\u0242"+
+    "\31\71\1\u0242\27\71\1\u0243\10\71\1\u0243\14\71\1\0"+
+    "\1\71\1\0\2\71\4\0\2\71\1\u0244\3\71\1\0"+
+    "\16\71\1\u0244\1\71\1\u023d\26\71\1\u0223\21\71\1\u0223"+
+    "\1\u023d\17\71\1\0\1\71\1\0\2\71\4\0\3\71"+
+    "\1\u0245\2\71\1\0\54\71\1\u0245\35\71\1\0\1\71"+
+    "\1\0\2\71\4\0\2\71\1\u0246\3\71\1\0\16\71"+
+    "\1\u0246\73\71\1\0\1\71\1\0\2\71\4\0\5\71"+
+    "\1\u0247\1\0\2\71\1\u0248\14\71\1\u0247\14\71\1\u0248"+
+    "\55\71\1\0\1\71\1\0\2\71\4\0\4\71\1\u0249"+
+    "\1\71\1\0\51\71\1\u0249\40\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\10\71\1\u014a\10\71\1\u014a"+
+    "\70\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\50\71\1\u024a\6\71\1\u024a\32\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\50\71\1\u024b\6\71\1\u024b"+
+    "\32\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\56\71\1\u024c\14\71\1\u024c\16\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\35\71\1\u024d\32\71\1\u024d"+
+    "\21\71\1\0\1\71\1\0\2\71\4\0\5\71\1\u024e"+
+    "\1\0\17\71\1\u024e\72\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\103\71\1\u021e\3\71\1\u021e\2\71"+
+    "\1\0\1\71\1\0\2\71\4\0\5\71\1\u024f\1\0"+
+    "\17\71\1\u024f\72\71\1\0\1\71\1\0\2\71\4\0"+
+    "\2\71\1\116\3\71\1\0\16\71\1\116\16\71\1\u0250"+
+    "\23\71\1\116\6\71\1\u0250\7\71\1\116\11\71\1\0"+
+    "\1\71\1\0\2\71\4\0\5\71\1\u0251\1\0\1\71"+
+    "\1\116\15\71\1\u0251\16\71\1\116\53\71\1\0\1\71"+
+    "\1\0\2\71\4\0\6\71\1\0\20\71\1\116\51\71"+
+    "\1\116\17\71\1\0\1\71\1\0\2\71\4\0\5\71"+
+    "\1\u0252\1\0\17\71\1\u0252\72\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\1\u0253\62\71\1\u0253\26\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\50\71"+
+    "\1\116\6\71\1\116\32\71\1\0\1\71\1\0\2\71"+
+    "\4\0\5\71\1\u0254\1\0\17\71\1\u0254\1\u0255\51\71"+
+    "\1\u0255\17\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+    "\1\0\1\71\1\u0256\34\71\1\u0256\53\71\1\0\1\71"+
+    "\1\0\2\71\4\0\2\71\1\u0257\1\71\1\116\1\71"+
+    "\1\0\16\71\1\u0257\32\71\1\116\40\71\1\0\1\71"+
+    "\1\0\2\71\4\0\6\71\1\0\50\71\1\u0258\6\71"+
+    "\1\u0258\32\71\1\0\1\71\1\0\2\71\4\0\2\71"+
+    "\1\116\3\71\1\0\16\71\1\116\71\71\7\0\1\u0259"+
+    "\16\0\1\u0259\116\0\1\u025a\45\0\1\u025a\57\0\1\u020f"+
+    "\16\0\1\u020f\103\0\12\u0150\1\u025b\23\u0150\1\u0153\75\u0150"+
+    "\1\0\127\u0150\50\0\1\u025c\61\0\1\137\12\0\6\137"+
+    "\1\0\3\137\2\0\6\137\1\0\1\137\1\u025d\5\137"+
+    "\1\0\2\137\1\0\3\137\2\0\4\137\6\0\17\137"+
+    "\3\0\15\137\1\0\3\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\2\150\1\u025e\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\7\0\1\64\11\0"+
+    "\1\144\110\0\1\u0158\12\0\6\u0158\1\0\3\u0158\2\0"+
+    "\6\u0158\1\0\7\u0158\1\0\2\u0158\1\0\3\u0158\2\0"+
+    "\4\u0158\6\0\17\u0158\3\0\15\u0158\1\0\3\u0158\12\0"+
+    "\6\u0158\1\0\3\u0158\2\0\1\u0158\2\u025f\1\u0158\1\u025f"+
+    "\1\u0158\1\u0260\6\u0158\1\u025f\1\0\2\u0158\1\0\3\u0158"+
+    "\1\u0260\1\0\4\u0158\6\0\17\u0158\3\0\12\u0158\1\u025f"+
+    "\2\u0158\1\0\3\u0158\12\0\6\u0158\1\0\2\u0158\1\u015a"+
+    "\2\0\1\u0158\2\u015c\1\u0158\1\u015c\1\u0158\1\0\6\u0158"+
+    "\1\u015c\1\0\2\u0158\1\0\1\u0158\2\u015b\2\0\1\u015a"+
+    "\3\u0158\6\0\2\u0158\1\u015b\6\u0158\1\u015b\5\u0158\3\0"+
+    "\12\u0158\1\u015c\2\u0158\1\0\3\u0158\12\0\6\u0158\1\0"+
+    "\2\u0158\1\u015a\2\0\1\u0158\2\u015d\1\u0158\1\u015d\1\u0158"+
+    "\1\0\6\u0158\1\u015d\1\0\2\u0158\1\0\1\u0158\2\u015b"+
+    "\1\0\1\u015c\1\u015a\3\u0158\6\0\2\u0158\1\u015b\6\u0158"+
+    "\1\u015b\5\u0158\3\0\12\u0158\1\u015d\2\u0158\1\0\3\u0158"+
+    "\12\0\6\u0158\1\0\1\u0158\1\u0261\1\u015a\2\0\1\u0158"+
+    "\1\u015d\1\u015e\1\u0158\1\u015e\1\u0158\1\0\6\u0158\1\u015e"+
+    "\1\0\2\u0158\1\0\1\u0158\2\u015b\1\0\1\u015c\1\u015a"+
+    "\1\u0158\1\u0261\1\u0158\6\0\2\u0158\1\u015b\6\u0158\1\u015b"+
+    "\5\u0158\3\0\12\u0158\1\u015e\2\u0158\1\0\3\u0158\12\0"+
+    "\1\u0158\1\u0262\4\u0158\1\0\2\u0158\1\u0262\2\0\1\u0158"+
+    "\4\u0262\1\u0158\1\0\5\u0158\2\u0262\1\0\2\u0158\1\0"+
+    "\1\u0158\2\u0262\2\0\2\u0262\2\u0158\6\0\2\u0158\1\u0262"+
+    "\1\u0158\1\u0262\4\u0158\1\u0262\5\u0158\3\0\1\u0262\11\u0158"+
+    "\1\u0262\2\u0158\1\0\2\u0158\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\u0263\3\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+    "\1\u0264\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\u0265\5\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\150\1\u0266\2\150\6\0\14\150\1\137"+
+    "\1\u0188\1\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150"+
+    "\1\u0267\4\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\6\150\1\u0268\5\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\3\150\1\u0269\10\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\2\150\1\u026a"+
+    "\1\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\12\150\1\u0188\1\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u026b\3\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u026c"+
+    "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\1\150\1\u026d\12\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u026e\3\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\3\150\1\u026f\2\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\2\150\1\u0270\1\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\150"+
+    "\1\u0271\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\1\150\1\u0188\4\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\3\150\1\u0272\2\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u0273"+
+    "\5\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\4\150\1\u0274\7\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\3\150\1\u0275\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\4\150"+
+    "\1\u0276\7\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\2\150\1\u0277\3\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\3\150\1\u0278\10\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\150\1\u0279\2\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\3\150\1\u027a\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\2\150\1\u027b\3\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u027c"+
+    "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\3\150\1\u027d\10\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\150\1\u027e\2\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\1\150\1\u027f\12\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\6\150\1\u0280\5\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0281\2\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\4\150\1\u0282\1\150\1\0\1\137\1\150\1\0\2\150"+
+    "\1\u0283\2\0\2\150\1\u0284\1\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u0285\5\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\4\150\1\u0286\1\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\1\150\1\u0287\4\150\1\u0288"+
+    "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\1\150\1\u0289\4\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\4\150\1\u028a\7\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u028b\3\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\3\150\1\u0275"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\150\1\u028c\2\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\150\1\u028d\2\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150"+
+    "\1\u028e\2\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\2\150\1\u028f\3\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\3\150\1\u0290\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\1\150\1\u0291\1\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\2\150\1\u0292\12\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\3\150\1\u0293\10\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\6\150"+
+    "\1\u0294\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\2\150\1\u0295\3\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\2\150\1\u0296\1\150\6\0\6\150"+
+    "\1\u0297\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\2\150\1\u0298\3\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\2\150\1\u0188\12\150\1\0\2\150\14\0\1\u0299"+
+    "\7\0\1\u0299\3\0\4\u0299\7\0\2\u0299\5\0\2\u0299"+
+    "\2\0\2\u0299\12\0\1\u0299\1\0\1\u0299\4\0\1\u0299"+
+    "\10\0\1\u0299\11\0\1\u0299\21\0\1\u029a\7\0\1\u029a"+
+    "\3\0\4\u029a\7\0\2\u029a\5\0\2\u029a\2\0\2\u029a"+
+    "\12\0\1\u029a\1\0\1\u029a\4\0\1\u029a\10\0\1\u029a"+
+    "\11\0\1\u029a\20\0\1\u029b\45\0\1\u029b\143\0\1\u029c"+
+    "\116\0\1\u029d\112\0\1\u029e\172\0\1\u029f\42\0\1\u02a0"+
+    "\45\0\1\u02a0\75\0\1\u02a1\117\0\6\u019c\1\u019d\3\u019c"+
+    "\2\0\1\u019c\2\0\1\u019c\4\0\5\u019c\5\0\3\u019c"+
+    "\2\0\4\u019c\6\0\14\u019c\1\0\2\u019c\3\0\12\u019c"+
+    "\1\0\2\u019c\1\0\23\u019c\1\u019d\110\u019c\73\0\1\u02a2"+
+    "\116\0\1\u02a3\112\0\1\u02a4\172\0\1\u02a5\105\0\1\u02a6"+
+    "\112\0\1\u02a7\30\0\1\u02a8\1\u02a9\135\0\1\u02aa\73\0"+
+    "\1\u02ab\150\0\1\u02ac\17\0\1\u02ad\76\0\1\u02ae\144\0"+
+    "\1\u02af\132\0\1\u02b0\131\0\1\u02b1\114\0\1\u02b2\145\0"+
+    "\1\u02b3\133\0\1\u02b4\11\0\1\u02b5\1\0\1\u02b6\1\0"+
+    "\1\u02b7\4\0\1\u02b8\26\0\10\u01af\1\u02b9\25\u01af\1\u02ba"+
+    "\75\u01af\1\u02bb\5\u01af\1\u02bc\1\243\17\u01af\1\243\1\u01af"+
+    "\1\243\2\u01af\1\243\1\u02bd\5\243\6\u01af\1\243\50\u01af"+
+    "\1\243\5\u01af\2\u02be\1\u02bf\6\u02be\1\u01ed\120\u02be\11\u02bf"+
+    "\1\u01ed\120\u02bf\2\u02be\1\u02bf\5\u02be\1\u01b2\1\u02c0\17\u02be"+
+    "\1\u02c1\1\u02be\1\u02c2\2\u02be\1\u01b2\1\u02c3\4\u01b2\1\u02c1"+
+    "\6\u02be\1\u01b2\50\u02be\1\u02c2\5\u02be\2\u01b6\1\0\127\u01b6"+
+    "\50\0\1\u02c4\61\0\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\1\150\1\u02c5\4\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\150\1\u02c6\2\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\4\150\1\u02c7\7\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\1\150\1\u02c8\12\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\3\150\1\u02c9"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\150\1\u02ca\2\150\6\0\1\150\1\u02cb\12\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\150\1\u02cc\2\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\10\150\1\u02cd\3\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\3\150\1\u02ce\2\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u02cf"+
+    "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\u02d0\3\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\2\150\1\u02d1\3\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\3\150\1\u02d2\6\0"+
+    "\1\u02d3\1\150\1\u02d4\1\150\1\u02d5\7\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\2\150\1\u02d6\1\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\1\150\1\u02d7\12\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\4\150\1\u02d8\7\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u02d9"+
+    "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\3\150\1\u02da\10\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\3\150\1\u02db\2\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150"+
+    "\1\u02dc\2\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u02dd\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\1\u02de\5\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\4\150\1\u02df\7\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\1\150\1\u02e0\12\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u02e1\3\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\1\150\1\u02e2\12\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\2\150\1\u0277\3\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\3\150\1\u02e3\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\1\150\1\u02e4\4\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\150\1\u027e\2\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\2\150\1\u0283\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\4\150\1\u028a\7\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\u02e5\5\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\u01d8\1\0\3\u01d8"+
+    "\2\0\6\u01d8\1\0\1\u02e6\6\u01d8\1\0\1\137\1\u01d8"+
+    "\1\0\3\u01d8\2\0\4\u01d8\6\0\14\u01d8\1\137\2\u01d8"+
+    "\3\0\15\u01d8\1\0\2\u01d8\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u02e7\3\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\1\150\1\u02e8\4\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\6\150\1\u02e9\5\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\3\150\1\u02ea\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\3\150\1\u02eb"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\3\150\1\u02ec\10\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\2\150\1\u02ed\3\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\1\150\1\u02ee"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\2\150\1\u02ef\1\150\6\0\10\150\1\u02f0\3\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\1\150\1\u02f1\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\1\u02f2\1\u02f3\4\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\2\150\1\u02f4\3\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\3\150\1\u02f5\6\0"+
+    "\7\150\1\u02f6\4\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u02f7\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u02f8"+
+    "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\1\150\1\u02f9\4\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\73\0\1\u02fa\116\0\1\u02fb\112\0\1\u02fc"+
+    "\172\0\1\u02fd\27\0\2\312\1\0\1\312\1\0\2\312"+
+    "\4\0\6\312\1\0\64\312\1\u02fe\25\312\1\0\1\312"+
+    "\1\0\2\312\4\0\6\312\1\0\64\312\1\u02ff\25\312"+
+    "\1\0\1\312\1\0\2\312\4\0\6\312\1\0\52\312"+
+    "\1\u0300\35\312\13\0\1\u0301\45\0\1\u0301\63\0\6\u01f3"+
+    "\1\0\3\u01f3\2\0\7\u01f3\1\0\6\u01f3\4\0\3\u01f3"+
+    "\1\0\5\u01f3\6\0\14\u01f3\1\0\2\u01f3\3\0\15\u01f3"+
+    "\1\0\2\u01f3\71\0\1\u0302\117\0\1\u0303\113\0\1\u0304"+
+    "\27\0\1\u0305\131\0\1\u0306\4\0\1\u0307\75\0\1\u0308"+
+    "\35\0\1\u0309\125\0\1\u030a\114\0\1\u030b\16\0\1\u030c"+
+    "\76\0\1\u030d\7\0\1\u030e\3\0\1\u030f\143\0\1\u0310"+
+    "\102\0\1\u0311\165\0\1\u0312\123\0\1\u0313\137\0\1\u0314"+
+    "\46\0\6\u0201\1\0\3\u0201\2\0\7\u0201\1\0\6\u0201"+
+    "\4\0\3\u0201\1\0\5\u0201\6\0\14\u0201\1\0\2\u0201"+
+    "\3\0\15\u0201\1\0\2\u0201\100\0\1\u0315\126\0\1\u0203"+
+    "\2\0\1\u0203\72\0\1\u0203\32\0\2\u0203\134\0\1\u0203"+
+    "\73\0\1\u0203\150\0\1\u0203\16\0\1\u0203\44\0\2\374"+
+    "\1\u0316\3\374\1\0\3\374\2\0\5\374\3\0\1\374"+
+    "\1\u0316\4\374\4\0\3\374\2\0\4\374\6\0\14\374"+
+    "\1\0\2\374\3\0\15\374\1\0\2\374\13\0\6\374"+
+    "\1\0\1\u0317\2\374\2\0\5\374\3\0\6\374\4\0"+
+    "\3\374\2\0\4\374\6\0\14\374\1\0\1\u0317\1\374"+
+    "\3\0\15\374\1\0\2\374\35\0\1\u0318\131\0\1\u0319"+
+    "\162\0\1\u031a\121\0\1\u0214\146\0\1\u031b\113\0\1\u031c"+
+    "\54\0\2\71\1\0\1\71\1\0\2\71\4\0\3\71"+
+    "\1\u031d\2\71\1\0\54\71\1\u031d\35\71\1\0\1\71"+
+    "\1\0\2\71\4\0\1\71\1\u0233\4\71\1\0\20\71"+
+    "\1\116\31\71\1\u0233\17\71\1\116\17\71\1\0\1\71"+
+    "\1\0\2\71\4\0\3\71\1\u031e\2\71\1\0\47\71"+
+    "\1\u031f\4\71\1\u031e\14\71\1\u031f\20\71\1\0\1\71"+
+    "\1\0\2\71\4\0\5\71\1\u0320\1\0\17\71\1\u0320"+
+    "\72\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\61\71\1\u0233\16\71\1\u0233\11\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\2\71\1\u0321\31\71\1\u0321"+
+    "\55\71\1\0\1\71\1\0\2\71\4\0\4\71\1\116"+
+    "\1\71\1\0\51\71\1\116\40\71\1\0\1\71\1\0"+
+    "\2\71\4\0\2\71\1\u0322\3\71\1\0\16\71\1\u0322"+
+    "\73\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\1\71\1\u024c\34\71\1\u024c\53\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\2\71\1\116\31\71\1\116"+
+    "\55\71\1\0\1\71\1\0\2\71\4\0\5\71\1\u0233"+
+    "\1\0\17\71\1\u0233\72\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\61\71\1\u0323\16\71\1\u0323\11\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\64\71"+
+    "\1\u0324\10\71\1\u0324\14\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\56\71\1\u0325\14\71\1\u0325\16\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\20\71"+
+    "\1\u0326\51\71\1\u0326\17\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\1\u0233\62\71\1\u0233\26\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\15\71\1\u023d"+
+    "\56\71\1\u023d\15\71\1\0\1\71\1\0\2\71\4\0"+
+    "\6\71\1\0\35\71\1\u0327\32\71\1\u0327\21\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\64\71\1\u024b"+
+    "\10\71\1\u024b\14\71\1\0\1\71\1\0\2\71\4\0"+
+    "\3\71\1\u0328\2\71\1\0\54\71\1\u0328\35\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\35\71\1\u0244"+
+    "\32\71\1\u0244\21\71\1\0\1\71\1\0\2\71\4\0"+
+    "\5\71\1\u0329\1\0\17\71\1\u0329\72\71\1\0\1\71"+
+    "\1\0\2\71\4\0\6\71\1\0\47\71\1\u023d\21\71"+
+    "\1\u023d\20\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+    "\1\0\35\71\1\u0145\32\71\1\u0145\21\71\1\0\1\71"+
+    "\1\0\2\71\4\0\6\71\1\0\55\71\1\116\20\71"+
+    "\1\116\13\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+    "\1\0\2\71\1\u032a\31\71\1\u032a\55\71\1\0\1\71"+
+    "\1\0\2\71\4\0\6\71\1\0\2\71\1\u014a\31\71"+
+    "\1\u014a\55\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+    "\1\0\2\71\1\u024c\31\71\1\u024c\55\71\1\0\1\71"+
+    "\1\0\2\71\4\0\6\71\1\0\2\71\1\u0145\31\71"+
+    "\1\u0145\55\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+    "\1\0\20\71\1\u032b\51\71\1\u032b\17\71\1\0\1\71"+
+    "\1\0\2\71\4\0\1\71\1\u032c\4\71\1\0\52\71"+
+    "\1\u032c\37\71\1\0\1\71\1\0\2\71\4\0\5\71"+
+    "\1\u032d\1\0\17\71\1\u032d\72\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\2\71\1\u032e\31\71\1\u032e"+
+    "\55\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\1\116\62\71\1\116\26\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\47\71\1\u032f\21\71\1\u032f\20\71"+
+    "\1\0\1\71\1\0\2\71\4\0\5\71\1\116\1\0"+
+    "\17\71\1\116\72\71\1\0\1\71\1\0\2\71\4\0"+
+    "\1\71\1\u0108\4\71\1\0\52\71\1\u0108\37\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\56\71\1\u0330"+
+    "\14\71\1\u0330\16\71\1\0\1\71\1\0\2\71\4\0"+
+    "\2\71\1\u0331\3\71\1\0\16\71\1\u0331\73\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\56\71\1\u0332"+
+    "\14\71\1\u0332\16\71\1\0\1\71\1\0\2\71\4\0"+
+    "\6\71\1\0\1\71\1\u0333\34\71\1\u0333\53\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\15\71\1\u0334"+
+    "\56\71\1\u0334\15\71\1\0\1\71\1\0\2\71\4\0"+
+    "\6\71\1\0\56\71\1\116\14\71\1\116\16\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\50\71\1\u0222"+
+    "\6\71\1\u0222\32\71\1\0\1\71\1\0\2\71\4\0"+
+    "\6\71\1\0\47\71\1\u0335\21\71\1\u0335\20\71\1\0"+
+    "\1\71\1\0\2\71\4\0\3\71\1\u0336\2\71\1\0"+
+    "\54\71\1\u0336\35\71\1\0\1\71\1\0\2\71\4\0"+
+    "\6\71\1\0\35\71\1\116\32\71\1\116\21\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\1\71\1\u0337"+
+    "\34\71\1\u0337\53\71\1\0\1\71\1\0\2\71\4\0"+
+    "\3\71\1\u012c\2\71\1\0\54\71\1\u012c\35\71\1\0"+
+    "\1\71\1\0\2\71\4\0\2\71\1\u0338\3\71\1\0"+
+    "\16\71\1\u0338\73\71\1\0\1\71\1\0\2\71\4\0"+
+    "\6\71\1\0\50\71\1\u0339\6\71\1\u0339\32\71\1\0"+
+    "\1\71\1\0\2\71\4\0\3\71\1\u032d\2\71\1\0"+
+    "\54\71\1\u032d\7\71\1\u0324\10\71\1\u0324\14\71\1\0"+
+    "\1\71\1\0\2\71\4\0\4\71\1\u0229\1\71\1\0"+
+    "\51\71\1\u0229\40\71\1\0\1\71\1\0\2\71\4\0"+
+    "\6\71\1\0\1\71\1\u033a\34\71\1\u033a\53\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\35\71\1\u033b"+
+    "\32\71\1\u033b\21\71\1\0\1\71\1\0\2\71\4\0"+
+    "\6\71\1\0\35\71\1\u033c\32\71\1\u033c\21\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\64\71\1\u033d"+
+    "\10\71\1\u033d\14\71\1\0\1\71\1\0\2\71\4\0"+
+    "\6\71\1\0\2\71\1\u014a\31\71\1\u014a\1\116\32\71"+
+    "\1\116\21\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+    "\1\0\15\71\1\116\56\71\1\116\15\71\1\0\1\71"+
+    "\1\0\2\71\4\0\5\71\1\u033e\1\0\17\71\1\u033e"+
+    "\72\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\55\71\1\116\20\71\1\116\1\u033f\6\71\1\u033f\3\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\2\71"+
+    "\1\u012c\31\71\1\u012c\53\71\14\0\1\u0340\57\0\1\u0340"+
+    "\133\0\1\u025b\1\0\1\u025b\5\0\1\u025b\35\0\1\u0341"+
+    "\117\0\1\137\12\0\1\137\1\u0342\4\137\1\0\2\137"+
+    "\1\u0342\2\0\1\137\4\u0342\1\137\1\0\5\137\2\u0342"+
+    "\1\0\2\137\1\0\1\137\2\u0342\2\0\2\u0342\2\137"+
+    "\6\0\2\137\1\u0342\1\137\1\u0342\4\137\1\u0342\5\137"+
+    "\3\0\1\u0342\11\137\1\u0342\2\137\1\0\3\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\6\150\1\u0343\5\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\u0158\12\0\6\u0158\1\0\3\u0158\2\0\1\u0158"+
+    "\2\u025f\1\u0158\1\u025f\1\u0158\1\0\6\u0158\1\u025f\1\0"+
+    "\2\u0158\1\0\1\u0158\2\u015b\2\0\4\u0158\6\0\2\u0158"+
+    "\1\u015b\6\u0158\1\u015b\5\u0158\3\0\12\u0158\1\u025f\2\u0158"+
+    "\1\0\2\u0158\30\0\2\u025f\1\0\1\u025f\10\0\1\u025f"+
+    "\57\0\1\u025f\5\0\1\u0158\12\0\1\u0158\1\u0262\4\u0158"+
+    "\1\0\1\u0158\1\u0261\1\u0262\2\0\1\u0158\4\u0262\1\u0158"+
+    "\1\0\5\u0158\2\u0262\1\0\2\u0158\1\0\1\u0158\2\u0262"+
+    "\2\0\2\u0262\1\u0261\1\u0158\6\0\2\u0158\1\u0262\1\u0158"+
+    "\1\u0262\4\u0158\1\u0262\5\u0158\3\0\1\u0262\11\u0158\1\u0262"+
+    "\2\u0158\1\0\2\u0158\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\3\150\1\u0173\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u0344\5\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u0345"+
+    "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\3\150\1\u0346\2\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\1\150\1\u0347"+
+    "\12\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\3\150"+
+    "\1\u0188\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\u0348\3\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\2\150\1\u0188\1\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\6\150\1\u0349\5\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\150\1\u034a\2\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\2\150\1\u034b\1\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u034c"+
+    "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\4\150\1\u034d\7\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\3\150\1\u0265\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u034e"+
+    "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\150\1\u034f\2\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\10\150\1\u0188"+
+    "\3\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\1\u0350\13\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\u0188\3\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\150\1\u0351\2\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\u0352\3\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\1\150\1\u0353\12\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\2\150\1\u0354\1\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+    "\1\u0355\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\1\150\1\u034c\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\u016e\3\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u0356"+
+    "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\1\150\1\u034e\4\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\2\150\1\u028b\3\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\4\150\1\u0357\7\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\u0358\5\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\150\1\u0359\2\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\u035a\3\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\4\150\1\u035b\1\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\2\150\1\u0356\1\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+    "\1\u035c\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\13\150\1\u035d\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\3\150\1\u035e\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\7\150"+
+    "\1\u035f\4\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\4\150\1\u0295\7\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\3\150\1\u0268\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u034c"+
+    "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\2\150\1\u0360\3\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\3\150\1\u0361\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\u0362\3\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+    "\1\u0363\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\6\150\1\u0364\5\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\150\1\u0365\2\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\2\150"+
+    "\1\u0366\1\150\6\0\1\150\1\u0353\12\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\2\150\1\u0275\1\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\1\u0188\13\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\150\1\u0367\2\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\2\150\1\u0188"+
+    "\11\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\1\150\1\u0188\12\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\14\0\1\u0368\7\0\1\u0368\3\0\4\u0368"+
+    "\7\0\2\u0368\5\0\2\u0368\2\0\2\u0368\12\0\1\u0368"+
+    "\1\0\1\u0368\4\0\1\u0368\10\0\1\u0368\11\0\1\u0368"+
+    "\21\0\1\u0369\7\0\1\u0369\3\0\4\u0369\7\0\2\u0369"+
+    "\5\0\2\u0369\2\0\2\u0369\12\0\1\u0369\1\0\1\u0369"+
+    "\4\0\1\u0369\10\0\1\u0369\11\0\1\u0369\21\0\1\u036a"+
+    "\57\0\1\u036a\123\0\1\u036b\121\0\1\u029c\146\0\1\u036c"+
+    "\113\0\1\u036d\70\0\1\u036e\57\0\1\u036e\56\0\1\u036f"+
+    "\176\0\1\u0370\121\0\1\u02a2\146\0\1\u0371\113\0\1\u0372"+
+    "\115\0\1\u0373\131\0\1\u0374\130\0\1\u0375\163\0\1\u0376"+
+    "\116\0\1\u0377\14\0\1\u0378\76\0\1\u0379\130\0\1\u037a"+
+    "\15\0\1\u037b\115\0\1\u037c\150\0\1\u037d\143\0\1\u037e"+
+    "\76\0\1\u037f\132\0\1\u0380\131\0\1\u0381\30\0\1\u0382"+
+    "\77\0\1\u0383\167\0\1\u0384\124\0\1\u0385\131\0\1\u0386"+
+    "\102\0\1\u0387\146\0\1\u0388\52\0\2\u01af\1\u02bb\5\u01af"+
+    "\1\u0389\121\u01af\10\u02bb\1\u02b9\121\u02bb\2\u02bc\1\u0389\5\u02bc"+
+    "\1\u01b0\25\u02bc\1\u038a\73\u02bc\10\u01af\1\u02b9\3\u01af\1\u038b"+
+    "\7\u01af\1\u038b\3\u01af\4\u038b\2\u01af\1\u02ba\4\u01af\2\u038b"+
+    "\5\u01af\2\u038b\2\u01af\2\u038b\12\u01af\1\u038b\1\u01af\1\u038b"+
+    "\4\u01af\1\u038b\10\u01af\1\u038b\11\u01af\1\u038b\5\u01af\2\u02be"+
+    "\1\u02bf\6\u02be\1\u01b4\120\u02be\11\u02bf\1\u01b4\120\u02bf\11\0"+
+    "\1\u01ed\120\0\2\u02be\1\u02bf\6\u02be\1\u01ed\17\u02be\1\u02c2"+
+    "\1\u02be\1\u02c2\10\u02be\1\u02c2\57\u02be\1\u02c2\7\u02be\1\u02bf"+
+    "\6\u02be\1\u01ed\17\u02be\1\u01b2\1\u02be\1\u01b2\10\u02be\1\u01b2"+
+    "\57\u02be\1\u01b2\7\u02be\1\u02bf\6\u02be\1\u01b4\2\u02be\1\u038c"+
+    "\7\u02be\1\u038c\3\u02be\4\u038c\7\u02be\2\u038c\5\u02be\2\u038c"+
+    "\2\u02be\2\u038c\12\u02be\1\u038c\1\u02be\1\u038c\4\u02be\1\u038c"+
+    "\10\u02be\1\u038c\11\u02be\1\u038c\5\u02be\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\6\150"+
+    "\1\u038d\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\4\150\1\u038e\7\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\1\u038f\5\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0390"+
+    "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\2\150\1\u0391\3\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\3\150\1\u0392\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0393"+
+    "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\1\150\1\u0394\4\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\3\150\1\u0395\10\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+    "\1\u0396\1\u0397\2\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\2\150\1\u0397\11\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0397"+
+    "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\u0398\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\2\150\1\u0399\3\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\u039a\3\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u039b"+
+    "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\1\150\1\u039c\12\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\u039d\3\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\4\150\1\u039e\7\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\7\150\1\u039f\4\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\u03a0\3\150\6\0\1\150"+
+    "\1\u03a1\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\u03a2\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\1\150\1\u0354"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\7\150\1\u03a3"+
+    "\4\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\1\150\1\u03a4\12\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\10\150\1\u03a5\3\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\u03a6\3\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\2\150"+
+    "\1\u03a7\1\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\u0354\3\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\150\1\u0390\2\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u0353"+
+    "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\6\150\1\u03a8\5\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\4\150\1\u03a9\1\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\137\1\0\3\137\2\0\6\137\1\0\1\137"+
+    "\1\u03aa\5\137\1\0\2\137\1\0\3\137\2\0\4\137"+
+    "\6\0\17\137\3\0\15\137\1\0\3\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\150"+
+    "\1\u03ab\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\150\1\u03ac\2\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\2\150\1\u03ad\3\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+    "\1\u03ae\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\u03af\3\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\u03b0\3\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\1\150\1\u03b1\13\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\u03b2\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\2\150\1\u03b3\1\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\4\150\1\u03b4"+
+    "\1\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\150\1\u03b5\2\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\1\u03b6\5\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\2\150\1\u03b7\1\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\1\u0354\13\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\1\u03b8\5\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\150\1\u03b9\2\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150"+
+    "\1\u03ba\2\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\6\150\1\u03bb\5\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\2\150\1\u0354"+
+    "\11\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\2\150\1\u03bc\3\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\66\0\1\u03bd\121\0\1\u02fa\146\0\1\u03be"+
+    "\113\0\1\u03bf\54\0\2\312\1\0\1\312\1\0\2\312"+
+    "\4\0\6\312\1\0\36\312\1\u03c0\53\312\1\0\1\312"+
+    "\1\0\2\312\4\0\6\312\1\0\34\312\1\u03c1\55\312"+
+    "\1\0\1\312\1\0\2\312\4\0\6\312\1\0\36\312"+
+    "\1\u03c2\51\312\20\0\1\u03c3\20\0\1\u03c3\161\0\1\u0305"+
+    "\100\0\1\u03c4\161\0\1\u03c5\102\0\1\316\164\0\1\u03c6"+
+    "\75\0\1\u03c7\150\0\1\u03c8\145\0\1\u03c9\77\0\1\u03ca"+
+    "\132\0\1\u03cb\16\0\1\u03cc\112\0\1\u03cd\145\0\1\u03ce"+
+    "\151\0\1\u03cf\106\0\1\u03d0\161\0\1\u03d1\106\0\1\u03d2"+
+    "\132\0\1\u0308\126\0\1\u03d3\134\0\1\u03d4\143\0\1\u03d5"+
+    "\51\0\3\374\1\u03d6\2\374\1\0\3\374\2\0\5\374"+
+    "\3\0\6\374\4\0\3\374\2\0\4\374\6\0\6\374"+
+    "\1\u03d6\5\374\1\0\2\374\3\0\15\374\1\0\2\374"+
+    "\13\0\6\374\1\0\1\374\1\u03d7\1\374\2\0\5\374"+
+    "\3\0\6\374\4\0\3\374\2\0\2\374\1\u03d7\1\374"+
+    "\6\0\14\374\1\0\2\374\3\0\15\374\1\0\2\374"+
+    "\12\0\1\u03d8\200\0\1\u0214\4\0\1\u031a\50\0\3\u03d9"+
+    "\1\0\1\u03d9\7\u031c\1\0\3\u031c\2\u03d9\5\u031c\2\u03d9"+
+    "\1\0\6\u031c\1\0\1\u03d9\1\u031c\1\u03d9\3\u031c\2\u03d9"+
+    "\4\u031c\1\0\1\u03d9\1\0\3\u03d9\14\u031c\1\u03d9\2\u031c"+
+    "\3\u03d9\15\u031c\1\0\2\u031c\2\71\1\0\1\71\1\0"+
+    "\2\71\4\0\4\71\1\u023d\1\71\1\0\51\71\1\u023d"+
+    "\40\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\55\71\1\u0222\20\71\1\u0222\13\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\20\71\1\u0119\51\71\1\u0119"+
+    "\17\71\1\0\1\71\1\0\2\71\4\0\3\71\1\u032d"+
+    "\2\71\1\0\54\71\1\u032d\35\71\1\0\1\71\1\0"+
+    "\2\71\4\0\1\71\1\u023d\4\71\1\0\52\71\1\u023d"+
+    "\37\71\1\0\1\71\1\0\2\71\4\0\1\71\1\u0222"+
+    "\4\71\1\0\52\71\1\u0222\37\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\35\71\1\u03da\32\71\1\u03da"+
+    "\21\71\1\0\1\71\1\0\2\71\4\0\2\71\1\u03db"+
+    "\3\71\1\0\16\71\1\u03db\73\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\2\71\1\u03dc\31\71\1\u03dc"+
+    "\1\u032a\32\71\1\u032a\21\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\50\71\1\u03dd\6\71\1\u03dd\32\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\56\71"+
+    "\1\u0222\14\71\1\u0222\16\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\20\71\1\u03de\51\71\1\u03de\17\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\35\71"+
+    "\1\u03df\32\71\1\u03df\21\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\20\71\1\u0145\51\71\1\u0145\17\71"+
+    "\1\0\1\71\1\0\2\71\4\0\5\71\1\u03e0\1\0"+
+    "\17\71\1\u03e0\72\71\1\0\1\71\1\0\2\71\4\0"+
+    "\6\71\1\0\55\71\1\u03e1\20\71\1\u03e1\13\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\47\71\1\u0142"+
+    "\21\71\1\u0142\20\71\1\0\1\71\1\0\2\71\4\0"+
+    "\6\71\1\0\30\71\2\u03e2\60\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\15\71\1\u032a\56\71\1\u032a"+
+    "\15\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\35\71\1\u03e3\32\71\1\u03e3\21\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\2\71\1\u03e4\31\71\1\u03e4"+
+    "\55\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\50\71\1\u03e5\6\71\1\u03e5\32\71\1\0\1\71\1\0"+
+    "\2\71\4\0\2\71\1\u0222\3\71\1\0\16\71\1\u0222"+
+    "\73\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\20\71\1\u03e6\51\71\1\u03e6\17\71\1\0\1\71\1\0"+
+    "\2\71\4\0\1\71\1\u0114\4\71\1\0\52\71\1\u0114"+
+    "\37\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\2\71\1\u023d\31\71\1\u023d\55\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\2\71\1\u03e7\31\71\1\u03e7"+
+    "\55\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\47\71\1\u0119\21\71\1\u0119\20\71\1\0\1\71\1\0"+
+    "\2\71\4\0\3\71\1\u03e8\2\71\1\0\54\71\1\u03e8"+
+    "\35\71\1\0\1\71\1\0\2\71\4\0\5\71\1\u03e9"+
+    "\1\0\1\71\1\u03ea\15\71\1\u03e9\16\71\1\u03ea\25\71"+
+    "\1\u03eb\10\71\1\u03eb\14\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\2\71\1\u0142\31\71\1\u0142\55\71"+
+    "\1\0\1\71\1\0\2\71\4\0\3\71\1\u03ec\2\71"+
+    "\1\0\54\71\1\u03ec\35\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\15\71\1\u03ed\56\71\1\u03ed\13\71"+
+    "\15\0\1\u03ee\22\0\1\u03ee\71\0\1\137\12\0\1\137"+
+    "\1\u03ef\4\137\1\0\2\137\1\u03ef\2\0\1\137\4\u03ef"+
+    "\1\137\1\0\5\137\2\u03ef\1\0\2\137\1\0\1\137"+
+    "\2\u03ef\2\0\2\u03ef\2\137\6\0\2\137\1\u03ef\1\137"+
+    "\1\u03ef\4\137\1\u03ef\5\137\3\0\1\u03ef\11\137\1\u03ef"+
+    "\2\137\1\0\3\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\3\150\1\u03f0\2\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u03f1"+
+    "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\3\150\1\u03f2\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\12\150\1\u03f3\1\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\150"+
+    "\1\u03f4\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\13\150\1\u0275\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\7\150\1\u0188\4\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\u03f5\3\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\2\150\1\u03f6\3\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\2\150\1\u034c\3\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\2\150\1\u03f7\1\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\3\150\1\u02e1\10\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\3\150\1\u03f8\2\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150"+
+    "\1\u0361\4\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u03f9\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u03fa"+
+    "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\1\u03fb\13\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\1\150\1\u03fc\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\1\u03fd\5\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u0275"+
+    "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\2\150\1\u026e\1\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\u03fe\3\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\150\1\u035a\2\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\u03ff\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\150\1\u0400\2\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\6\150"+
+    "\1\u0401\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\2\150\1\u0188\3\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\1\150\1\u0402\4\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u0403"+
+    "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\3\150\1\u0404\2\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\2\150\1\u0354\12\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u0405"+
+    "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\2\150\1\u018b\3\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\15\0\1\u0406\22\0\1\u0406"+
+    "\103\0\1\u0407\200\0\1\u029c\4\0\1\u036b\50\0\3\u0408"+
+    "\1\0\1\u0408\7\u036d\1\0\3\u036d\2\u0408\5\u036d\2\u0408"+
+    "\1\0\6\u036d\1\0\1\u0408\1\u036d\1\u0408\3\u036d\2\u0408"+
+    "\4\u036d\1\0\1\u0408\1\0\3\u0408\14\u036d\1\u0408\2\u036d"+
+    "\3\u0408\15\u036d\1\0\2\u036d\15\0\1\u0409\22\0\1\u0409"+
+    "\103\0\1\u040a\200\0\1\u02a2\4\0\1\u0370\50\0\3\u040b"+
+    "\1\0\1\u040b\7\u0372\1\0\3\u0372\2\u040b\5\u0372\2\u040b"+
+    "\1\0\6\u0372\1\0\1\u040b\1\u0372\1\u040b\3\u0372\2\u040b"+
+    "\4\u0372\1\0\1\u040b\1\0\3\u040b\14\u0372\1\u040b\2\u0372"+
+    "\3\u040b\15\u0372\1\0\2\u0372\37\0\1\u040c\163\0\1\u040d"+
+    "\116\0\1\u040e\12\0\1\u040f\131\0\1\u037b\140\0\1\u0410"+
+    "\107\0\1\u0411\1\0\1\u0412\141\0\1\u0413\137\0\1\u0414"+
+    "\127\0\1\u0415\126\0\1\u0416\100\0\1\u0417\150\0\1\u0418"+
+    "\130\0\1\u0419\131\0\1\u041a\131\0\1\u041b\134\0\1\u041c"+
+    "\111\0\1\u041d\1\u041e\163\0\1\u041f\127\0\1\u0420\127\0"+
+    "\1\u0421\121\0\1\u0422\51\0\10\u0389\1\0\25\u0389\1\u0423"+
+    "\75\u0389\1\0\5\u0389\2\u02bc\17\u0389\1\u02bc\1\u0389\1\u02bc"+
+    "\2\u0389\1\u02bc\1\u0424\5\u02bc\6\u0389\1\u02bc\50\u0389\1\u02bc"+
+    "\5\u0389\10\u01af\1\u02b9\3\u01af\1\u0425\7\u01af\1\u0425\3\u01af"+
+    "\4\u0425\2\u01af\1\u02ba\4\u01af\2\u0425\5\u01af\2\u0425\2\u01af"+
+    "\2\u0425\12\u01af\1\u0425\1\u01af\1\u0425\4\u01af\1\u0425\10\u01af"+
+    "\1\u0425\11\u01af\1\u0425\5\u01af\2\u02be\1\u02bf\6\u02be\1\u01b4"+
+    "\2\u02be\1\u0426\7\u02be\1\u0426\3\u02be\4\u0426\7\u02be\2\u0426"+
+    "\5\u02be\2\u0426\2\u02be\2\u0426\12\u02be\1\u0426\1\u02be\1\u0426"+
+    "\4\u02be\1\u0426\10\u02be\1\u0426\11\u02be\1\u0426\5\u02be\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\3\150\1\u0427\2\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\4\150\1\u0428\7\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\7\150\1\u0429"+
+    "\4\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\1\150\1\u042a\4\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\2\150\1\u0354\3\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\u042b\3\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\3\150"+
+    "\1\u042c\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\u042d\3\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\1\u042e\5\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\150\1\u042f\2\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+    "\1\u02d0\2\150\6\0\6\150\1\u0430\5\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0431"+
+    "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+    "\1\u02e5\2\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\1\150\1\u0432\4\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\1\150\1\u0433\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u0434"+
+    "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u0435\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\5\150\1\u0436"+
+    "\6\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\10\150\1\u0437\3\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\1\150\1\u0438"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\u0439\3\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u043a"+
+    "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\150\1\u043b\2\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\12\150\1\u0397"+
+    "\1\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\2\150\1\u043c\12\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\150\1\u043d\2\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0354"+
+    "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\1\150\1\u043e\4\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\3\150\1\u043f\10\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\u0440\3\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\4\150\1\u0441\7\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\2\150\1\u02e1\1\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\1\137\1\u0442\4\137\1\0\2\137\1\u0442\2\0\1\137"+
+    "\4\u0442\1\137\1\0\5\137\2\u0442\1\0\2\137\1\0"+
+    "\1\137\2\u0442\2\0\2\u0442\2\137\6\0\2\137\1\u0442"+
+    "\1\137\1\u0442\4\137\1\u0442\5\137\3\0\1\u0442\11\137"+
+    "\1\u0442\2\137\1\0\3\137\12\0\1\150\1\u0443\4\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\1\u0444\1\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\1\u0445\13\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\1\150\1\u0446\4\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0447"+
+    "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\3\150\1\u02cf\2\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\2\150\1\u0448\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\4\150"+
+    "\1\u0390\7\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\4\150\1\u0449\1\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\u044a\3\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u044b"+
+    "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\4\150\1\u044c\7\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\150\1\u044d\2\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\3\150\1\u044e\10\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\2\150\1\u044f\3\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\1\150\1\u0450"+
+    "\12\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\2\150\1\u0451\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\u0452\5\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\12\0\1\u0453\200\0\1\u02fa\4\0"+
+    "\1\u03bd\50\0\3\u0454\1\0\1\u0454\7\u03bf\1\0\3\u03bf"+
+    "\2\u0454\5\u03bf\2\u0454\1\0\6\u03bf\1\0\1\u0454\1\u03bf"+
+    "\1\u0454\3\u03bf\2\u0454\4\u03bf\1\0\1\u0454\1\0\3\u0454"+
+    "\14\u03bf\1\u0454\2\u03bf\3\u0454\15\u03bf\1\0\2\u03bf\2\312"+
+    "\1\0\1\312\1\0\2\312\4\0\6\312\1\0\54\312"+
+    "\1\u0455\35\312\1\0\1\312\1\0\2\312\4\0\6\312"+
+    "\1\0\15\312\1\u0456\72\312\22\0\1\u0457\62\0\1\u0457"+
+    "\132\0\1\u0458\60\0\1\u0459\133\0\1\u045a\153\0\1\u03cc"+
+    "\113\0\1\u045b\127\0\1\u045c\166\0\1\u045d\141\0\1\316"+
+    "\64\0\1\u045e\167\0\1\316\105\0\1\u045f\116\0\1\u0460"+
+    "\132\0\1\u03d1\146\0\1\u0461\160\0\1\u045e\120\0\1\u0462"+
+    "\133\0\1\u0463\124\0\1\u0464\53\0\4\374\1\u0465\1\374"+
+    "\1\0\3\374\2\0\5\374\3\0\6\374\4\0\3\374"+
+    "\2\0\4\374\6\0\3\374\1\u0465\10\374\1\0\2\374"+
+    "\3\0\15\374\1\0\2\374\13\0\6\374\1\0\2\374"+
+    "\1\u0466\2\0\5\374\3\0\6\374\4\0\3\374\2\0"+
+    "\1\u0466\3\374\6\0\14\374\1\0\2\374\3\0\15\374"+
+    "\1\0\2\374\12\0\1\u031c\117\0\2\71\1\0\1\71"+
+    "\1\0\2\71\4\0\1\116\5\71\1\0\37\71\1\116"+
+    "\52\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\47\71\1\u0467\21\71\1\u0467\20\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\20\71\1\u023d\51\71\1\u023d"+
+    "\17\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+    "\2\71\1\u0468\31\71\1\u0468\55\71\1\0\1\71\1\0"+
+    "\2\71\4\0\5\71\1\u0469\1\0\17\71\1\u0469\72\71"+
+    "\1\0\1\71\1\0\2\71\4\0\2\71\1\u046a\3\71"+
+    "\1\0\16\71\1\u046a\73\71\1\0\1\71\1\0\2\71"+
+    "\4\0\1\u046b\5\71\1\0\37\71\1\u046b\52\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\77\71\1\u046c"+
+    "\6\71\1\u046c\3\71\1\0\1\71\1\0\2\71\4\0"+
+    "\6\71\1\0\47\71\1\u03dc\21\71\1\u03dc\20\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\56\71\1\u046d"+
+    "\14\71\1\u046d\16\71\1\0\1\71\1\0\2\71\4\0"+
+    "\1\u0337\5\71\1\0\37\71\1\u0337\52\71\1\0\1\71"+
+    "\1\0\2\71\4\0\6\71\1\0\1\u0244\62\71\1\u0244"+
+    "\26\71\1\0\1\71\1\0\2\71\4\0\1\u03da\5\71"+
+    "\1\0\37\71\1\u03da\52\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\1\71\1\u03da\34\71\1\u03da\53\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\2\71"+
+    "\1\u046e\31\71\1\u046e\55\71\1\0\1\71\1\0\2\71"+
+    "\4\0\3\71\1\u012e\2\71\1\0\54\71\1\u012e\35\71"+
+    "\1\0\1\71\1\0\2\71\4\0\2\71\1\u046f\3\71"+
+    "\1\0\16\71\1\u046f\73\71\1\0\1\71\1\0\2\71"+
+    "\4\0\1\71\1\u0470\4\71\1\0\52\71\1\u0470\37\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\2\71"+
+    "\1\u0222\31\71\1\u0222\53\71\16\0\1\u0471\57\0\1\u0471"+
+    "\33\0\1\137\12\0\1\137\1\u0472\4\137\1\0\2\137"+
+    "\1\u0472\2\0\1\137\4\u0472\1\137\1\0\5\137\2\u0472"+
+    "\1\0\2\137\1\0\1\137\2\u0472\2\0\2\u0472\2\137"+
+    "\6\0\2\137\1\u0472\1\137\1\u0472\4\137\1\u0472\5\137"+
+    "\3\0\1\u0472\11\137\1\u0472\2\137\1\0\3\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\6\150\1\u0473\5\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\3\150\1\u0474\2\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0475"+
+    "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\2\150\1\u0188\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\150\1\u0476\2\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0477"+
+    "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\2\150"+
+    "\1\u0478\1\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\2\150\1\u0268\11\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\150\1\u0479\2\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\4\150\1\u0188\7\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\1\150\1\u047a\4\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\1\150\1\u027d\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\2\150\1\u0361\1\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\4\150\1\u047b\7\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\3\150\1\u047c\2\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\1\150\1\261"+
+    "\1\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\1\150"+
+    "\1\u0275\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u047d"+
+    "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\2\150\1\u047e"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\3\150\1\u047f\2\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\6\150"+
+    "\1\u01cf\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\10\150\1\u0480\3\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\16\0\1\u0481\57\0\1\u0481\45\0"+
+    "\1\u036d\135\0\1\u0482\57\0\1\u0482\45\0\1\u0372\157\0"+
+    "\1\u0483\131\0\1\u0484\150\0\1\u0485\154\0\1\u0486\122\0"+
+    "\1\u0487\131\0\1\u0488\75\0\1\u0489\163\0\1\u048a\117\0"+
+    "\1\u048b\130\0\1\u037b\133\0\1\u048c\127\0\1\u048d\153\0"+
+    "\1\u037b\137\0\1\u048e\63\0\1\u048f\166\0\1\u037b\132\0"+
+    "\1\u0490\111\0\1\u0491\152\0\1\u0492\47\0\1\u0493\172\0"+
+    "\1\u0492\131\0\1\u0494\112\0\1\u0420\72\0\2\u0389\1\0"+
+    "\137\u0389\1\0\3\u0389\1\u0495\7\u0389\1\u0495\3\u0389\4\u0495"+
+    "\2\u0389\1\u0423\4\u0389\2\u0495\5\u0389\2\u0495\2\u0389\2\u0495"+
+    "\12\u0389\1\u0495\1\u0389\1\u0495\4\u0389\1\u0495\10\u0389\1\u0495"+
+    "\11\u0389\1\u0495\5\u0389\10\u01af\1\u02b9\3\u01af\1\u0496\7\u01af"+
+    "\1\u0496\3\u01af\4\u0496\2\u01af\1\u02ba\4\u01af\2\u0496\5\u01af"+
+    "\2\u0496\2\u01af\2\u0496\12\u01af\1\u0496\1\u01af\1\u0496\4\u01af"+
+    "\1\u0496\10\u01af\1\u0496\11\u01af\1\u0496\5\u01af\2\u02be\1\u02bf"+
+    "\6\u02be\1\u01b4\2\u02be\1\u0497\7\u02be\1\u0497\3\u02be\4\u0497"+
+    "\7\u02be\2\u0497\5\u02be\2\u0497\2\u02be\2\u0497\12\u02be\1\u0497"+
+    "\1\u02be\1\u0497\4\u02be\1\u0497\10\u02be\1\u0497\11\u02be\1\u0497"+
+    "\5\u02be\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\1\150\1\u0498\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\2\150\1\u0499\3\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\5\150\1\u049a\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\1\150\1\u049b\13\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\6\150\1\u049c\5\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\10\150"+
+    "\1\u0354\3\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\1\150\1\u049d\4\150\1\0\1\150\1\u049e"+
+    "\1\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\1\150\1\u049f\1\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\2\150\1\u04a0\12\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\150\1\u02e5\2\150\6\0\14\150\1\137\2\150"+
+    "\3\0\2\150\1\u04a1\12\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\u04a2\3\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\4\150\1\u04a3\7\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\2\150\1\u0433\1\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\10\150\1\u04a4\3\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u04a5\1\150\1\u04a6\2\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\u03a4\3\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\3\150\1\u04a7\2\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\6\150\1\u04a8\5\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\1\150\1\u04a9\13\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\3\150\1\u04aa\10\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\150\1\u04ab\2\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\3\150"+
+    "\1\u04ac\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\1\150\1\u02e1\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\2\150\1\u04ad\11\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\1\150\1\u04ae\12\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\1\150\1\u04af\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\1\150\1\u04b0\12\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+    "\1\u04b1\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\150\1\u04b2\2\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u04b3\3\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\1\137\1\u04b4\4\137\1\0\2\137\1\u04b4\2\0"+
+    "\1\137\4\u04b4\1\137\1\0\5\137\2\u04b4\1\0\2\137"+
+    "\1\0\1\137\2\u04b4\2\0\2\u04b4\2\137\6\0\2\137"+
+    "\1\u04b4\1\137\1\u04b4\4\137\1\u04b4\5\137\3\0\1\u04b4"+
+    "\11\137\1\u04b4\2\137\1\0\3\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\2\150\1\u04b5\1\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\1\u04b6\2\150\1\u04b7\2\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\10\150\1\u04b8\3\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u04b9"+
+    "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\2\150\1\u04ba\3\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\3\150\1\u04bb\11\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\1\150\1\u04bc\12\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\1\150\1\u04bd\4\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\6\150"+
+    "\1\u04be\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\1\u04bf\13\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\3\150\1\u04c0\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\3\150\1\u04c1"+
+    "\10\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\6\150\1\u04c2\5\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\12\150\1\u04c3\1\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\1\u04c4\1\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+    "\1\u04c5\2\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\12\0\1\u03bf\117\0\2\312\1\0\1\312"+
+    "\1\0\2\312\4\0\6\312\1\0\21\312\1\u03c1\70\312"+
+    "\1\0\1\312\1\0\2\312\4\0\6\312\1\0\50\312"+
+    "\1\u02ff\37\312\23\0\1\u04c6\34\0\1\u04c6\127\0\1\u0305"+
+    "\133\0\1\u04c7\10\0\1\u04c8\2\0\1\u04c9\116\0\1\316"+
+    "\130\0\1\u04ca\156\0\1\316\127\0\1\u04cb\63\0\1\u04cc"+
+    "\165\0\1\u04cd\121\0\1\u04ce\110\0\1\316\170\0\1\u04ca"+
+    "\73\0\1\u04ca\130\0\1\u04cf\104\0\5\374\1\u04d0\1\0"+
+    "\3\374\2\0\5\374\3\0\2\374\1\u04d0\3\374\4\0"+
+    "\3\374\2\0\4\374\6\0\14\374\1\0\2\374\3\0"+
+    "\15\374\1\0\2\374\2\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\15\71\1\u021f\56\71\1\u021f\15\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\27\71"+
+    "\1\116\23\71\1\116\36\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\2\71\1\u04d1\31\71\1\u04d1\55\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\2\71"+
+    "\1\u0248\31\71\1\u0248\55\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\47\71\1\u010e\21\71\1\u010e\20\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\15\71"+
+    "\1\u04d2\56\71\1\u04d2\15\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\2\71\1\u03da\31\71\1\u03da\55\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\56\71"+
+    "\1\u04d3\14\71\1\u04d3\16\71\1\0\1\71\1\0\2\71"+
+    "\4\0\3\71\1\u0145\2\71\1\0\54\71\1\u0145\35\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\47\71"+
+    "\1\u024c\21\71\1\u024c\16\71\17\0\1\u04d4\53\0\1\u04d4"+
+    "\36\0\1\137\12\0\1\137\1\150\4\137\1\0\2\137"+
+    "\1\150\2\0\1\137\4\150\1\137\1\0\5\137\2\150"+
+    "\1\0\2\137\1\0\1\137\2\150\2\0\2\150\2\137"+
+    "\6\0\2\137\1\150\1\137\1\150\4\137\1\150\5\137"+
+    "\3\0\1\150\11\137\1\150\2\137\1\0\3\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+    "\1\u0478\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\u04d5\3\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\3\150\1\u034c\2\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\1\150\1\u04d6\12\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\1\u0188\1\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\4\150\1\u0361\7\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\1\150\1\u04d7\12\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\2\150\1\u04d8\3\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0390\2\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\1\u0275\5\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\150\1\u04d9\2\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\4\150\1\u0269"+
+    "\7\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u04da"+
+    "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\17\0\1\u04db\53\0\1\u04db\55\0\1\u04dc\53\0"+
+    "\1\u04dc\100\0\1\u037b\165\0\1\u04dd\125\0\1\u04de\120\0"+
+    "\1\u037b\130\0\1\u0415\112\0\1\u041c\162\0\1\u0415\77\0"+
+    "\1\u037b\151\0\1\u04df\127\0\1\u04e0\147\0\1\u04e1\126\0"+
+    "\1\u04e2\102\0\1\u04dd\160\0\1\u0483\100\0\1\u04e3\71\0"+
+    "\62\u0492\1\u037b\47\u0492\71\0\1\u04e4\100\0\1\u04e5\71\0"+
+    "\10\u0389\1\0\3\u0389\1\u04e6\7\u0389\1\u04e6\3\u0389\4\u04e6"+
+    "\2\u0389\1\u0423\4\u0389\2\u04e6\5\u0389\2\u04e6\2\u0389\2\u04e6"+
+    "\12\u0389\1\u04e6\1\u0389\1\u04e6\4\u0389\1\u04e6\10\u0389\1\u04e6"+
+    "\11\u0389\1\u04e6\5\u0389\10\u01af\1\u02b9\3\u01af\1\243\7\u01af"+
+    "\1\243\3\u01af\4\243\2\u01af\1\u02ba\4\u01af\2\243\5\u01af"+
+    "\2\243\2\u01af\2\243\12\u01af\1\243\1\u01af\1\243\4\u01af"+
+    "\1\243\10\u01af\1\243\11\u01af\1\243\5\u01af\2\u02be\1\u02bf"+
+    "\6\u02be\1\u01b4\2\u02be\1\u01b2\7\u02be\1\u01b2\3\u02be\4\u01b2"+
+    "\7\u02be\2\u01b2\5\u02be\2\u01b2\2\u02be\2\u01b2\12\u02be\1\u01b2"+
+    "\1\u02be\1\u01b2\4\u02be\1\u01b2\10\u02be\1\u01b2\11\u02be\1\u01b2"+
+    "\5\u02be\1\137\12\0\3\150\1\u04b7\2\150\1\0\3\150"+
+    "\2\0\3\150\1\u04e7\2\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\3\150\1\301\11\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u04e8\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\13\150\1\u04e9"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+    "\1\u04ea\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\150\1\u04eb\2\150\6\0\6\150\1\u04ec\5\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\1\150\1\u04ed\12\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\1\150\1\u04ee\12\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\1\150\1\u04ef"+
+    "\12\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\1\150\1\u04f0\12\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\1\u04f1\1\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u04f2\3\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u04f3"+
+    "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\u04f4\5\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\150\1\u04f5\2\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+    "\1\u04f6\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\2\150\1\u04f7\3\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\1\u04f8\5\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u04f9"+
+    "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\2\150\1\u04fa\1\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\3\150\1\u04fb\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\1\150\1\u04fc\1\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\1\0"+
+    "\1\u04fd\4\150\6\0\11\150\1\u04fe\2\150\1\137\2\150"+
+    "\3\0\5\150\1\u04ff\7\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+    "\1\u0500\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\u04c4\3\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\3\150\1\u0501\2\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\6\150\1\u0502\5\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\3\150\1\u0354\2\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\2\150\1\u0503\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\1\137\1\u0504\4\137\1\0\2\137\1\u0504\2\0\1\137"+
+    "\4\u0504\1\137\1\0\5\137\2\u0504\1\0\2\137\1\0"+
+    "\1\137\2\u0504\2\0\2\u0504\2\137\6\0\2\137\1\u0504"+
+    "\1\137\1\u0504\4\137\1\u0504\5\137\3\0\1\u0504\11\137"+
+    "\1\u0504\2\137\1\0\3\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\1\150\1\u0505\12\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+    "\1\u0506\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\3\150\1\u0507\2\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\u0508\3\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\4\150\1\u0509\7\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\6\150\1\u050a\5\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\u050b\3\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\6\150\1\u050c\5\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\1\150"+
+    "\1\u050d\1\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\13\150\1\u050e"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\1\150\1\u050f\1\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\3\150\1\u0510"+
+    "\11\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\3\150\1\u0511\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\150"+
+    "\1\u0512\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\3\150\1\u0513\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\3\150\1\u04c4\2\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\2\150\1\u0514\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\2\150"+
+    "\1\u0515\1\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\24\0\1\u0516\31\0\1\u0516\132\0\1\u03c7"+
+    "\125\0\1\u0517\146\0\1\u0518\117\0\1\u0519\131\0\1\316"+
+    "\144\0\1\u04c8\2\0\1\u04c9\75\0\1\u04cb\132\0\1\u051a"+
+    "\131\0\1\u051b\70\0\2\71\1\0\1\71\1\0\2\71"+
+    "\4\0\6\71\1\0\27\71\1\u023d\23\71\1\u023d\36\71"+
+    "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\47\71"+
+    "\1\u0110\21\71\1\u0110\20\71\1\0\1\71\1\0\2\71"+
+    "\4\0\4\71\1\u051c\1\71\1\0\51\71\1\u051c\36\71"+
+    "\20\0\1\u051d\20\0\1\u051d\70\0\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0361"+
+    "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\3\150\1\u0188\2\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\3\150\1\u051e\2\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\u0297\3\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\4\150\1\u0275\7\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\3\150\1\u051f\2\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\20\0\1\u0520"+
+    "\20\0\1\u0520\110\0\1\u0521\20\0\1\u0521\147\0\1\u0522"+
+    "\133\0\1\u0523\122\0\1\u0524\26\0\1\u0525\71\0\1\u0415"+
+    "\147\0\1\u0526\112\0\1\u0527\150\0\1\u0528\143\0\1\u0529"+
+    "\136\0\1\u052a\33\0\10\u0389\1\0\3\u0389\1\u052b\7\u0389"+
+    "\1\u052b\3\u0389\4\u052b\2\u0389\1\u0423\4\u0389\2\u052b\5\u0389"+
+    "\2\u052b\2\u0389\2\u052b\12\u0389\1\u052b\1\u0389\1\u052b\4\u0389"+
+    "\1\u052b\10\u0389\1\u052b\11\u0389\1\u052b\5\u0389\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u052c"+
+    "\5\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\150\1\u052d\2\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\u052e\3\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\1\u052f\1\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\3\150"+
+    "\1\u0530\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u0531\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\150\1\u0532\2\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\1\150\1\u0533\4\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\2\150\1\u0534\3\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u0535"+
+    "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\1\u0536\5\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\u0537\3\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\4\150\1\u0538"+
+    "\1\150\1\0\2\150\1\u0539\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\3\150\1\u053a\10\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\2\150\1\u04c4\1\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\6\150\1\u053b\5\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\150\1\u053c\2\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u053d\3\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\2\150\1\u053e\3\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\1\u053f\4\150\1\u0540\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\1\u0541\2\150\1\u0542\11\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\3\150\1\u0543"+
+    "\2\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\1\150\1\u0544\12\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\13\0\1\u0545"+
+    "\102\0\1\u0546\13\0\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\301\3\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0547"+
+    "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\4\150\1\u0548\1\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\3\150\1\u0549\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\150"+
+    "\1\u054a\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\3\150\1\u0188\10\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\1\137\1\u01d8\4\137"+
+    "\1\0\2\137\1\u01d8\2\0\1\137\4\u01d8\1\137\1\0"+
+    "\5\137\2\u01d8\1\0\2\137\1\0\1\137\2\u01d8\2\0"+
+    "\2\u01d8\2\137\6\0\2\137\1\u01d8\1\137\1\u01d8\4\137"+
+    "\1\u01d8\5\137\3\0\1\u01d8\11\137\1\u01d8\2\137\1\0"+
+    "\3\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\3\150\1\u054b\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\1\150\1\u054c\12\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\2\150"+
+    "\1\u02d4\11\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\2\150\1\u054d\3\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\2\150\1\u054e\3\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\1\150\1\u04c3\12\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\10\150\1\u054f\3\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0550\2\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\1\150\1\u0551\12\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\u0552\3\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0553"+
+    "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u0554"+
+    "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\11\150\1\u0555\2\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0556\4\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\2\150\1\u0557\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u01ca\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\3\150\1\u0558\11\150\1\0\2\150\21\0"+
+    "\1\u0559\145\0\1\u055a\172\0\1\u055b\125\0\1\316\74\0"+
+    "\1\u055c\153\0\1\u055d\52\0\2\71\1\0\1\71\1\0"+
+    "\2\71\4\0\6\71\1\0\1\71\1\u055e\34\71\1\u055e"+
+    "\51\71\21\0\1\u055f\110\0\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0560"+
+    "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\2\150\1\u0268\3\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\21\0\1\u0561\131\0\1\u0562\170\0\1\u037b"+
+    "\130\0\1\u0563\150\0\1\u0564\112\0\1\u0565\113\0\1\u0566"+
+    "\175\0\1\u037b\104\0\1\u0492\112\0\1\u0492\131\0\1\u0567"+
+    "\70\0\10\u0389\1\0\3\u0389\1\u02bc\7\u0389\1\u02bc\3\u0389"+
+    "\4\u02bc\2\u0389\1\u0423\4\u0389\2\u02bc\5\u0389\2\u02bc\2\u0389"+
+    "\2\u02bc\12\u0389\1\u02bc\1\u0389\1\u02bc\4\u0389\1\u02bc\10\u0389"+
+    "\1\u02bc\11\u0389\1\u02bc\5\u0389\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\2\150\1\u0568\2\0\4\150\6\0\6\150"+
+    "\1\u0569\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\4\150\1\u056a\7\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\1\150\1\u056b\4\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\2\150\1\u0539\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\3\150\1\u056c\11\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\2\150\1\u056d\3\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\4\150"+
+    "\1\u056e\7\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\2\150\1\u0433\11\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\10\150\1\u056f\3\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\1\150\1\u0570\1\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\1\u0571\5\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\u0572\3\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0573"+
+    "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\u0574\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\5\150\1\u0575\6\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u0576"+
+    "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\150\1\u0577\2\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\4\150\1\u0578\1\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\1\150\1\u0579\13\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\6\150\1\u057a\5\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u057b\3\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\1\u057c\13\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u057d\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\4\150\1\u057e\7\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\1\150\1\u057f\12\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\u0580\5\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\4\150\1\u0175\7\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\41\0\1\u0581"+
+    "\132\0\1\u0582\67\0\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\1\150\1\u0583\12\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150"+
+    "\1\u0584\4\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\2\150\1\u0585\3\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0586\2\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u0397"+
+    "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u0587\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0588"+
+    "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\3\150\1\u0589\11\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\1\150\1\u058a\12\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u058b"+
+    "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\1\150\1\u058c\4\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\1\u058d\14\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\u058e\3\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\2\150\1\u058f\3\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\u0590\3\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u0591\3\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\6\150\1\u0592\5\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\150\1\u0593\2\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\41\0\1\u0594\150\0"+
+    "\1\u0519\131\0\1\u0595\113\0\1\u0596\67\0\2\71\1\0"+
+    "\1\71\1\0\2\71\4\0\6\71\1\0\35\71\1\u0110"+
+    "\32\71\1\u0110\17\71\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\14\150\1\u04d8\1\0\2\150\53\0\1\u0597\134\0"+
+    "\1\u0598\114\0\1\u0599\146\0\1\u059a\154\0\1\u059b\30\0"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\2\150\1\u0433"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\2\150\1\u0532\1\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\u059c\3\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\2\150\1\u059d\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\150\1\u059e\2\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\2\150\1\u0539\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u059f"+
+    "\5\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\150\1\u05a0\2\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\1\150\1\u05a1\12\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u05a2"+
+    "\5\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\3\150\1\u05a3\2\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\1\0\1\u05a4\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u05a5"+
+    "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\4\150\1\u05a6\7\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\u05a7\3\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u05a8"+
+    "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\2\150\1\u05a9\1\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\2\150\1\u05aa\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\4\150\1\u05ab"+
+    "\1\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\150\1\u05ac\2\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\1\150\1\u05ad\4\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\1\150\1\u05ae\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\4\150\1\u05af\7\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\3\150\1\u05b0\2\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\6\150\1\u05b1\5\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\57\0\1\u05b2\146\0\1\u05b3\35\0\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u05b4"+
+    "\5\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\u05b5\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\150\1\u05b6\2\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\3\150"+
+    "\1\u05b7\2\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\u056d\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\4\150\1\u056d\7\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\u05b8\3\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\1\150\1\u0451\4\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\u05b9\3\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\10\150\1\u05ba"+
+    "\3\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\1\150\1\u05bb\4\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\2\150\1\u05bc\1\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\u05bd"+
+    "\13\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\2\150\1\u05be\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\u05bf\3\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\u05c0\3\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\4\150"+
+    "\1\u05c1\7\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\105\0\1\u05c2\102\0\1\u05c3\17\0\1\u05c4\74\0\1\u05c5"+
+    "\146\0\1\u05c6\133\0\1\u059a\130\0\1\u037b\144\0\1\u037b"+
+    "\130\0\1\u05c7\40\0\1\137\12\0\6\150\1\0\2\150"+
+    "\1\u05c8\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\2\150\1\u05c9\1\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\3\150\1\u05ca\2\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\2\150\1\u05cb\1\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+    "\1\u04c4\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\u05cc\5\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\3\150\1\u05cd\10\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\4\150\1\u02e1\7\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\13\0\1\u05ce\102\0\1\u05cf\13\0\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\10\150\1\u05d0\3\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\u05d1\3\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\2\150\1\u056d\11\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\6\150\1\u05d2\5\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\u05d3\3\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\3\150\1\u05d4\2\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\2\150\1\u05d5"+
+    "\1\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\2\150\1\u0587\3\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\u05d6\3\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u05d7"+
+    "\5\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\u05d8\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\6\150\1\u05d9\5\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\2\150\1\u05da\1\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\41\0\1\u05db\147\0\1\u05dc\52\0\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\3\150"+
+    "\1\u0354\10\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\3\150\1\u05dd\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\3\150\1\u05de\2\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u05df"+
+    "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\2\150\1\u05e0\3\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\1\150\1\u056d\4\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u0530"+
+    "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u05e1\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\2\150\1\u05e2"+
+    "\11\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\1\150\1\u05bc\12\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\1\150\1\u05e3\1\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\2\150"+
+    "\1\u05e4\11\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\2\150\1\u05e5\11\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\1\u05e6\13\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\73\0\1\u04cb\77\0"+
+    "\1\u03d0\132\0\1\u04cb\130\0\1\u0527\164\0\1\u0492\35\0"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\2\150\1\u05e7\1\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\1\150\1\u05e8\12\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u05e9"+
+    "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\1\150\1\u05ea\2\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u05a7\2\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\3\150\1\u05eb\10\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\37\0\1\u05ec\134\0\1\u05ed\67\0\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\6\150\1\u05ee\5\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\3\150\1\u05ef\10\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\150"+
+    "\1\u05f0\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\5\150\1\u05f1\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\1\150\1\u05f2\12\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\u05f3\3\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+    "\1\u05f4\2\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\10\150\1\u05dd\3\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\3\150\1\u05f5\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\2\150\1\u05f6\3\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\2\150\1\u05f7\11\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\56\0\1\u05f8\112\0"+
+    "\1\u05f9\72\0\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\u05fa\3\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u03a2\3\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\3\150\1\u05fb\2\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\1\u05fc\13\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\150\1\u05fd\2\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\2\150\1\u05fe\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\1\150\1\u05ff\12\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\1\150\1\u0600"+
+    "\4\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\1\150\1\u0601\13\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\1\150\1\u0602\1\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0603"+
+    "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u0604"+
+    "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\12\150\1\u04c4\1\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\1\150\1\u0433\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150"+
+    "\1\u0605\4\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\1\150\1\u0606\12\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\43\0\1\u0607\164\0\1\u0608"+
+    "\33\0\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\3\150\1\u0609\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\2\150\1\u060a\3\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150"+
+    "\1\u05e2\2\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\1\u060b\13\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\1\u060c\5\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\1\150"+
+    "\1\u060d\4\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\2\150\1\u060e\11\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\3\150\1\u05e2\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\150"+
+    "\1\u060f\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\u0610\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\106\0\1\u0611\23\0\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0530"+
+    "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\3\150\1\u0612\2\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\1\150\1\u0613\12\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\1\u0614\1\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\1\150\1\u01ca\4\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\5\150\1\u0575\6\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u0615\5\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\2\150"+
+    "\1\u0616\1\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\3\150\1\u0617\10\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\6\150"+
+    "\1\u0618\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\3\150\1\u04af\2\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\10\150\1\u0619\3\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\6\150\1\u061a\5\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u053a\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\61\0\1\u061b\144\0\1\u061c"+
+    "\35\0\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\3\150\1\u060a\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\6\150\1\u061d\5\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150"+
+    "\1\u061e\4\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\3\150\1\u061f\2\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\2\150\1\u0620\1\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\1\u053f\5\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u060e\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0621\4\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\70\0"+
+    "\1\u0622\41\0\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\6\150\1\u0623\5\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\2\150"+
+    "\1\u04c4\11\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\1\u0624\5\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\3\150\1\u0613\2\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\150\1\u0625\2\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\1\u0626\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\3\150\1\u0627\2\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\1\u047c\3\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\2\150\1\u0451\3\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\56\0\1\u0628\144\0\1\u0629\40\0\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\1\150\1\u04b2\12\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\u062a\3\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\2\150\1\u062b"+
+    "\11\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+    "\1\u062c\2\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\1\0\1\u062d\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\41\0\1\u062e\70\0\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\2\150\1\u062f\3\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137";
+
+  private static final String ZZ_TRANS_PACKED_1 =
+    "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0630"+
+    "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\3\150"+
+    "\1\u0631\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u0632\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\7\150\1\u04c4"+
+    "\4\150\1\137\2\150\3\0\15\150\1\0\2\150\41\0"+
+    "\1\u05f8\162\0\1\u0633\37\0\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\1\150\1\u0634\2\150\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\3\150"+
+    "\1\u056d\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\3\150\1\u0635\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\15\0\1\u0636\140\0\1\u0637\105\0"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\6\150\1\u0638\5\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\14\150\1\u0587\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\3\150\1\u0639\6\0"+
+    "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+    "\1\u063a\2\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\56\0\1\u063b\53\0\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\2\150"+
+    "\1\u063c\11\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\3\150\1\u063d\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\56\0\1\u063e\150\0\1\u063f\34\0\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+    "\1\u0640\2\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\10\150\1\u0641\4\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u0642"+
+    "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\13\0\1\u0643\16\0\1\u0644\77\0\1\137\12\0\6\150"+
+    "\1\0\1\150\1\u04fc\1\150\2\0\6\150\1\0\1\u0155"+
+    "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\1\137\12\0\1\150\1\u0645\4\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\72\0\1\u0646\133\0\1\u0647\35\0"+
+    "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+    "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\2\150\1\u0648\1\150\6\0\14\150\1\137\2\150\3\0"+
+    "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+    "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\1\u0649\3\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\6\150"+
+    "\1\u064a\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\74\0\1\u064b\115\0\1\u064c\51\0\1\137\12\0\6\150"+
+    "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+    "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\u064d"+
+    "\13\150\1\137\2\150\3\0\15\150\1\0\2\150\76\0"+
+    "\1\u064e\111\0\1\u064f\53\0\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0650"+
+    "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+    "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+    "\1\150\1\u0651\4\150\1\0\1\137\1\150\1\0\3\150"+
+    "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+    "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\1\150\1\u0652\12\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\40\0\1\u0653\162\0"+
+    "\1\u0654\40\0\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\1\150\1\u0655\2\150\6\0\14\150\1\137"+
+    "\2\150\3\0\15\150\1\0\2\150\40\0\1\u0656\164\0"+
+    "\1\u0657\36\0\1\137\12\0\6\150\1\0\3\150\2\0"+
+    "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+    "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+    "\14\150\1\u0658\1\0\2\150\1\137\12\0\6\150\1\0"+
+    "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+    "\1\150\1\0\3\150\2\0\3\150\1\u04ba\6\0\14\150"+
+    "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150"+
+    "\1\u056d\2\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\76\0\1\u0659\127\0\1\u065a\35\0\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150"+
+    "\1\u043d\2\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+    "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+    "\2\150\56\0\1\u065b\114\0\1\u065c\70\0\1\137\12\0"+
+    "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+    "\1\0\1\137\1\150\1\0\3\150\2\0\1\u065d\3\150"+
+    "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+    "\73\0\1\u0628\135\0\1\u05f8\126\0\1\u065e\133\0\1\u065f"+
+    "\33\0\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+    "\1\0\1\u0155\1\150\1\u04c4\4\150\1\0\1\137\1\150"+
+    "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+    "\3\0\15\150\1\0\2\150\41\0\1\u0660\161\0\1\u0661"+
+    "\115\0\1\u0662\116\0\1\u0663\107\0\1\u0664\234\0\1\u0665"+
+    "\113\0\1\u0666\103\0\1\u0667\145\0\1\u05db\100\0\1\u0668"+
+    "\161\0\1\u0669\117\0\1\u066a\127\0\1\u066b\113\0\1\u05f8"+
+    "\71\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[136440];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_1, 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 =
+    "\6\0\2\1\1\0\2\1\1\0\2\1\14\0\1\1"+
+    "\3\0\2\1\1\11\4\1\1\11\5\1\1\11\2\1"+
+    "\2\11\2\1\4\11\1\1\1\11\1\1\1\11\26\1"+
+    "\1\11\2\1\2\11\1\1\5\11\1\1\1\11\2\1"+
+    "\1\11\2\1\1\11\1\1\2\11\14\1\1\11\7\1"+
+    "\1\11\11\1\2\11\2\1\2\11\2\1\1\11\6\1"+
+    "\1\11\1\1\1\11\2\1\1\11\7\1\1\11\43\1"+
+    "\1\11\10\1\2\11\4\1\2\11\1\1\2\11\5\1"+
+    "\3\11\4\1\4\11\1\1\1\11\6\1\4\11\1\1"+
+    "\3\11\6\1\2\11\5\0\1\11\105\1\1\11\2\0"+
+    "\1\1\1\0\1\1\1\11\1\0\74\1\1\11\2\1"+
+    "\1\0\1\11\10\0\2\11\20\0\1\1\1\11\2\1"+
+    "\1\0\1\11\30\1\1\11\32\1\1\11\4\0\1\11"+
+    "\3\1\1\0\1\11\1\1\15\0\1\1\1\0\1\11"+
+    "\5\0\1\1\2\11\3\1\1\11\1\0\1\11\1\0"+
+    "\1\11\4\0\101\1\1\11\1\0\1\1\1\0\3\1"+
+    "\1\0\70\1\40\0\1\11\1\1\1\0\3\1\1\0"+
+    "\72\1\4\0\3\1\25\0\2\1\2\11\2\0\44\1"+
+    "\1\0\1\11\46\1\1\0\1\11\3\0\1\1\1\0"+
+    "\1\11\2\0\1\1\10\0\1\11\15\0\64\1\2\0"+
+    "\4\1\23\0\2\1\2\0\24\1\1\0\27\1\35\0"+
+    "\60\1\2\0\2\1\16\0\14\1\1\0\17\1\24\0"+
+    "\61\1\12\0\4\1\1\0\6\1\4\0\1\1\6\0"+
+    "\27\1\1\0\30\1\6\0\1\1\1\0\2\1\13\0"+
+    "\32\1\2\0\22\1\1\11\4\0\1\1\1\11\1\1"+
+    "\2\11\5\0\31\1\2\0\21\1\10\0\10\1\1\0"+
+    "\15\1\2\0\16\1\3\0\1\11\2\0\6\1\2\0"+
+    "\13\1\2\0\17\1\2\0\12\1\1\11\1\0\15\1"+
+    "\2\0\10\1\1\0\11\1\2\0\5\1\1\0\5\1"+
+    "\2\0\3\1\2\0\4\1\1\0\2\1\2\0\3\1"+
+    "\1\0\2\1\2\0\3\1\2\0\1\1\2\0\3\1"+
+    "\2\0\1\1\2\0\3\1\2\0\1\1\2\0\1\1"+
+    "\4\0\1\1\2\0\1\1\13\0";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[1643];
+    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;
+
+  /* user code: */
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	private static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	private static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to JSPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed HTML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	private static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to JSPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code><script></code> tag.
+	 */
+	private static final int INTERNAL_INTAG_SCRIPT			= -4;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * script tag.
+	 */
+	private static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * script tag.
+	 */
+	private static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+	/**
+	 * Token type specifying that the user has
+	 * ended a line with an unclosed <code><style></code> tag.
+	 */
+	private static final int INTERNAL_INTAG_STYLE			= -7;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * style tag.
+	 */
+	private static final int INTERNAL_ATTR_DOUBLE_QUOTE_STYLE = -8;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * style tag.
+	 */
+	private static final int INTERNAL_ATTR_SINGLE_QUOTE_STYLE = -9;
+
+	/**
+	 * Token type specifying we're in a JSP hidden comment ("<%-- ... --%>").
+	 */
+	private static final int INTERNAL_IN_HIDDEN_COMMENT		= -10;
+
+	/**
+	 * Token type specifying we're in a JSP directive (either include, page
+	 * or taglib).
+	 */
+	private static final int INTERNAL_IN_JSP_DIRECTIVE			= -11;
+
+	/**
+	 * Token type specifying we're in JavaScript.
+	 */
+	private static final int INTERNAL_IN_JS					= -12;
+
+	/**
+	 * Token type specifying we're in a JavaScript multi-line comment.
+	 */
+	private static final int INTERNAL_IN_JS_MLC				= -13;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	private static final int INTERNAL_IN_JS_STRING_INVALID	= -14;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	private static final int INTERNAL_IN_JS_STRING_VALID		= -15;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	private static final int INTERNAL_IN_JS_CHAR_INVALID	= -16;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	private static final int INTERNAL_IN_JS_CHAR_VALID		= -17;
+
+	/**
+	 * Internal type denoting a line ending in CSS.
+	 */
+	private static final int INTERNAL_CSS					= -18;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property.
+	 */
+	private static final int INTERNAL_CSS_PROPERTY			= -19;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property value.
+	 */
+	private static final int INTERNAL_CSS_VALUE				= -20;
+
+	/**
+	 * Internal type denoting line ending in a CSS double-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	private static final int INTERNAL_CSS_STRING				= -(1<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS single-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	private static final int INTERNAL_CSS_CHAR				= -(2<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS multi-line comment.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	private static final int INTERNAL_CSS_MLC				= -(3<<11);
+
+	/**
+	 * Token type specifying we're in a Java documentation comment.
+	 */
+	private static final int INTERNAL_IN_JAVA_DOCCOMMENT		= -(4<<11);
+
+	/**
+	 * Token type specifying we're in Java code.
+	 */
+	private static final int INTERNAL_IN_JAVA_EXPRESSION		= -(5<<11);
+
+	/**
+	 * Token type specifying we're in Java multiline comment.
+	 */
+	private static final int INTERNAL_IN_JAVA_MLC			= -(6<<11);
+
+	/**
+	 * The state previous CSS-related state we were in before going into a CSS
+	 * string, multi-line comment, etc.
+	 */
+	private int cssPrevState;
+
+	/**
+	 * The state JSP was started in (YYINITIAL, INTERNAL_IN_JS, etc.).
+	 */
+	private int jspInState;
+
+	/**
+	 * Whether closing markup tags are automatically completed for JSP.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+	/**
+	 * Language state set on HTML tokens.  Must be 0.
+	 */
+	private static final int LANG_INDEX_DEFAULT = 0;
+
+	/**
+	 * Language state set on JavaScript tokens.
+	 */
+	private static final int LANG_INDEX_JS = 1;
+
+	/**
+	 * Language state set on CSS tokens.
+	 */
+	private static final int LANG_INDEX_CSS = 2;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public JSPTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * 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;
+		jspInState = YYINITIAL; // Shouldn't be necessary
+		cssPrevState = CSS; // Shouldn't be necessary
+		int languageIndex = 0;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.MARKUP_COMMENT:
+				state = COMMENT;
+				break;
+			case Token.PREPROCESSOR:
+				state = PI;
+				break;
+			case Token.VARIABLE:
+				state = DTD;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				break;
+			case INTERNAL_INTAG_STYLE:
+				state = INTAG_STYLE;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_STYLE:
+				state = INATTR_DOUBLE_STYLE;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_STYLE:
+				state = INATTR_SINGLE_STYLE;
+				break;
+			case INTERNAL_IN_HIDDEN_COMMENT:
+				state = HIDDEN_COMMENT;
+				break;
+			case INTERNAL_IN_JSP_DIRECTIVE:
+				state = JSP_DIRECTIVE;
+				break;
+			case INTERNAL_IN_JS:
+				state = JAVASCRIPT;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = false;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = true;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = false;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = true;
+				break;
+			case INTERNAL_CSS:
+				state = CSS;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			case INTERNAL_CSS_PROPERTY:
+				state = CSS_PROPERTY;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			case INTERNAL_CSS_VALUE:
+				state = CSS_VALUE;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			default:
+				if (initialTokenType<-1024) {
+					// INTERNAL_IN_JAVAxxx - jspInState or
+					// INTERNAL_IN_CSSxxx - cssPrevState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_JAVA_DOCCOMMENT:
+							state = JAVA_DOCCOMMENT;
+							jspInState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_IN_JAVA_EXPRESSION:
+							state = JAVA_EXPRESSION;
+							jspInState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_IN_JAVA_MLC:
+							state = JAVA_MLC;
+							jspInState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_CSS_STRING:
+							state = CSS_STRING;
+							languageIndex = LANG_INDEX_CSS;
+							cssPrevState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_CSS_CHAR:
+							state = CSS_CHAR_LITERAL;
+							languageIndex = LANG_INDEX_CSS;
+							cssPrevState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_CSS_MLC:
+							state = CSS_C_STYLE_COMMENT;
+							languageIndex = LANG_INDEX_CSS;
+							cssPrevState = -initialTokenType&0xff;
+							break;
+					}
+				}
+				else {
+					state = Token.NULL;
+				}
+				break;
+		}
+
+		setLanguageIndex(languageIndex);
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 JSPTokenMaker(java.io.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 JSPTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 196) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 65: 
+          { addToken(Token.OPERATOR); yybegin(CSS_VALUE);
+          }
+        case 130: break;
+        case 86: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 131: break;
+        case 74: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+          }
+        case 132: break;
+        case 23: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT);
+          }
+        case 133: break;
+        case 10: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD);
+          }
+        case 134: break;
+        case 61: 
+          { addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY);
+          }
+        case 135: break;
+        case 111: 
+          { start = zzMarkedPos-4; yybegin(HIDDEN_COMMENT);
+          }
+        case 136: break;
+        case 4: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+          }
+        case 137: break;
+        case 124: 
+          { addToken(Token.RESERVED_WORD_2);
+          }
+        case 138: break;
+        case 104: 
+          { addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState);
+          }
+        case 139: break;
+        case 101: 
+          { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT);
+          }
+        case 140: break;
+        case 41: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+          }
+        case 141: break;
+        case 5: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 142: break;
+        case 125: 
+          { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+          }
+        case 143: break;
+        case 103: 
+          { addToken(Token.REGEX);
+          }
+        case 144: break;
+        case 42: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+          }
+        case 145: break;
+        case 129: 
+          { int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+							  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 146: break;
+        case 117: 
+          { addToken(Token.FUNCTION);
+          }
+        case 147: break;
+        case 93: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos;
+          }
+        case 148: break;
+        case 8: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+          }
+        case 149: break;
+        case 36: 
+          { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 150: break;
+        case 57: 
+          { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING);
+          }
+        case 151: break;
+        case 52: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 152: break;
+        case 20: 
+          { /* Allowing JSP expressions, etc. */
+          }
+        case 153: break;
+        case 26: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_STYLE);
+          }
+        case 154: break;
+        case 119: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+3, Token.MARKUP_COMMENT);
+          }
+        case 155: break;
+        case 89: 
+          { /* Skip all escaped chars. */
+          }
+        case 156: break;
+        case 83: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL);
+          }
+        case 157: break;
+        case 29: 
+          { yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 158: break;
+        case 116: 
+          { if(JavaScriptTokenMaker.isJavaScriptCompatible("1.6")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+          }
+        case 159: break;
+        case 109: 
+          { if(JavaScriptTokenMaker.isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+          }
+        case 160: break;
+        case 66: 
+          { /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER);
+          }
+        case 161: break;
+        case 17: 
+          { /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG);
+          }
+        case 162: break;
+        case 28: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(CSS, LANG_INDEX_CSS);
+          }
+        case 163: break;
+        case 75: 
+          { addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState);
+          }
+        case 164: break;
+        case 27: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_STYLE);
+          }
+        case 165: break;
+        case 54: 
+          { addToken(Token.IDENTIFIER); /* Needed as InTagIdentifier ignores it. */
+          }
+        case 166: break;
+        case 7: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+          }
+        case 167: break;
+        case 91: 
+          { /* Invalid latin-1 character \xXX */ validJSString = false;
+          }
+        case 168: break;
+        case 25: 
+          { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 169: break;
+        case 37: 
+          { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+          }
+        case 170: break;
+        case 114: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 171: break;
+        case 47: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken;
+          }
+        case 172: break;
+        case 110: 
+          { start = zzMarkedPos-3; yybegin(JAVA_DOCCOMMENT);
+          }
+        case 173: break;
+        case 80: 
+          { start = zzMarkedPos-2; yybegin(PI);
+          }
+        case 174: break;
+        case 126: 
+          { yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+						  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+						  addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+						  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 175: break;
+        case 62: 
+          { /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER);
+          }
+        case 176: break;
+        case 9: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+          }
+        case 177: break;
+        case 77: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+									yybegin(INTAG_CHECK_TAG_NAME);
+          }
+        case 178: break;
+        case 73: 
+          { /* Skip escaped chars. */
+          }
+        case 179: break;
+        case 90: 
+          { /* Invalid Unicode character \\uXXXX */ validJSString = false;
+          }
+        case 180: break;
+        case 123: 
+          { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-5,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; cssPrevState = zzLexicalState; yybegin(INTAG_STYLE);
+          }
+        case 181: break;
+        case 94: 
+          { yybegin(JAVA_EXPRESSION); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION);
+          }
+        case 182: break;
+        case 81: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION);
+          }
+        case 183: break;
+        case 92: 
+          { yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 184: break;
+        case 78: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION);
+          }
+        case 185: break;
+        case 31: 
+          { addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 186: break;
+        case 39: 
+          { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 187: break;
+        case 44: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_HIDDEN_COMMENT); return firstToken;
+          }
+        case 188: break;
+        case 12: 
+          { addToken(Token.OPERATOR);
+          }
+        case 189: break;
+        case 68: 
+          { addToken(Token.OPERATOR); yybegin(CSS_PROPERTY);
+          }
+        case 190: break;
+        case 48: 
+          { addToken(Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken;
+          }
+        case 191: break;
+        case 112: 
+          { start = zzMarkedPos-4; yybegin(COMMENT);
+          }
+        case 192: break;
+        case 107: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT);
+          }
+        case 193: break;
+        case 102: 
+          { addToken(Token.VARIABLE);
+          }
+        case 194: break;
+        case 55: 
+          { /*System.out.println("CSS: " + yytext());*/ addToken(Token.IDENTIFIER);
+          }
+        case 195: break;
+        case 97: 
+          { start = zzMarkedPos-2; yybegin(JAVA_MLC);
+          }
+        case 196: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 197: break;
+        case 122: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 198: break;
+        case 24: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JAVASCRIPT, LANG_INDEX_JS);
+          }
+        case 199: break;
+        case 96: 
+          { addToken(Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken;
+          }
+        case 200: break;
+        case 118: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 201: break;
+        case 64: 
+          { addToken(Token.SEPARATOR); yybegin(CSS);
+          }
+        case 202: break;
+        case 128: 
+          { yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 203: break;
+        case 32: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING);
+          }
+        case 204: break;
+        case 45: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JAVA_DOCCOMMENT - jspInState); return firstToken;
+          }
+        case 205: break;
+        case 72: 
+          { addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState);
+          }
+        case 206: break;
+        case 63: 
+          { addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+          }
+        case 207: break;
+        case 51: 
+          { addToken(Token.ERROR_STRING_DOUBLE);
+          }
+        case 208: break;
+        case 40: 
+          { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+          }
+        case 209: break;
+        case 106: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JSP_DIRECTIVE);
+          }
+        case 210: break;
+        case 33: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR);
+          }
+        case 211: break;
+        case 120: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos;
+          }
+        case 212: break;
+        case 85: 
+          { start = zzMarkedPos-2; yybegin(JS_MLC);
+          }
+        case 213: break;
+        case 88: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 214: break;
+        case 70: 
+          { int temp = zzMarkedPos - 2;
+						  addToken(zzStartRead, temp, Token.FUNCTION);
+						  addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+						  zzStartRead = zzCurrentPos = zzMarkedPos;
+          }
+        case 215: break;
+        case 99: 
+          { yybegin(JAVA_EXPRESSION); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 216: break;
+        case 50: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JAVA_MLC - jspInState); return firstToken;
+          }
+        case 217: break;
+        case 49: 
+          { addToken(Token.ANNOTATION);
+          }
+        case 218: break;
+        case 30: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 219: break;
+        case 67: 
+          { addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+          }
+        case 220: break;
+        case 113: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos;
+          }
+        case 221: break;
+        case 6: 
+          { addToken(Token.MARKUP_ENTITY_REFERENCE);
+          }
+        case 222: break;
+        case 115: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 223: break;
+        case 18: 
+          { /* Shouldn't happen */ yypushback(1); yybegin(INTAG);
+          }
+        case 224: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 225: break;
+        case 56: 
+          { addEndToken(INTERNAL_CSS); return firstToken;
+          }
+        case 226: break;
+        case 127: 
+          { yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 227: break;
+        case 58: 
+          { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL);
+          }
+        case 228: break;
+        case 53: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 229: break;
+        case 98: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); start = zzMarkedPos; yybegin(jspInState);
+          }
+        case 230: break;
+        case 13: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+          }
+        case 231: break;
+        case 100: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 232: break;
+        case 16: 
+          { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 233: break;
+        case 59: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 234: break;
+        case 46: 
+          { addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken;
+          }
+        case 235: break;
+        case 35: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 236: break;
+        case 105: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-2); //yypushback(count-2);
+									yybegin(INTAG_CHECK_TAG_NAME);
+          }
+        case 237: break;
+        case 71: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+          }
+        case 238: break;
+        case 69: 
+          { /* End of a function */ addToken(Token.SEPARATOR);
+          }
+        case 239: break;
+        case 19: 
+          { addToken(Token.MARKUP_TAG_NAME);
+          }
+        case 240: break;
+        case 11: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 241: break;
+        case 121: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos;
+          }
+        case 242: break;
+        case 84: 
+          { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT);
+          }
+        case 243: break;
+        case 38: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+          }
+        case 244: break;
+        case 87: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 245: break;
+        case 14: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+          }
+        case 246: break;
+        case 108: 
+          { boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+          }
+        case 247: break;
+        case 95: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 248: break;
+        case 76: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+          }
+        case 249: break;
+        case 15: 
+          { addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 250: break;
+        case 34: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 251: break;
+        case 79: 
+          { start = zzMarkedPos-2; yybegin(DTD);
+          }
+        case 252: break;
+        case 82: 
+          { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION);
+          }
+        case 253: break;
+        case 21: 
+          { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG);
+          }
+        case 254: break;
+        case 22: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT);
+          }
+        case 255: break;
+        case 43: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 256: break;
+        case 60: 
+          { /* Unknown pseudo class */ addToken(Token.DATA_TYPE);
+          }
+        case 257: break;
+        case 1: 
+          { 
+          }
+        case 258: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case INATTR_SINGLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 1644: break;
+            case JS_CHAR: {
+              addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 1645: break;
+            case JAVA_EXPRESSION: {
+              addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken;
+            }
+            case 1646: break;
+            case CSS_STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+            }
+            case 1647: break;
+            case HIDDEN_COMMENT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_HIDDEN_COMMENT); return firstToken;
+            }
+            case 1648: break;
+            case JS_MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+            }
+            case 1649: break;
+            case CSS_CHAR_LITERAL: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+            }
+            case 1650: break;
+            case JAVA_DOCCOMMENT: {
+              yybegin(JAVA_EXPRESSION); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JAVA_DOCCOMMENT - jspInState); return firstToken;
+            }
+            case 1651: break;
+            case INTAG_SCRIPT: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken;
+            }
+            case 1652: break;
+            case CSS_PROPERTY: {
+              addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+            }
+            case 1653: break;
+            case CSS_C_STYLE_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+            }
+            case 1654: break;
+            case CSS: {
+              addEndToken(INTERNAL_CSS); return firstToken;
+            }
+            case 1655: break;
+            case CSS_VALUE: {
+              addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+            }
+            case 1656: break;
+            case JSP_DIRECTIVE: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_IN_JSP_DIRECTIVE); return firstToken;
+            }
+            case 1657: break;
+            case COMMENT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+            }
+            case 1658: break;
+            case INATTR_DOUBLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 1659: break;
+            case PI: {
+              addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+            }
+            case 1660: break;
+            case JAVASCRIPT: {
+              addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 1661: break;
+            case INTAG: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 1662: break;
+            case INTAG_CHECK_TAG_NAME: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 1663: break;
+            case INATTR_SINGLE_STYLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_STYLE); return firstToken;
+            }
+            case 1664: break;
+            case DTD: {
+              addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+            }
+            case 1665: break;
+            case JS_EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 1666: break;
+            case INATTR_DOUBLE_STYLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_STYLE); return firstToken;
+            }
+            case 1667: break;
+            case INATTR_SINGLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+            }
+            case 1668: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 1669: break;
+            case INATTR_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+            }
+            case 1670: break;
+            case JS_STRING: {
+              addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 1671: break;
+            case JAVA_MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JAVA_MLC - jspInState); return firstToken;
+            }
+            case 1672: break;
+            case INTAG_STYLE: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_STYLE); return firstToken;
+            }
+            case 1673: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.flex
new file mode 100644
index 0000000..140fffb
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.flex
@@ -0,0 +1,888 @@
+/*
+ * 02/05/2012
+ *
+ * JavaScriptTokenMaker.java - Parses a document into JavaScript tokens.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for JavaScript files.  Its states could be simplified, but are
+ * kept the way they are to keep a degree of similarity (i.e. copy/paste)
+ * between it and HTML/JSP/PHPTokenMaker.  This should cause no difference in
+ * performance.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated JavaScriptTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+%%
+
+%public
+%class JavaScriptTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	private static final int INTERNAL_IN_JS_MLC				= -8;
+
+	/**
+	 * Token type specifying we're in a JavaScript documentation comment.
+	 */
+	private static final int INTERNAL_IN_JS_COMMENT_DOCUMENTATION = -9;
+	
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	private static final int INTERNAL_IN_JS_STRING_INVALID	= -10;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	private static final int INTERNAL_IN_JS_STRING_VALID		= -11;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	private static final int INTERNAL_IN_JS_CHAR_INVALID	= -12;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	private static final int INTERNAL_IN_JS_CHAR_VALID		= -13;
+
+	private static final int INTERNAL_E4X = -14;
+
+	private static final int INTERNAL_E4X_INTAG = -15;
+
+	private static final int INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION = -16;
+
+	private static final int INTERNAL_IN_E4X_COMMENT = -17;
+
+	private static final int INTERNAL_E4X_DTD = -18;
+
+	private static final int INTERNAL_E4X_DTD_INTERNAL = -19;
+
+	private static final int INTERNAL_E4X_ATTR_SINGLE = -20;
+
+	private static final int INTERNAL_E4X_ATTR_DOUBLE = -21;
+
+	private static final int INTERNAL_E4X_MARKUP_CDATA = -22;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+	/**
+	 * Whether we're in an internal DTD.  Only valid if in an e4x DTD.
+	 */
+	private boolean e4x_inInternalDtd;
+
+	/**
+	 * The previous e4x state.  Only valid if in an e4x state.
+	 */
+	private int e4x_prevState;
+
+	/**
+	 * The version of JavaScript being highlighted.
+	 */
+	private static String jsVersion;
+
+	/**
+	 * Whether e4x is being highlighted.
+	 */
+	private static boolean e4xSupported;
+
+	/**
+	 * Language state set on JS tokens.  Must be 0.
+	 */
+	private static final int LANG_INDEX_DEFAULT	= 0;
+
+	/**
+	 * Language state set on E4X tokens.
+	 */
+	private static final int LANG_INDEX_E4X = 1;
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public JavaScriptTokenMaker() {
+		super();
+	}
+
+
+	static {
+		jsVersion = "1.0";
+		e4xSupported = true;
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the closest {@link TokenTypes "standard" token type} for a given
+	 * "internal" token type (e.g. one whose value is <code>< 0</code>).
+	 * 
+	 */
+	public int getClosestStandardTokenTypeForInternalType(int type) {
+		switch (type) {
+			case INTERNAL_IN_JS_MLC:
+				return TokenTypes.COMMENT_MULTILINE;
+			case INTERNAL_IN_JS_COMMENT_DOCUMENTATION:
+				return TokenTypes.COMMENT_DOCUMENTATION;
+			case INTERNAL_IN_JS_STRING_INVALID:
+			case INTERNAL_IN_JS_STRING_VALID:
+			case INTERNAL_IN_JS_CHAR_INVALID:
+			case INTERNAL_IN_JS_CHAR_VALID:
+				return TokenTypes.LITERAL_STRING_DOUBLE_QUOTE;
+		}
+		return type;
+	}
+
+
+	/**
+	 * Returns the JavaScript version being highlighted.
+	 *
+	 * @return Supported JavaScript version.
+	 * @see #isJavaScriptCompatible(String)
+	 */
+	public static String getJavaScriptVersion() {
+		return jsVersion;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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;
+		validJSString = true;
+		e4x_prevState = YYINITIAL;
+		e4x_inInternalDtd = false;
+		int languageIndex = LANG_INDEX_DEFAULT;
+
+		// Start off in the proper state.
+		int state = YYINITIAL;
+		switch (initialTokenType) {
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				break;
+			case INTERNAL_IN_JS_COMMENT_DOCUMENTATION:
+				state = JS_DOCCOMMENT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				validJSString = false;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				validJSString = false;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				break;
+			case INTERNAL_E4X:
+				state = E4X;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			case INTERNAL_E4X_INTAG:
+				state = E4X_INTAG;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			case INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION:
+				state = E4X_PI;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			case INTERNAL_E4X_DTD:
+				state = E4X_DTD;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			case INTERNAL_E4X_DTD_INTERNAL:
+				state = E4X_DTD;
+				e4x_inInternalDtd = true;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			case INTERNAL_E4X_ATTR_SINGLE:
+				state = E4X_INATTR_SINGLE;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			case INTERNAL_E4X_ATTR_DOUBLE:
+				state = E4X_INATTR_DOUBLE;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			case INTERNAL_E4X_MARKUP_CDATA:
+				state = E4X_CDATA;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_E4X_COMMENT - prevState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_E4X_COMMENT:
+							state = E4X_COMMENT;
+							break;
+					}
+					e4x_prevState = -initialTokenType&0xff;
+					languageIndex = LANG_INDEX_E4X;
+				}
+				else { // Shouldn't happen
+					state = Token.NULL;
+				}
+		}
+
+		setLanguageIndex(languageIndex);
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Returns whether e4x is being highlighted.
+	 *
+	 * @return Whether e4x is being highlighted.
+	 * @see #setE4xSupported(boolean)
+	 */
+	public static boolean isE4xSupported() {
+		return e4xSupported;
+	}
+
+
+	/**
+	 * Returns whether features for a specific JS version should be honored
+	 * while highlighting.
+	 * 
+	 * @param version JavaScript version required 
+	 * @return Whether the JavaScript version is the same or greater than
+	 *         version required. 
+	 */
+	public static boolean isJavaScriptCompatible(String version) {
+		return jsVersion.compareTo(version) >= 0;
+	}
+
+
+	/**
+	 * Sets whether e4x should be highlighted.  A repaint should be forced on
+	 * all <code>RSyntaxTextArea</code>s editing JavaScript if this property
+	 * is changed to see the difference.
+	 *
+	 * @param supported Whether e4x should be highlighted.
+	 * @see #isE4xSupported()
+	 */
+	public static void setE4xSupported(boolean supported) {
+		e4xSupported = supported;
+	}
+
+
+	/**
+	 * Set the supported JavaScript version because some keywords were
+	 * introduced on or after this version.
+	 *
+	 * @param javaScriptVersion The version of JavaScript to support, such as
+	 *        "<code>1.5</code>" or "<code>1.6</code>".
+	 * @see #isJavaScriptCompatible(String)
+	 * @see #getJavaScriptVersion()
+	 */
+	public static void setJavaScriptVersion(String javaScriptVersion) {
+		jsVersion = javaScriptVersion;
+	}
+
+
+	/**
+	 * 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(java.io.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;
+	}
+
+
+%}
+
+Whitespace			= ([ \t\f]+)
+LineTerminator			= ([\n])
+
+Letter							= [A-Za-z]
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+LetterOrDigit					= ({Letter}|{Digit})
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({Letter}|"_"|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+JS_MLCBegin				= "/*"
+JS_DocCommentBegin			= "/**"
+JS_MLCEnd					= "*/"
+JS_LineCommentBegin			= "//"
+JS_IntegerHelper1			= (({NonzeroDigit}{Digit}*)|"0")
+JS_IntegerHelper2			= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+JS_IntegerLiteral			= ({JS_IntegerHelper1}[lL]?)
+JS_HexLiteral				= ({JS_IntegerHelper2}[lL]?)
+JS_FloatHelper1			= ([fFdD]?)
+JS_FloatHelper2			= ([eE][+-]?{Digit}+{JS_FloatHelper1})
+JS_FloatLiteral1			= ({Digit}+"."({JS_FloatHelper1}|{JS_FloatHelper2}|{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2})))
+JS_FloatLiteral2			= ("."{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2}))
+JS_FloatLiteral3			= ({Digit}+{JS_FloatHelper2})
+JS_FloatLiteral			= ({JS_FloatLiteral1}|{JS_FloatLiteral2}|{JS_FloatLiteral3}|({Digit}+[fFdD]))
+JS_ErrorNumberFormat		= (({JS_IntegerLiteral}|{JS_HexLiteral}|{JS_FloatLiteral}){NonSeparator}+)
+JS_Separator				= ([\(\)\{\}\[\]\]])
+JS_Separator2				= ([\;,.])
+JS_NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+JS_AssignmentOperator		= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+JS_Operator				= ({JS_NonAssignmentOperator}|{JS_AssignmentOperator})
+JS_Identifier				= ({IdentifierStart}{IdentifierPart}*)
+JS_ErrorIdentifier			= ({NonSeparator}+)
+JS_Regex					= ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[gim]*)
+JS_E4xAttribute				= ("@"{Letter}{LetterOrDigit}*)
+
+JS_BlockTag					= ("abstract"|"access"|"alias"|"augments"|"author"|"borrows"|
+								"callback"|"classdesc"|"constant"|"constructor"|"constructs"|
+								"copyright"|"default"|"deprecated"|"desc"|"enum"|"event"|
+								"example"|"exports"|"external"|"file"|"fires"|"global"|
+								"ignore"|"inner"|"instance"|"kind"|"lends"|"license"|
+								"link"|"member"|"memberof"|"method"|"mixes"|"mixin"|"module"|
+								"name"|"namespace"|"param"|"private"|"property"|"protected"|
+								"public"|"readonly"|"requires"|"return"|"returns"|"see"|"since"|
+								"static"|"summary"|"this"|"throws"|"todo"|
+								"type"|"typedef"|"variation"|"version")
+JS_InlineTag				= ("link"|"linkplain"|"linkcode"|"tutorial")
+
+e4x_NameStartChar		= ([\:A-Z_a-z])
+e4x_NameChar			= ({e4x_NameStartChar}|[\-\.0-9])
+e4x_TagName				= ({e4x_NameStartChar}{e4x_NameChar}*)
+e4x_Identifier			= ([^ \t\n<&;]+)
+e4x_EndXml				= ([;])
+e4x_EntityReference			= ([&][^; \t]*[;]?)
+e4x_InTagIdentifier		= ([^ \t\n\"\'=\/>]+)
+e4x_CDataBegin			= ("<![CDATA[")
+e4x_CDataEnd			= ("]]>")
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrDigit}|"_"|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{LetterOrDigit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state JS_STRING
+%state JS_CHAR
+%state JS_MLC
+%state JS_DOCCOMMENT
+%state JS_EOL_COMMENT
+%state E4X
+%state E4X_COMMENT
+%state E4X_PI
+%state E4X_DTD
+%state E4X_INTAG
+%state E4X_INATTR_DOUBLE
+%state E4X_INATTR_SINGLE
+%state E4X_CDATA
+
+
+%%
+
+<YYINITIAL> {
+
+	// ECMA 3+ keywords.
+	"break" |
+	"continue" |
+	"delete" |
+	"else" |
+	"for" |
+	"function" |
+	"if" |
+	"in" |
+	"new" |
+	"this" |
+	"typeof" |
+	"var" |
+	"void" |
+	"while" |
+	"with"						{ addToken(Token.RESERVED_WORD); }
+	"return"					{ addToken(Token.RESERVED_WORD_2); }
+	
+	//e4X
+	"each" 						{if(e4xSupported){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+	//JavaScript 1.7
+	"let" 						{if(isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+	// e4x miscellaneous
+	{JS_E4xAttribute}			{ addToken(isE4xSupported() ? Token.MARKUP_TAG_ATTRIBUTE : Token.ERROR_IDENTIFIER); }
+	
+	// Reserved (but not yet used) ECMA keywords.
+	"abstract"					{ addToken(Token.RESERVED_WORD); }
+	"boolean"						{ addToken(Token.DATA_TYPE); }
+	"byte"						{ addToken(Token.DATA_TYPE); }
+	"case"						{ addToken(Token.RESERVED_WORD); }
+	"catch"						{ addToken(Token.RESERVED_WORD); }
+	"char"						{ addToken(Token.DATA_TYPE); }
+	"class"						{ addToken(Token.RESERVED_WORD); }
+	"const"						{ addToken(Token.RESERVED_WORD); }
+	"debugger"					{ addToken(Token.RESERVED_WORD); }
+	"default"						{ addToken(Token.RESERVED_WORD); }
+	"do"							{ addToken(Token.RESERVED_WORD); }
+	"double"						{ addToken(Token.DATA_TYPE); }
+	"enum"						{ addToken(Token.RESERVED_WORD); }
+	"export"						{ addToken(Token.RESERVED_WORD); }
+	"extends"						{ addToken(Token.RESERVED_WORD); }
+	"final"						{ addToken(Token.RESERVED_WORD); }
+	"finally"						{ addToken(Token.RESERVED_WORD); }
+	"float"						{ addToken(Token.DATA_TYPE); }
+	"goto"						{ addToken(Token.RESERVED_WORD); }
+	"implements"					{ addToken(Token.RESERVED_WORD); }
+	"import"						{ addToken(Token.RESERVED_WORD); }
+	"instanceof"					{ addToken(Token.RESERVED_WORD); }
+	"int"						{ addToken(Token.DATA_TYPE); }
+	"interface"					{ addToken(Token.RESERVED_WORD); }
+	"long"						{ addToken(Token.DATA_TYPE); }
+	"native"						{ addToken(Token.RESERVED_WORD); }
+	"package"						{ addToken(Token.RESERVED_WORD); }
+	"private"						{ addToken(Token.RESERVED_WORD); }
+	"protected"					{ addToken(Token.RESERVED_WORD); }
+	"public"						{ addToken(Token.RESERVED_WORD); }
+	"short"						{ addToken(Token.DATA_TYPE); }
+	"static"						{ addToken(Token.RESERVED_WORD); }
+	"super"						{ addToken(Token.RESERVED_WORD); }
+	"switch"						{ addToken(Token.RESERVED_WORD); }
+	"synchronized"					{ addToken(Token.RESERVED_WORD); }
+	"throw"						{ addToken(Token.RESERVED_WORD); }
+	"throws"						{ addToken(Token.RESERVED_WORD); }
+	"transient"					{ addToken(Token.RESERVED_WORD); }
+	"try"						{ addToken(Token.RESERVED_WORD); }
+	"volatile"					{ addToken(Token.RESERVED_WORD); }
+	"null"						{ addToken(Token.RESERVED_WORD); }
+
+	// Literals.
+	"false" |
+	"true"						{ addToken(Token.LITERAL_BOOLEAN); }
+	"NaN"						{ addToken(Token.RESERVED_WORD); }
+	"Infinity"					{ addToken(Token.RESERVED_WORD); }
+
+	// Functions.
+	"eval" |
+	"parseInt" |
+	"parseFloat" |
+	"escape" |
+	"unescape" |
+	"isNaN" |
+	"isFinite"						{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+	{JS_Identifier}					{ addToken(Token.IDENTIFIER); }
+	{Whitespace}					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	[\']							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
+	[\"]							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
+
+	/* Comment literals. */
+	"/**/"							{ addToken(Token.COMMENT_MULTILINE); }
+	{JS_MLCBegin}					{ start = zzMarkedPos-2; yybegin(JS_MLC); }
+	{JS_DocCommentBegin}			{ start = zzMarkedPos-3; yybegin(JS_DOCCOMMENT); }
+	{JS_LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
+
+	/* Attempt to identify regular expressions (not foolproof) - do after comments! */
+	{JS_Regex}						{
+										boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+									}
+
+	/* Separators. */
+	{JS_Separator}					{ addToken(Token.SEPARATOR); }
+	{JS_Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	[\+]?"="{Whitespace}*"<"		{
+										int start = zzStartRead;
+										int operatorLen = yycharat(0)=='+' ? 2 : 1;
+										int yylen = yylength(); // Cache before first addToken() invalidates it
+										//System.out.println("'" + yytext() + "': " + yylength() + ", " + (operatorLen+1));
+										addToken(zzStartRead,zzStartRead+operatorLen-1, Token.OPERATOR);
+										if (yylen>operatorLen+1) {
+											//System.out.println((start+operatorLen) + ", " + (zzMarkedPos-2));
+											addToken(start+operatorLen,zzMarkedPos-2, Token.WHITESPACE);
+										}
+										zzStartRead = zzCurrentPos = zzMarkedPos = zzMarkedPos - 1;
+										if (isE4xSupported()) {
+											// Scanning will continue with "<" as markup tag start
+											yybegin(E4X, LANG_INDEX_E4X);
+										}
+										// Found e4x (or syntax error) but option not enabled;
+										// Scanning will continue at "<" as operator
+									}
+	{JS_Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{JS_IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{JS_HexLiteral}				{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{JS_FloatLiteral}				{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{JS_ErrorNumberFormat}			{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{JS_ErrorIdentifier}			{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<JS_STRING> {
+	[^\n\\\"]+				{}
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+							}
+	\"						{ int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(YYINITIAL); }
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+}
+
+<JS_CHAR> {
+	[^\n\\\']+				{}
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+							}
+	\'						{ int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(YYINITIAL); }
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addNullToken(); return firstToken; }
+}
+
+<JS_MLC> {
+	// JavaScript MLC's.  This state is essentially Java's MLC state.
+	[^hwf\n\*]+			{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	{JS_MLCEnd}				{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+}
+
+<JS_DOCCOMMENT> {
+	[^hwf\@\{\n\<\*]+			{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
+	[hwf]						{}
+
+	"@"{JS_BlockTag}			{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+	"@"							{}
+	"{@"{JS_InlineTag}[^\}]*"}"	{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+	"{"							{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JS_COMMENT_DOCUMENTATION); return firstToken; }
+	"<"[/]?({Letter}[^\>]*)?">"	{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos; }
+	\<							{}
+	{JS_MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION); }
+	\*							{}
+	<<EOF>>						{ yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JS_COMMENT_DOCUMENTATION); return firstToken; }
+}
+
+<JS_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 |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
+
+<E4X> {
+	"<!--"						{ start = zzStartRead; e4x_prevState = zzLexicalState; yybegin(E4X_COMMENT); }
+	{e4x_CDataBegin}			{ addToken(Token.MARKUP_CDATA_DELIMITER); start = zzMarkedPos; yybegin(E4X_CDATA); }
+	"<!"						{ start = zzMarkedPos-2; e4x_inInternalDtd = false; yybegin(E4X_DTD); }
+	"<?"						{ start = zzMarkedPos-2; yybegin(E4X_PI); }
+	"<"{e4x_TagName}			{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(E4X_INTAG);
+								}
+	"</"{e4x_TagName}			{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(E4X_INTAG);
+								}
+	"<"							{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(E4X_INTAG); }
+	"</"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(E4X_INTAG); }
+	{e4x_Identifier}			{ addToken(Token.IDENTIFIER); }
+	{e4x_EndXml}				{ yybegin(YYINITIAL, LANG_INDEX_DEFAULT); addToken(Token.IDENTIFIER); }
+	{e4x_EntityReference}				{ addToken(Token.MARKUP_ENTITY_REFERENCE); }
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	{LineTerminator} |
+	<<EOF>>						{ addEndToken(INTERNAL_E4X); return firstToken; }
+}
+
+<E4X_COMMENT> {
+	[^hwf\n\-]+					{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos; }
+	[hwf]						{}
+	"-->"						{ int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); start = temp; yybegin(e4x_prevState); }
+	"-"							{}
+	{LineTerminator} |
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_E4X_COMMENT - e4x_prevState); return firstToken; }
+}
+
+<E4X_PI> {
+	[^\n\?]+					{}
+	"?>"						{ yybegin(E4X); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION); }
+	"?"							{}
+	{LineTerminator} |
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); addEndToken(INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+}
+
+<E4X_DTD> {
+	[^\n\[\]<>]+				{}
+	"<!--"						{ int temp = zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_DTD); start = temp; e4x_prevState = zzLexicalState; yybegin(E4X_COMMENT); }
+	"<"							{}
+	"["							{ e4x_inInternalDtd = true; }
+	"]"							{ e4x_inInternalDtd = false; }
+	">"							{ if (!e4x_inInternalDtd) { yybegin(E4X); addToken(start,zzStartRead, Token.MARKUP_DTD); } }
+	{LineTerminator} |
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_DTD); addEndToken(e4x_inInternalDtd ? INTERNAL_E4X_DTD_INTERNAL : INTERNAL_E4X_DTD); return firstToken; }
+}
+
+<E4X_INTAG> {
+	{e4x_InTagIdentifier}		{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="							{ addToken(Token.OPERATOR); }
+	"/"							{ addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */ }
+	"/>"						{ yybegin(E4X); addToken(Token.MARKUP_TAG_DELIMITER); }
+	">"							{ yybegin(E4X); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(E4X_INATTR_DOUBLE); }
+	[\']						{ start = zzMarkedPos-1; yybegin(E4X_INATTR_SINGLE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, INTERNAL_E4X_INTAG); return firstToken; }
+}
+
+<E4X_INATTR_DOUBLE> {
+	[^\"]*						{}
+	[\"]						{ yybegin(E4X_INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_E4X_ATTR_DOUBLE); return firstToken; }
+}
+
+<E4X_INATTR_SINGLE> {
+	[^\']*						{}
+	[\']						{ yybegin(E4X_INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_E4X_ATTR_SINGLE); return firstToken; }
+}
+
+<E4X_CDATA> {
+	[^\]]+						{}
+	{e4x_CDataEnd}				{ int temp=zzStartRead; yybegin(E4X); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.MARKUP_CDATA_DELIMITER); }
+	"]"							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addEndToken(INTERNAL_E4X_MARKUP_CDATA); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.java
new file mode 100644
index 0000000..19c9bee
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.java
@@ -0,0 +1,2130 @@
+/* The following code was generated by JFlex 1.4.1 on 4/22/13 10:43 PM */
+
+/*
+ * 02/05/2012
+ *
+ * JavaScriptTokenMaker.java - Parses a document into JavaScript tokens.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for JavaScript files.  Its states could be simplified, but are
+ * kept the way they are to keep a degree of similarity (i.e. copy/paste)
+ * between it and HTML/JSP/PHPTokenMaker.  This should cause no difference in
+ * performance.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated JavaScriptTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+
+public class JavaScriptTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int JS_STRING = 1;
+  public static final int E4X = 6;
+  public static final int E4X_INTAG = 10;
+  public static final int E4X_PI = 8;
+  public static final int JS_MLC = 3;
+  public static final int JS_CHAR = 2;
+  public static final int JS_EOL_COMMENT = 5;
+  public static final int E4X_COMMENT = 7;
+  public static final int JS_DOCCOMMENT = 4;
+  public static final int E4X_DTD = 9;
+  public static final int E4X_INATTR_SINGLE = 12;
+  public static final int E4X_INATTR_DOUBLE = 11;
+  public static final int YYINITIAL = 0;
+  public static final int E4X_CDATA = 13;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\73\1\2\1\0\1\1\1\11\22\0\1\73\1\36\1\75"+
+    "\1\12\1\15\1\35\1\40\1\105\2\104\1\17\1\30\1\27\1\24"+
+    "\1\25\1\16\1\5\7\7\2\4\1\41\1\74\1\31\1\32\1\34"+
+    "\1\37\1\44\1\101\1\6\1\77\1\100\1\23\1\22\2\3\1\110"+
+    "\2\3\1\21\1\3\1\107\5\3\1\102\3\3\1\20\2\3\1\76"+
+    "\1\13\1\103\1\33\1\14\1\0\1\45\1\46\1\52\1\64\1\53"+
+    "\1\67\1\56\1\60\1\55\1\3\1\63\1\54\1\43\1\57\1\61"+
+    "\1\65\1\72\1\51\1\47\1\50\1\10\1\70\1\62\1\71\1\66"+
+    "\1\106\1\111\1\33\1\26\1\42\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 =
+    "\13\0\2\1\1\0\1\2\1\3\1\4\1\5\2\6"+
+    "\1\5\1\2\3\7\1\5\1\10\1\5\6\7\1\2"+
+    "\20\5\1\11\1\12\2\5\1\1\1\13\1\14\1\15"+
+    "\1\1\1\16\1\17\1\20\1\1\1\21\5\1\1\22"+
+    "\10\1\1\23\2\5\1\24\1\25\1\26\1\27\1\1"+
+    "\1\30\5\1\1\31\2\1\1\32\1\1\1\33\1\34"+
+    "\1\35\2\36\1\37\1\40\1\41\1\42\1\1\1\43"+
+    "\3\1\1\2\1\44\1\6\1\45\1\44\1\45\1\44"+
+    "\1\46\1\44\1\5\2\0\1\47\1\50\2\7\2\0"+
+    "\1\51\1\7\1\52\33\5\2\53\7\5\1\53\13\5"+
+    "\1\54\1\55\1\56\1\57\4\0\1\60\2\0\1\61"+
+    "\26\0\1\62\1\25\1\63\1\64\1\26\5\0\1\65"+
+    "\2\0\1\2\1\45\1\0\2\46\1\5\1\66\1\67"+
+    "\32\5\1\70\5\5\1\71\25\5\60\0\1\72\2\0"+
+    "\1\73\5\0\1\74\1\2\1\75\3\5\1\71\3\5"+
+    "\1\76\6\5\1\77\1\5\1\100\24\5\1\0\1\1"+
+    "\1\0\1\101\15\0\1\102\45\0\1\103\3\0\1\104"+
+    "\2\0\1\105\1\0\1\106\1\2\5\5\1\53\17\5"+
+    "\1\53\1\5\15\0\1\102\20\0\1\102\16\0\1\2"+
+    "\4\5\1\107\13\5\33\0\10\5\1\102\4\0\1\102"+
+    "\12\0\3\5\6\0\1\5\2\0\1\110\1\0";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[603];
+    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\112\0\224\0\336\0\u0128\0\u0172\0\u01bc\0\u0206"+
+    "\0\u0250\0\u029a\0\u02e4\0\u032e\0\u0378\0\u03c2\0\u040c\0\u0456"+
+    "\0\u04a0\0\u04ea\0\u0534\0\u057e\0\u05c8\0\u04a0\0\u0612\0\u065c"+
+    "\0\u06a6\0\u06f0\0\u04a0\0\u04a0\0\u073a\0\u0784\0\u07ce\0\u0818"+
+    "\0\u04a0\0\u0862\0\u08ac\0\u08f6\0\u0940\0\u098a\0\u09d4\0\u0a1e"+
+    "\0\u0a68\0\u0ab2\0\u0afc\0\u0b46\0\u0b90\0\u0bda\0\u0c24\0\u0c6e"+
+    "\0\u0cb8\0\u0d02\0\u0d4c\0\u04a0\0\u04a0\0\u0d96\0\u0de0\0\u0e2a"+
+    "\0\u04a0\0\u0e74\0\u04a0\0\u0ebe\0\u04a0\0\u0e74\0\u04a0\0\u0f08"+
+    "\0\u04a0\0\u0f52\0\u0f9c\0\u0fe6\0\u1030\0\u107a\0\u04a0\0\u10c4"+
+    "\0\u110e\0\u1158\0\u11a2\0\u11ec\0\u1236\0\u1280\0\u12ca\0\u04a0"+
+    "\0\u1314\0\u135e\0\u04a0\0\u13a8\0\u13f2\0\u04a0\0\u143c\0\u04a0"+
+    "\0\u1486\0\u14d0\0\u151a\0\u1564\0\u15ae\0\u04a0\0\u15f8\0\u1642"+
+    "\0\u04a0\0\u168c\0\u04a0\0\u04a0\0\u04a0\0\u16d6\0\u1720\0\u176a"+
+    "\0\u04a0\0\u04a0\0\u04a0\0\u17b4\0\u04a0\0\u17fe\0\u1848\0\u1892"+
+    "\0\u18dc\0\u1926\0\u1926\0\u1926\0\u1970\0\u19ba\0\u1a04\0\u1a4e"+
+    "\0\u1a98\0\u1ae2\0\u1b2c\0\u1b76\0\u04a0\0\u1bc0\0\u1b2c\0\u1c0a"+
+    "\0\u065c\0\u1c0a\0\u04a0\0\u1c54\0\u1c9e\0\u1ce8\0\u1d32\0\u1d7c"+
+    "\0\u1dc6\0\u1e10\0\u1e5a\0\u1ea4\0\u1eee\0\u1f38\0\u1f82\0\u1fcc"+
+    "\0\u2016\0\u2060\0\u20aa\0\u20f4\0\u213e\0\u2188\0\u21d2\0\u221c"+
+    "\0\u2266\0\u22b0\0\u22fa\0\u2344\0\u238e\0\u23d8\0\u2422\0\u246c"+
+    "\0\u24b6\0\u04ea\0\u2500\0\u254a\0\u2594\0\u25de\0\u2628\0\u2672"+
+    "\0\u26bc\0\u2706\0\u2750\0\u279a\0\u27e4\0\u282e\0\u2878\0\u28c2"+
+    "\0\u290c\0\u2956\0\u29a0\0\u29ea\0\u2a34\0\u04a0\0\u2a7e\0\u2ac8"+
+    "\0\u04a0\0\u2b12\0\u2b5c\0\u2ba6\0\u2bf0\0\u04a0\0\u2c3a\0\u2c84"+
+    "\0\u04a0\0\u2cce\0\u2d18\0\u2d62\0\u2dac\0\u2df6\0\u2e40\0\u2e8a"+
+    "\0\u2ed4\0\u2f1e\0\u2f68\0\u2fb2\0\u2ffc\0\u3046\0\u3090\0\u30da"+
+    "\0\u3124\0\u316e\0\u31b8\0\u3202\0\u324c\0\u3296\0\u32e0\0\u332a"+
+    "\0\u3374\0\u33be\0\u04a0\0\u04a0\0\u3408\0\u3452\0\u349c\0\u34e6"+
+    "\0\u3530\0\u04a0\0\u357a\0\u35c4\0\u360e\0\u3658\0\u36a2\0\u1926"+
+    "\0\u36ec\0\u3736\0\u3780\0\u37ca\0\u3814\0\u385e\0\u38a8\0\u38f2"+
+    "\0\u393c\0\u3986\0\u39d0\0\u3a1a\0\u3a64\0\u3aae\0\u3af8\0\u3b42"+
+    "\0\u3b8c\0\u3bd6\0\u3c20\0\u3c6a\0\u3cb4\0\u3cfe\0\u3d48\0\u3d92"+
+    "\0\u3ddc\0\u3e26\0\u3e70\0\u3eba\0\u3f04\0\u3f4e\0\u04ea\0\u3f98"+
+    "\0\u3fe2\0\u402c\0\u4076\0\u40c0\0\u410a\0\u4154\0\u419e\0\u41e8"+
+    "\0\u4232\0\u427c\0\u42c6\0\u4310\0\u435a\0\u43a4\0\u43ee\0\u4438"+
+    "\0\u4482\0\u44cc\0\u4516\0\u4560\0\u45aa\0\u45f4\0\u463e\0\u4688"+
+    "\0\u46d2\0\u471c\0\u4766\0\u47b0\0\u47fa\0\u4844\0\u488e\0\u48d8"+
+    "\0\u4922\0\u496c\0\u49b6\0\u4a00\0\u4a4a\0\u4a94\0\u4ade\0\u4b28"+
+    "\0\u4b72\0\u4bbc\0\u4c06\0\u4c50\0\u4c9a\0\u4ce4\0\u4d2e\0\u4d78"+
+    "\0\u4dc2\0\u4e0c\0\u4e56\0\u4ea0\0\u4eea\0\u4f34\0\u4f7e\0\u4fc8"+
+    "\0\u5012\0\u505c\0\u50a6\0\u50f0\0\u513a\0\u5184\0\u51ce\0\u5218"+
+    "\0\u5262\0\u52ac\0\u52f6\0\u5340\0\u538a\0\u53d4\0\u541e\0\u5468"+
+    "\0\u54b2\0\u54fc\0\u5546\0\u5590\0\u55da\0\u04a0\0\u5624\0\u566e"+
+    "\0\u56b8\0\u5702\0\u574c\0\u04a0\0\u5796\0\u04a0\0\u57e0\0\u582a"+
+    "\0\u5874\0\u04ea\0\u58be\0\u5908\0\u5952\0\u04ea\0\u599c\0\u59e6"+
+    "\0\u5a30\0\u5a7a\0\u5ac4\0\u5b0e\0\u04ea\0\u5b58\0\u04ea\0\u5ba2"+
+    "\0\u5bec\0\u5c36\0\u5c80\0\u5cca\0\u5d14\0\u5d5e\0\u5da8\0\u5df2"+
+    "\0\u5e3c\0\u5e86\0\u5ed0\0\u5f1a\0\u5f64\0\u5fae\0\u5ff8\0\u6042"+
+    "\0\u608c\0\u60d6\0\u6120\0\u2ac8\0\u04a0\0\u616a\0\u61b4\0\u61fe"+
+    "\0\u6248\0\u6292\0\u62dc\0\u6326\0\u6370\0\u63ba\0\u6404\0\u644e"+
+    "\0\u6498\0\u64e2\0\u652c\0\u6576\0\u04a0\0\u65c0\0\u660a\0\u6654"+
+    "\0\u669e\0\u66e8\0\u6732\0\u677c\0\u67c6\0\u6810\0\u685a\0\u68a4"+
+    "\0\u68ee\0\u6938\0\u6982\0\u69cc\0\u6a16\0\u6a60\0\u6aaa\0\u6af4"+
+    "\0\u6b3e\0\u6b88\0\u6bd2\0\u6c1c\0\u6c66\0\u6cb0\0\u6cfa\0\u6d44"+
+    "\0\u6d8e\0\u6dd8\0\u6e22\0\u6e6c\0\u6eb6\0\u6f00\0\u6f4a\0\u6f94"+
+    "\0\u6fde\0\u7028\0\u7072\0\u70bc\0\u7106\0\u7150\0\u04a0\0\u719a"+
+    "\0\u71e4\0\u722e\0\u7278\0\u04a0\0\u72c2\0\u730c\0\u7356\0\u73a0"+
+    "\0\u73ea\0\u7434\0\u3b8c\0\u747e\0\u74c8\0\u7512\0\u755c\0\u75a6"+
+    "\0\u75f0\0\u763a\0\u7684\0\u76ce\0\u7718\0\u7762\0\u77ac\0\u77f6"+
+    "\0\u7840\0\u788a\0\u78d4\0\u791e\0\u61b4\0\u7968\0\u79b2\0\u79fc"+
+    "\0\u7a46\0\u7a90\0\u7ada\0\u7b24\0\u7b6e\0\u7bb8\0\u7c02\0\u7c4c"+
+    "\0\u7c96\0\u7ce0\0\u7d2a\0\u7d74\0\u7dbe\0\u7e08\0\u7e52\0\u7e9c"+
+    "\0\u7ee6\0\u7f30\0\u7f7a\0\u7fc4\0\u800e\0\u8058\0\u80a2\0\u80ec"+
+    "\0\u8136\0\u8180\0\u81ca\0\u8214\0\u825e\0\u82a8\0\u82f2\0\u833c"+
+    "\0\u8386\0\u83d0\0\u7072\0\u841a\0\u8464\0\u84ae\0\u84f8\0\u722e"+
+    "\0\u8542\0\u858c\0\u85d6\0\u8620\0\u866a\0\u86b4\0\u04ea\0\u86fe"+
+    "\0\u8748\0\u8792\0\u87dc\0\u8826\0\u8870\0\u88ba\0\u8904\0\u894e"+
+    "\0\u8998\0\u89e2\0\u8a2c\0\u8a76\0\u8ac0\0\u8b0a\0\u8b54\0\u8b9e"+
+    "\0\u8be8\0\u8c32\0\u8c7c\0\u8cc6\0\u8d10\0\u8d5a\0\u8da4\0\u8dee"+
+    "\0\u8e38\0\u8e82\0\u8ecc\0\u8f16\0\u8f60\0\u8faa\0\u8ff4\0\u903e"+
+    "\0\u9088\0\u90d2\0\u911c\0\u9166\0\u91b0\0\u91fa\0\u9244\0\u928e"+
+    "\0\u92d8\0\u9322\0\u936c\0\u93b6\0\u9400\0\u944a\0\u9494\0\u94de"+
+    "\0\u9528\0\u9572\0\u6654\0\u95bc\0\u9606\0\u9650\0\u969a\0\u96e4"+
+    "\0\u972e\0\u9778\0\u97c2\0\u980c\0\u9856\0\u98a0\0\u98ea\0\u9934"+
+    "\0\u997e\0\u99c8\0\u9a12\0\u9a5c\0\u9aa6\0\u9af0\0\u9b3a\0\u9b84"+
+    "\0\u9bce\0\u04a0\0\u9c18";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[603];
+    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\17\1\20\1\21\1\22\1\23\1\24\1\22\1\23"+
+    "\1\25\1\26\2\17\2\22\1\27\1\30\4\22\1\31"+
+    "\1\32\1\33\1\34\1\35\1\36\1\37\1\30\1\40"+
+    "\2\30\1\41\1\42\2\41\1\22\1\43\1\44\1\45"+
+    "\1\46\1\47\1\50\1\51\1\52\1\53\1\54\1\55"+
+    "\1\56\2\22\1\57\1\22\1\60\1\61\1\22\1\62"+
+    "\1\63\2\22\1\20\1\34\1\64\1\33\4\22\2\33"+
+    "\1\65\1\22\1\66\1\67\1\33\2\70\1\71\10\70"+
+    "\1\72\61\70\1\73\14\70\2\74\1\75\10\74\1\76"+
+    "\71\74\1\77\4\74\2\100\1\101\14\100\1\102\40\100"+
+    "\1\103\1\100\1\104\4\100\1\105\22\100\2\106\1\107"+
+    "\14\106\1\110\11\106\1\111\12\106\1\112\13\106\1\113"+
+    "\1\106\1\114\4\106\1\115\21\106\1\116\2\117\1\120"+
+    "\55\117\1\103\1\117\1\104\4\117\1\105\22\117\1\121"+
+    "\1\122\1\123\26\121\1\124\6\121\1\125\32\121\1\20"+
+    "\1\126\15\121\2\127\1\130\21\127\1\131\33\127\1\132"+
+    "\1\127\1\133\4\127\1\134\22\127\2\135\1\136\34\135"+
+    "\1\137\52\135\2\140\1\141\26\140\1\142\2\140\1\143"+
+    "\41\140\1\144\4\140\1\145\6\140\1\146\1\147\1\0"+
+    "\13\146\1\150\13\146\1\41\1\146\1\151\36\146\1\20"+
+    "\1\146\1\152\7\146\1\153\4\146\75\154\1\155\14\154"+
+    "\105\156\1\155\4\156\103\157\1\160\6\157\1\17\2\0"+
+    "\6\17\1\0\4\17\2\0\4\17\17\0\30\17\4\0"+
+    "\4\17\3\0\3\17\2\0\1\20\71\0\1\20\130\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\26\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\162\2\0\1\162\2\23\1\162\1\23"+
+    "\1\162\1\0\4\162\2\0\1\162\1\163\1\164\1\165"+
+    "\1\0\1\166\15\0\10\162\1\165\1\163\7\162\1\164"+
+    "\2\162\1\164\3\162\4\0\1\162\1\164\2\162\3\0"+
+    "\3\162\1\0\1\162\2\0\1\162\1\167\1\170\1\162"+
+    "\1\170\1\162\1\0\4\162\2\0\1\171\1\163\1\164"+
+    "\1\165\1\0\1\166\15\0\10\162\1\165\1\163\7\162"+
+    "\1\164\2\162\1\164\1\162\1\171\1\162\4\0\1\162"+
+    "\1\164\2\162\3\0\3\162\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\12\22\1\172\13\22\4\0\4\22\3\0\3\22"+
+    "\1\0\13\173\1\174\2\173\1\175\1\176\12\173\1\177"+
+    "\57\173\32\0\1\41\103\0\1\41\5\0\1\41\63\0"+
+    "\2\166\1\0\1\166\132\0\1\41\1\0\1\200\110\0"+
+    "\1\201\1\41\60\0\1\202\27\0\1\203\1\41\40\0"+
+    "\1\202\50\0\1\41\1\0\1\204\107\0\1\41\5\0"+
+    "\1\41\51\0\1\17\2\0\1\205\2\17\1\205\1\17"+
+    "\1\205\1\0\4\17\2\0\4\205\17\0\1\205\1\17"+
+    "\26\205\4\0\4\205\3\0\3\205\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\1\22\1\206\24\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\4\22\1\207"+
+    "\7\22\1\210\4\22\1\211\4\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\5\22\1\212\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\3\22"+
+    "\1\213\7\22\1\214\1\22\1\215\3\22\1\216\4\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\4\22\1\217\6\22\1\220\5\22\1\221\4\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\6\22\1\222\17\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\1\223\6\22\1\224"+
+    "\3\22\1\225\1\226\11\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\1\227\1\22\1\230"+
+    "\4\22\1\231\2\22\1\232\10\22\1\233\1\234\1\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\6\22\1\235\5\22\1\236\11\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\237\1\17\2\22"+
+    "\1\240\7\22\1\241\7\22\1\242\3\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\14\22"+
+    "\1\243\11\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\5\22\1\244\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\1\245\5\22\1\246\17\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\10\22\1\247\2\22\1\250\12\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\6\22"+
+    "\1\251\5\22\1\252\11\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\5\22\1\253\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\1\254\3\22"+
+    "\1\255\21\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\5\22\1\256\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\1\257\6\22\1\260\1\261"+
+    "\3\22\1\262\11\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\1\262\13\22\1\263\11\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\1\264\25\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\12\22\1\265\13\22\4\0"+
+    "\4\22\3\0\3\22\1\0\2\70\1\0\10\70\1\0"+
+    "\61\70\1\0\14\70\2\266\1\0\5\266\1\267\60\266"+
+    "\1\270\20\266\2\74\1\0\10\74\1\0\71\74\1\0"+
+    "\4\74\2\100\1\0\14\100\1\0\40\100\1\0\1\100"+
+    "\1\0\4\100\1\0\22\100\16\0\1\271\143\0\1\272"+
+    "\123\0\1\273\77\0\1\274\4\0\1\275\34\0\2\106"+
+    "\1\0\14\106\1\0\11\106\1\0\12\106\1\0\13\106"+
+    "\1\0\1\106\1\0\4\106\1\0\21\106\17\0\1\276"+
+    "\76\0\1\277\2\0\1\277\1\0\1\277\5\0\1\300"+
+    "\1\0\4\277\10\0\1\301\6\0\1\277\1\0\26\277"+
+    "\4\0\4\277\3\0\3\277\44\0\1\302\1\0\1\303"+
+    "\1\304\1\305\1\306\1\307\1\310\1\311\1\312\1\313"+
+    "\1\314\1\315\3\0\1\316\1\317\1\320\1\0\1\321"+
+    "\1\322\71\0\1\323\123\0\1\324\77\0\1\325\4\0"+
+    "\1\326\100\0\1\327\45\0\2\117\1\0\55\117\1\0"+
+    "\1\117\1\0\4\117\1\0\22\117\2\121\1\0\26\121"+
+    "\1\0\6\121\1\0\32\121\2\0\16\121\1\122\1\0"+
+    "\26\121\1\0\6\121\1\0\32\121\1\20\1\0\15\121"+
+    "\3\0\1\330\2\0\1\330\1\0\1\330\3\0\1\330"+
+    "\1\0\1\331\1\0\4\330\12\0\1\332\1\333\1\0"+
+    "\1\330\1\0\1\330\1\0\26\330\4\0\4\330\3\0"+
+    "\3\330\1\0\73\125\1\0\1\334\15\125\2\127\1\0"+
+    "\21\127\1\0\33\127\1\0\1\127\1\0\4\127\1\0"+
+    "\22\127\24\0\1\335\135\0\1\336\123\0\1\337\77\0"+
+    "\1\340\4\0\1\341\34\0\2\135\1\0\34\135\1\0"+
+    "\52\135\34\0\1\342\55\0\2\140\1\0\26\140\1\0"+
+    "\2\140\1\0\41\140\1\0\4\140\1\0\6\140\36\0"+
+    "\1\343\53\0\2\146\1\0\13\146\1\0\13\146\1\0"+
+    "\1\146\1\0\36\146\1\0\1\146\1\0\7\146\1\0"+
+    "\5\146\1\147\1\0\13\146\1\0\13\146\1\0\1\146"+
+    "\1\0\36\146\1\20\1\146\1\0\7\146\1\0\4\146"+
+    "\34\0\1\151\55\0\75\154\1\0\14\154\105\156\1\0"+
+    "\4\156\103\157\1\0\6\157\103\0\1\344\6\0\1\17"+
+    "\2\0\5\17\1\345\1\0\4\17\2\0\4\17\17\0"+
+    "\30\17\4\0\4\17\3\0\3\17\1\0\1\162\2\0"+
+    "\6\162\1\0\4\162\2\0\4\162\17\0\30\162\4\0"+
+    "\4\162\3\0\3\162\1\0\1\162\2\0\1\162\2\346"+
+    "\1\162\1\346\1\162\1\0\4\162\2\0\4\162\1\347"+
+    "\3\0\1\347\12\0\30\162\4\0\4\162\3\0\3\162"+
+    "\1\0\1\162\2\0\1\162\2\166\1\162\1\166\1\162"+
+    "\1\0\4\162\2\0\2\162\1\164\1\165\17\0\10\162"+
+    "\1\165\10\162\1\164\2\162\1\164\3\162\4\0\1\162"+
+    "\1\164\2\162\3\0\3\162\1\0\1\162\2\0\1\162"+
+    "\2\167\1\162\1\167\1\162\1\0\4\162\2\0\2\162"+
+    "\1\164\1\165\1\0\1\166\15\0\10\162\1\165\10\162"+
+    "\1\164\2\162\1\164\3\162\4\0\1\162\1\164\2\162"+
+    "\3\0\3\162\1\0\1\162\2\0\1\162\1\167\1\170"+
+    "\1\162\1\170\1\162\1\0\4\162\2\0\1\162\1\350"+
+    "\1\164\1\165\1\0\1\166\15\0\10\162\1\165\1\350"+
+    "\7\162\1\164\2\162\1\164\3\162\4\0\1\162\1\164"+
+    "\2\162\3\0\3\162\1\0\1\162\2\0\1\162\4\351"+
+    "\1\162\1\0\4\162\2\0\2\162\2\351\17\0\2\162"+
+    "\2\351\3\162\2\351\10\162\1\351\2\162\1\351\3\162"+
+    "\4\0\3\351\1\162\3\0\3\162\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\6\22\1\352\17\22\4\0\4\22\3\0"+
+    "\3\22\1\0\13\173\1\174\2\173\1\353\75\173\1\0"+
+    "\107\173\17\0\1\354\73\0\1\202\27\0\1\203\41\0"+
+    "\1\202\50\0\1\41\1\0\1\30\55\0\1\17\2\0"+
+    "\6\205\1\0\4\17\2\0\4\205\17\0\1\205\1\17"+
+    "\26\205\4\0\4\205\3\0\3\205\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\2\22\1\355\23\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\6\22\1\356"+
+    "\17\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\14\22\1\357\11\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\3\22\1\360"+
+    "\22\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\20\22\1\361\5\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\1\362\25\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\14\22\1\363\11\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\10\22\1\364\15\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\12\22\1\365\13\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\5\22\1\366\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\1\367\20\22"+
+    "\1\242\4\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\4\22\1\370\3\22\1\371\15\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\20\22\1\372\5\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\3\22\1\373\22\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\2\22\1\374\1\375\22\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\1\376\25\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\1\377\25\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\12\22\1\u0100\13\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\5\22\1\u0101\20\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\5\22\1\u0102\20\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\2\22\1\374\23\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\5\22\1\u0103\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\26\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\1\u0104"+
+    "\25\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\3\22\1\u0105\14\22\1\u0106\5\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\3\22\1\u0107\22\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\12\22\1\u0108\13\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\20\22\1\u0109\5\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\2\22\1\u010a\1\22\17\0\1\22\1\17\26\22\4\0"+
+    "\4\22\3\0\1\22\1\u010b\1\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\2\22\1\u010c\1\u010d\22\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\3\22"+
+    "\1\u010e\22\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\7\22\1\u010f\16\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\3\22"+
+    "\1\u0110\22\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\15\22\1\242\10\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\3\22"+
+    "\1\u0111\22\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\10\22\1\u0112\15\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\1\22"+
+    "\1\u0113\5\22\1\u0114\12\22\1\u0115\3\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\5\22\1\u0116\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\26\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\1\22\1\u0117\24\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\4\22\1\u0118"+
+    "\1\u0119\20\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\10\22\1\u011a\3\22\1\u011b\11\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\12\22\1\u011c\13\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\7\22\1\u011d\16\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\14\22\1\u011e\11\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\12\22\1\u011f\13\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\4\22\1\242\21\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\7\22\1\u0120\1\u0121"+
+    "\15\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\26\22\4\0\4\22\3\0\1\22\1\242"+
+    "\1\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\22\22\1\u0122"+
+    "\3\22\4\0\4\22\3\0\3\22\5\0\4\u0123\12\0"+
+    "\2\u0123\21\0\2\u0123\3\0\2\u0123\10\0\1\u0123\2\0"+
+    "\1\u0123\7\0\3\u0123\14\0\4\u0124\12\0\2\u0124\21\0"+
+    "\2\u0124\3\0\2\u0124\10\0\1\u0124\2\0\1\u0124\7\0"+
+    "\3\u0124\60\0\1\u0125\123\0\1\u0126\114\0\1\u0127\100\0"+
+    "\1\u0128\35\0\34\277\1\301\55\277\3\0\1\277\2\0"+
+    "\1\277\1\0\1\277\7\0\4\277\10\0\1\301\6\0"+
+    "\1\277\1\0\26\277\4\0\4\277\3\0\3\277\54\0"+
+    "\1\u0129\1\0\1\u012a\3\0\1\u012b\40\0\1\u012c\35\0"+
+    "\1\u012d\3\0\1\u012e\1\0\1\u012f\116\0\1\u0130\40\0"+
+    "\1\u0131\37\0\1\u0132\2\0\1\u0133\1\0\1\u0134\114\0"+
+    "\1\u0135\1\u0136\4\0\1\u0137\76\0\1\u0138\103\0\1\u0139"+
+    "\6\0\1\u013a\4\0\1\u013b\107\0\1\u013c\10\0\1\u013d"+
+    "\1\u013e\73\0\1\u013f\1\0\1\u0140\112\0\1\u0141\1\u0142"+
+    "\106\0\1\u0143\102\0\1\u0144\121\0\1\u0145\107\0\1\u0146"+
+    "\46\0\1\u0147\34\0\1\u0148\3\0\1\u0149\115\0\1\u014a"+
+    "\101\0\1\u014b\5\0\1\u014c\106\0\1\u014d\123\0\1\u014e"+
+    "\114\0\1\u014f\100\0\1\u0150\105\0\1\u0151\3\0\1\u0152"+
+    "\40\0\6\330\3\0\1\330\3\0\6\330\13\0\1\330"+
+    "\1\0\1\330\1\0\26\330\4\0\4\330\3\0\3\330"+
+    "\4\0\1\u0153\2\0\1\u0153\1\0\1\u0153\3\0\1\u0153"+
+    "\3\0\4\u0153\15\0\1\u0153\1\0\1\u0153\1\0\26\u0153"+
+    "\4\0\4\u0153\3\0\3\u0153\25\0\1\u0154\51\0\1\u0155"+
+    "\47\0\1\u0156\125\0\1\u0157\123\0\1\u0158\114\0\1\u0159"+
+    "\100\0\1\u015a\61\0\1\u015b\121\0\1\u015c\55\0\1\17"+
+    "\2\0\1\17\4\u015d\1\17\1\0\4\17\2\0\2\17"+
+    "\2\u015d\17\0\2\17\2\u015d\3\17\2\u015d\10\17\1\u015d"+
+    "\2\17\1\u015d\3\17\4\0\3\u015d\1\17\3\0\3\17"+
+    "\1\0\1\162\2\0\1\162\2\346\1\162\1\346\1\162"+
+    "\1\0\4\162\2\0\2\162\1\164\1\162\17\0\21\162"+
+    "\1\164\2\162\1\164\3\162\4\0\1\162\1\164\2\162"+
+    "\3\0\3\162\5\0\2\346\1\0\1\346\102\0\1\162"+
+    "\2\0\1\162\4\351\1\162\1\0\4\162\2\0\1\162"+
+    "\1\350\2\351\17\0\2\162\2\351\3\162\2\351\1\350"+
+    "\7\162\1\351\2\162\1\351\3\162\4\0\3\351\1\162"+
+    "\3\0\3\162\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\2\22"+
+    "\1\230\23\22\4\0\4\22\3\0\3\22\44\0\1\353"+
+    "\11\0\2\353\51\0\1\u015e\73\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\3\22\1\u015f\22\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\1\u0160\25\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\7\22\1\u0161\16\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\6\22\1\u0162\17\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\6\22\1\262\17\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\3\22\1\u0163\22\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\4\22\1\u0164\21\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\3\22\1\375\22\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\5\22\1\u0165\20\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\6\22\1\u0166\17\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\12\22\1\u0167\13\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\14\22\1\u0168\11\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\2\22\1\242\23\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\6\22\1\u0169\17\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\5\22\1\u016a"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\26\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\6\22\1\242\17\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\5\22"+
+    "\1\u0111\20\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\2\22\1\371\23\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\4\22"+
+    "\1\u0162\21\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\2\22\1\u016b\1\u016c\22\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\13\22\1\u016d\12\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\1\u016e\25\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\242\1\17\26\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\7\22\1\u016f\16\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\6\22\1\u0170\17\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\14\22\1\u0171\11\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\11\22\1\u0162\14\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\7\22\1\u0172\4\22\1\u0171\11\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\10\22"+
+    "\1\u0173\15\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\1\u0174\25\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\3\22\1\u0175"+
+    "\22\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\6\22\1\u0176\17\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\14\22\1\242"+
+    "\11\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\7\22\1\242\16\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\10\22\1\u0177"+
+    "\15\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\13\22\1\242\12\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\7\22\1\374"+
+    "\16\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\5\22\1\u0178\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\26\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\6\22\1\u0179\17\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\1\u017a\25\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\1\22\1\u017b\24\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\7\22\1\u0163\16\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\2\22\1\u017c\23\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\16\22\1\u017d\7\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\23\22\1\u017e\2\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\3\22\1\u017f\22\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\5\22\1\u0180\20\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\2\22\1\366\23\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\1\u0164\25\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\1\u0181"+
+    "\25\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\1\u0182\25\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\17\22\1\242\6\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\10\22\1\u0183\15\22\4\0\4\22\3\0\3\22"+
+    "\5\0\4\u0184\12\0\2\u0184\21\0\2\u0184\3\0\2\u0184"+
+    "\10\0\1\u0184\2\0\1\u0184\7\0\3\u0184\14\0\4\u0185"+
+    "\12\0\2\u0185\21\0\2\u0185\3\0\2\u0185\10\0\1\u0185"+
+    "\2\0\1\u0185\7\0\3\u0185\75\0\1\u0186\51\0\1\u0187"+
+    "\125\0\1\u0188\123\0\1\u0127\101\0\1\u0189\4\0\1\u018a"+
+    "\132\0\1\u018b\104\0\1\u018c\75\0\1\u018d\5\0\1\u018e"+
+    "\102\0\1\u018f\114\0\1\u0190\114\0\1\u0191\105\0\1\u0192"+
+    "\103\0\1\u0193\113\0\1\u0194\117\0\1\u0195\115\0\1\u0196"+
+    "\103\0\1\u0197\3\0\1\u0198\120\0\1\u0199\112\0\1\u019a"+
+    "\71\0\1\u019b\2\0\1\u019c\21\0\1\u019d\73\0\1\u019e"+
+    "\102\0\1\u019f\123\0\1\u01a0\5\0\1\u01a1\34\0\1\u01a2"+
+    "\154\0\1\u01a3\103\0\1\u01a4\2\0\1\u01a5\14\0\1\u01a6"+
+    "\103\0\1\u01a7\104\0\1\u01a8\4\0\1\u01a9\111\0\1\u01aa"+
+    "\101\0\1\u01ab\7\0\1\u01ac\113\0\1\u01ad\73\0\1\u01ae"+
+    "\125\0\1\u01af\101\0\1\u01b0\15\0\1\u01b1\1\0\1\u01b2"+
+    "\70\0\1\u01b3\114\0\1\u01b4\115\0\1\u01b5\3\0\1\u01b6"+
+    "\101\0\1\u01b7\2\0\1\u0133\106\0\1\u01b8\111\0\1\u01b9"+
+    "\125\0\1\u01ba\51\0\1\u01bb\125\0\1\u01bc\123\0\1\u014f"+
+    "\46\0\1\u01bd\156\0\1\u01be\37\0\6\u0153\3\0\1\u0153"+
+    "\3\0\6\u0153\13\0\1\u0153\1\0\1\u0153\1\0\26\u0153"+
+    "\4\0\4\u0153\3\0\3\u0153\25\0\1\u01bf\164\0\1\u01c0"+
+    "\77\0\1\u01c1\51\0\1\u01c2\125\0\1\u01c3\123\0\1\u0159"+
+    "\62\0\1\u01c4\65\0\1\17\2\0\1\17\4\u01c5\1\17"+
+    "\1\0\4\17\2\0\2\17\2\u01c5\17\0\2\17\2\u01c5"+
+    "\3\17\2\u01c5\10\17\1\u01c5\2\17\1\u01c5\3\17\4\0"+
+    "\3\u01c5\1\17\3\0\3\17\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\4\22\1\u01c6\21\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\16\22\1\242\7\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\6\22\1\u01c7\17\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\10\22\1\u01c8\15\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\3\22\1\u0162\22\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\13\22\1\u01c9\12\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\2\22\1\u01ca\23\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\15\22\1\u01cb\10\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\14\22\1\u01cc\11\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\4\22\1\u01cd\21\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\3\22\1\242\22\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\10\22\1\u01ce\15\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\20\22\1\u01cf\5\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\12\22\1\u01d0\13\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\4\22\1\u016b\21\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\6\22\1\u01d1\17\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\12\22\1\u01d2\13\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\26\22\4\0\4\22"+
+    "\3\0\1\22\1\u016f\1\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\1\u01d3\25\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\4\22\1\u01d4\21\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\23\22\1\374\2\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\11\22\1\u01d5\14\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\3\22\1\374\22\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\5\22\1\u01d6\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\26\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\7\22"+
+    "\1\360\16\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\6\22\1\u01d7\17\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\1\u01d8"+
+    "\25\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\1\u0179\25\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\6\22\1\u01d9\17\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\3\22\1\u01da\22\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\7\22\1\u01db\16\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\3\22\1\250\22\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\12\22\1\u01dc\13\22"+
+    "\4\0\4\22\3\0\3\22\42\0\1\u0188\5\0\1\u0127"+
+    "\45\0\6\u0187\1\0\1\u01dd\1\0\1\u01dd\2\u0187\1\u01dd"+
+    "\4\u0187\2\u01dd\1\0\2\u01dd\1\0\1\u01dd\2\0\6\u01dd"+
+    "\1\u0187\1\u01dd\26\u0187\1\0\1\u01dd\1\0\1\u01dd\4\u0187"+
+    "\3\u01dd\3\u0187\17\0\1\u01de\141\0\1\u01df\123\0\1\u01e0"+
+    "\104\0\1\u0198\1\0\1\u01e1\44\0\1\u01e2\161\0\1\u01e3"+
+    "\74\0\1\u01e4\116\0\1\u01e5\114\0\1\u01e6\103\0\1\u0198"+
+    "\115\0\1\u0197\103\0\1\u01e7\116\0\1\u01e8\113\0\1\u0133"+
+    "\120\0\1\u01e9\77\0\1\u0195\123\0\1\u0195\103\0\1\u01ea"+
+    "\122\0\1\u01eb\35\0\1\u01ec\111\0\1\u01ed\155\0\1\u01ee"+
+    "\104\0\1\u01ef\111\0\1\u01f0\130\0\1\u01f1\66\0\1\u0195"+
+    "\125\0\1\u01f2\75\0\1\u01f3\121\0\1\u01f4\117\0\1\u01f5"+
+    "\114\0\1\u0198\100\0\1\u01f6\121\0\1\u0195\107\0\1\u01f7"+
+    "\100\0\1\u01f8\114\0\1\u01f9\104\0\1\u01fa\116\0\1\u01fb"+
+    "\122\0\1\u0195\77\0\1\u0195\110\0\1\u01fc\105\0\1\u01fd"+
+    "\120\0\1\u01e8\102\0\1\u01a2\134\0\1\u01fe\71\0\1\u01ff"+
+    "\14\0\1\u0200\77\0\1\u0198\113\0\1\u0201\103\0\1\u0202"+
+    "\103\0\1\u01bc\5\0\1\u014f\45\0\6\u01bb\1\0\1\u0203"+
+    "\1\0\1\u0203\2\u01bb\1\u0203\4\u01bb\2\u0203\1\0\2\u0203"+
+    "\1\0\1\u0203\2\0\6\u0203\1\u01bb\1\u0203\26\u01bb\1\0"+
+    "\1\u0203\1\0\1\u0203\4\u01bb\3\u0203\3\u01bb\17\0\1\u0204"+
+    "\143\0\1\u0205\120\0\1\u0206\132\0\1\u0207\52\0\1\u01c3"+
+    "\5\0\1\u0159\45\0\6\u01c2\1\0\1\u0208\1\0\1\u0208"+
+    "\2\u01c2\1\u0208\4\u01c2\2\u0208\1\0\2\u0208\1\0\1\u0208"+
+    "\2\0\6\u0208\1\u01c2\1\u0208\26\u01c2\1\0\1\u0208\1\0"+
+    "\1\u0208\4\u01c2\3\u0208\3\u01c2\17\0\1\u0209\73\0\1\17"+
+    "\2\0\1\17\4\u020a\1\17\1\0\4\17\2\0\2\17"+
+    "\2\u020a\17\0\2\17\2\u020a\3\17\2\u020a\10\17\1\u020a"+
+    "\2\17\1\u020a\3\17\4\0\3\u020a\1\17\3\0\3\17"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\1\u020b\25\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\1\u020c\25\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\5\22\1\242\20\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\4\22"+
+    "\1\u020d\21\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\10\22\1\u020e\15\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\22\22"+
+    "\1\242\3\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\12\22\1\u020f\13\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\12\22"+
+    "\1\u0210\13\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\6\22\1\u016f\17\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\17\22"+
+    "\1\371\6\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\u0211\1\17\26\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\10\22\1\u0212\15\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\12\22\1\u0213\13\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\22\22\1\u0214\3\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\11\22\1\361\14\22\4\0\4\22\3\0\3\22"+
+    "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+    "\2\0\4\22\17\0\1\22\1\17\7\22\1\u016b\16\22"+
+    "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\2\22\1\u0215\1\22"+
+    "\17\0\1\22\1\17\26\22\4\0\4\22\3\0\2\22"+
+    "\1\u0216\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\11\22\1\374"+
+    "\14\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\5\22\1\u0217\20\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\10\22\1\u0218"+
+    "\15\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\7\22\1\u0219\16\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\10\22\1\u021a"+
+    "\15\22\4\0\4\22\3\0\3\22\17\0\1\u0187\146\0"+
+    "\1\u021b\117\0\1\u01af\107\0\1\u0195\106\0\1\u0133\116\0"+
+    "\1\u01f9\103\0\1\u021c\107\0\1\u021d\107\0\1\u0198\107\0"+
+    "\1\u021e\121\0\1\u01b0\116\0\1\u0198\113\0\1\u021f\106\0"+
+    "\1\u0220\101\0\1\u0221\115\0\1\u0222\102\0\1\u0223\112\0"+
+    "\1\u0224\112\0\1\u0225\112\0\1\u0226\110\0\1\u0195\126\0"+
+    "\1\u01e2\75\0\1\u0227\111\0\1\u0228\117\0\1\u0229\103\0"+
+    "\1\u0133\105\0\1\u0134\115\0\1\u0195\105\0\1\u022a\113\0"+
+    "\1\u022b\115\0\1\u022c\46\0\1\u022d\146\0\1\u022e\117\0"+
+    "\1\u022f\111\0\1\u0230\103\0\1\u0231\121\0\1\u0232\52\0"+
+    "\1\u01bb\154\0\1\u0233\113\0\1\u0234\127\0\1\u0235\26\0"+
+    "\1\u01c2\73\0\1\17\2\0\1\17\4\22\1\17\1\0"+
+    "\4\17\2\0\2\17\2\22\17\0\2\17\2\22\3\17"+
+    "\2\22\10\17\1\22\2\17\1\22\3\17\4\0\3\22"+
+    "\1\17\3\0\3\17\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\5\22\1\u016b\20\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\12\22\1\u0162\13\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\14\22\1\u0236\11\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\6\22\1\u0237\17\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\5\22\1\374"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\26\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\6\22\1\u0238\17\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\3\22"+
+    "\1\u01cf\22\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+    "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+    "\17\0\1\22\1\17\5\22\1\372\20\22\4\0\4\22"+
+    "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+    "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\1\u0239"+
+    "\25\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\7\22\1\u023a\16\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\12\22\1\u023b"+
+    "\13\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\3\22\1\u023c\22\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\14\22\1\u023d"+
+    "\11\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\21\22\1\242\4\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\3\22\1\u0219"+
+    "\22\22\4\0\4\22\3\0\3\22\52\0\1\u023e\117\0"+
+    "\1\u0228\77\0\1\u023f\115\0\1\u0240\113\0\1\u0241\115\0"+
+    "\1\u0242\111\0\1\u0243\103\0\1\u01b7\105\0\1\u0244\130\0"+
+    "\1\u0245\72\0\1\u01a3\3\0\1\u0246\115\0\1\u0247\113\0"+
+    "\1\u01fa\102\0\1\u0198\110\0\1\u0133\116\0\1\u0195\122\0"+
+    "\1\u0248\76\0\1\u0249\113\0\1\u01f2\105\0\1\u0133\113\0"+
+    "\1\u024a\110\0\1\u024b\110\0\1\u0202\122\0\1\u01e1\101\0"+
+    "\1\u024c\40\0\26\u0234\1\u0195\63\u0234\102\0\1\u024d\7\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\12\22\1\u024e\13\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\12\22\1\u016b\13\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\12\22\1\u024f\13\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\5\22\1\374\20\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\14\22\1\u0250\11\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\3\22\1\u016f\22\22\4\0\4\22\3\0\3\22\1\0"+
+    "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+    "\4\22\17\0\1\22\1\17\6\22\1\u0121\17\22\4\0"+
+    "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+    "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+    "\12\22\1\242\13\22\4\0\4\22\3\0\3\22\62\0"+
+    "\1\u0241\102\0\1\u01f2\125\0\1\u0195\112\0\1\u0195\76\0"+
+    "\1\u0240\107\0\1\u01a9\112\0\1\u0251\46\0\1\u0252\157\0"+
+    "\1\u0253\100\0\1\u0196\111\0\1\u024a\114\0\1\u0254\111\0"+
+    "\1\u0240\116\0\1\u0255\135\0\1\u0256\10\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\10\22\1\u0257\15\22\4\0\4\22\3\0"+
+    "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+    "\2\22\2\0\4\22\17\0\1\22\1\17\3\22\1\371"+
+    "\22\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+    "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+    "\1\22\1\17\1\u023b\25\22\4\0\4\22\3\0\3\22"+
+    "\50\0\1\u01b0\114\0\1\u0258\117\0\1\u01f2\104\0\1\u01af"+
+    "\103\0\1\u0259\142\0\1\u025a\13\0\1\17\2\0\6\22"+
+    "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+    "\1\17\26\22\4\0\4\22\3\0\1\u023c\2\22\51\0"+
+    "\1\u025b\115\0\1\u0234\104\0\1\u0195\11\0\1\u01f9\30\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[40034];
+    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 =
+    "\13\0\2\1\1\0\2\1\1\11\4\1\1\11\4\1"+
+    "\2\11\4\1\1\11\22\1\2\11\3\1\1\11\1\1"+
+    "\1\11\1\1\1\11\1\1\1\11\1\1\1\11\5\1"+
+    "\1\11\10\1\1\11\2\1\1\11\2\1\1\11\1\1"+
+    "\1\11\5\1\1\11\2\1\1\11\1\1\3\11\3\1"+
+    "\3\11\1\1\1\11\15\1\2\0\1\11\3\1\2\0"+
+    "\1\11\62\1\1\11\2\1\1\11\4\0\1\11\2\0"+
+    "\1\11\26\0\3\1\2\11\5\0\1\11\2\0\2\1"+
+    "\1\0\73\1\60\0\1\1\2\0\1\11\5\0\1\11"+
+    "\1\1\1\11\45\1\1\0\1\11\1\0\1\1\15\0"+
+    "\1\11\45\0\1\1\3\0\1\11\2\0\1\1\1\0"+
+    "\1\11\30\1\15\0\1\1\20\0\1\1\16\0\21\1"+
+    "\33\0\11\1\4\0\1\1\12\0\3\1\6\0\1\1"+
+    "\2\0\1\11\1\0";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[603];
+    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;
+
+  /* user code: */
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	private static final int INTERNAL_IN_JS_MLC				= -8;
+
+	/**
+	 * Token type specifying we're in a JavaScript documentation comment.
+	 */
+	private static final int INTERNAL_IN_JS_COMMENT_DOCUMENTATION = -9;
+	
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	private static final int INTERNAL_IN_JS_STRING_INVALID	= -10;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	private static final int INTERNAL_IN_JS_STRING_VALID		= -11;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	private static final int INTERNAL_IN_JS_CHAR_INVALID	= -12;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	private static final int INTERNAL_IN_JS_CHAR_VALID		= -13;
+
+	private static final int INTERNAL_E4X = -14;
+
+	private static final int INTERNAL_E4X_INTAG = -15;
+
+	private static final int INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION = -16;
+
+	private static final int INTERNAL_IN_E4X_COMMENT = -17;
+
+	private static final int INTERNAL_E4X_DTD = -18;
+
+	private static final int INTERNAL_E4X_DTD_INTERNAL = -19;
+
+	private static final int INTERNAL_E4X_ATTR_SINGLE = -20;
+
+	private static final int INTERNAL_E4X_ATTR_DOUBLE = -21;
+
+	private static final int INTERNAL_E4X_MARKUP_CDATA = -22;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+	/**
+	 * Whether we're in an internal DTD.  Only valid if in an e4x DTD.
+	 */
+	private boolean e4x_inInternalDtd;
+
+	/**
+	 * The previous e4x state.  Only valid if in an e4x state.
+	 */
+	private int e4x_prevState;
+
+	/**
+	 * The version of JavaScript being highlighted.
+	 */
+	private static String jsVersion;
+
+	/**
+	 * Whether e4x is being highlighted.
+	 */
+	private static boolean e4xSupported;
+
+	/**
+	 * Language state set on JS tokens.  Must be 0.
+	 */
+	private static final int LANG_INDEX_DEFAULT	= 0;
+
+	/**
+	 * Language state set on E4X tokens.
+	 */
+	private static final int LANG_INDEX_E4X = 1;
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public JavaScriptTokenMaker() {
+		super();
+	}
+
+
+	static {
+		jsVersion = "1.0";
+		e4xSupported = true;
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the closest {@link TokenTypes "standard" token type} for a given
+	 * "internal" token type (e.g. one whose value is <code>< 0</code>).
+	 * 
+	 */
+	public int getClosestStandardTokenTypeForInternalType(int type) {
+		switch (type) {
+			case INTERNAL_IN_JS_MLC:
+				return TokenTypes.COMMENT_MULTILINE;
+			case INTERNAL_IN_JS_COMMENT_DOCUMENTATION:
+				return TokenTypes.COMMENT_DOCUMENTATION;
+			case INTERNAL_IN_JS_STRING_INVALID:
+			case INTERNAL_IN_JS_STRING_VALID:
+			case INTERNAL_IN_JS_CHAR_INVALID:
+			case INTERNAL_IN_JS_CHAR_VALID:
+				return TokenTypes.LITERAL_STRING_DOUBLE_QUOTE;
+		}
+		return type;
+	}
+
+
+	/**
+	 * Returns the JavaScript version being highlighted.
+	 *
+	 * @return Supported JavaScript version.
+	 * @see #isJavaScriptCompatible(String)
+	 */
+	public static String getJavaScriptVersion() {
+		return jsVersion;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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;
+		validJSString = true;
+		e4x_prevState = YYINITIAL;
+		e4x_inInternalDtd = false;
+		int languageIndex = LANG_INDEX_DEFAULT;
+
+		// Start off in the proper state.
+		int state = YYINITIAL;
+		switch (initialTokenType) {
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				break;
+			case INTERNAL_IN_JS_COMMENT_DOCUMENTATION:
+				state = JS_DOCCOMMENT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				validJSString = false;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				validJSString = false;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				break;
+			case INTERNAL_E4X:
+				state = E4X;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			case INTERNAL_E4X_INTAG:
+				state = E4X_INTAG;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			case INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION:
+				state = E4X_PI;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			case INTERNAL_E4X_DTD:
+				state = E4X_DTD;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			case INTERNAL_E4X_DTD_INTERNAL:
+				state = E4X_DTD;
+				e4x_inInternalDtd = true;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			case INTERNAL_E4X_ATTR_SINGLE:
+				state = E4X_INATTR_SINGLE;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			case INTERNAL_E4X_ATTR_DOUBLE:
+				state = E4X_INATTR_DOUBLE;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			case INTERNAL_E4X_MARKUP_CDATA:
+				state = E4X_CDATA;
+				languageIndex = LANG_INDEX_E4X;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_E4X_COMMENT - prevState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_E4X_COMMENT:
+							state = E4X_COMMENT;
+							break;
+					}
+					e4x_prevState = -initialTokenType&0xff;
+					languageIndex = LANG_INDEX_E4X;
+				}
+				else { // Shouldn't happen
+					state = Token.NULL;
+				}
+		}
+
+		setLanguageIndex(languageIndex);
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Returns whether e4x is being highlighted.
+	 *
+	 * @return Whether e4x is being highlighted.
+	 * @see #setE4xSupported(boolean)
+	 */
+	public static boolean isE4xSupported() {
+		return e4xSupported;
+	}
+
+
+	/**
+	 * Returns whether features for a specific JS version should be honored
+	 * while highlighting.
+	 * 
+	 * @param version JavaScript version required 
+	 * @return Whether the JavaScript version is the same or greater than
+	 *         version required. 
+	 */
+	public static boolean isJavaScriptCompatible(String version) {
+		return jsVersion.compareTo(version) >= 0;
+	}
+
+
+	/**
+	 * Sets whether e4x should be highlighted.  A repaint should be forced on
+	 * all <code>RSyntaxTextArea</code>s editing JavaScript if this property
+	 * is changed to see the difference.
+	 *
+	 * @param supported Whether e4x should be highlighted.
+	 * @see #isE4xSupported()
+	 */
+	public static void setE4xSupported(boolean supported) {
+		e4xSupported = supported;
+	}
+
+
+	/**
+	 * Set the supported JavaScript version because some keywords were
+	 * introduced on or after this version.
+	 *
+	 * @param javaScriptVersion The version of JavaScript to support, such as
+	 *        "<code>1.5</code>" or "<code>1.6</code>".
+	 * @see #isJavaScriptCompatible(String)
+	 * @see #getJavaScriptVersion()
+	 */
+	public static void setJavaScriptVersion(String javaScriptVersion) {
+		jsVersion = javaScriptVersion;
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 JavaScriptTokenMaker(java.io.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 JavaScriptTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 172) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 34: 
+          { start = zzMarkedPos-1; yybegin(E4X_INATTR_SINGLE);
+          }
+        case 73: break;
+        case 33: 
+          { start = zzMarkedPos-1; yybegin(E4X_INATTR_DOUBLE);
+          }
+        case 74: break;
+        case 36: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 75: break;
+        case 71: 
+          { addToken(Token.RESERVED_WORD_2);
+          }
+        case 76: break;
+        case 26: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_DTD); addEndToken(e4x_inInternalDtd ? INTERNAL_E4X_DTD_INTERNAL : INTERNAL_E4X_DTD); return firstToken;
+          }
+        case 77: break;
+        case 15: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+          }
+        case 78: break;
+        case 3: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 79: break;
+        case 17: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+          }
+        case 80: break;
+        case 41: 
+          { int start = zzStartRead;
+										int operatorLen = yycharat(0)=='+' ? 2 : 1;
+										int yylen = yylength(); // Cache before first addToken() invalidates it
+										//System.out.println("'" + yytext() + "': " + yylength() + ", " + (operatorLen+1));
+										addToken(zzStartRead,zzStartRead+operatorLen-1, Token.OPERATOR);
+										if (yylen>operatorLen+1) {
+											//System.out.println((start+operatorLen) + ", " + (zzMarkedPos-2));
+											addToken(start+operatorLen,zzMarkedPos-2, Token.WHITESPACE);
+										}
+										zzStartRead = zzCurrentPos = zzMarkedPos = zzMarkedPos - 1;
+										if (isE4xSupported()) {
+											// Scanning will continue with "<" as markup tag start
+											yybegin(E4X, LANG_INDEX_E4X);
+										}
+										// Found e4x (or syntax error) but option not enabled;
+										// Scanning will continue at "<" as operator
+          }
+        case 81: break;
+        case 64: 
+          { addToken(Token.FUNCTION);
+          }
+        case 82: break;
+        case 49: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos;
+          }
+        case 83: break;
+        case 44: 
+          { /* Skip all escaped chars. */
+          }
+        case 84: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 85: break;
+        case 68: 
+          { start = zzStartRead; e4x_prevState = zzLexicalState; yybegin(E4X_COMMENT);
+          }
+        case 86: break;
+        case 60: 
+          { int temp=zzStartRead; yybegin(E4X); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.MARKUP_CDATA_DELIMITER);
+          }
+        case 87: break;
+        case 58: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(E4X_INTAG);
+          }
+        case 88: break;
+        case 46: 
+          { /* Invalid latin-1 character \xXX */ validJSString = false;
+          }
+        case 89: break;
+        case 61: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 90: break;
+        case 52: 
+          { start = zzMarkedPos-2; yybegin(E4X_PI);
+          }
+        case 91: break;
+        case 35: 
+          { yybegin(E4X_INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 92: break;
+        case 13: 
+          { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(YYINITIAL);
+          }
+        case 93: break;
+        case 19: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 94: break;
+        case 23: 
+          { yybegin(YYINITIAL, LANG_INDEX_DEFAULT); addToken(Token.IDENTIFIER);
+          }
+        case 95: break;
+        case 45: 
+          { /* Invalid Unicode character \\uXXXX */ validJSString = false;
+          }
+        case 96: break;
+        case 70: 
+          { int temp = zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_DTD); start = temp; e4x_prevState = zzLexicalState; yybegin(E4X_COMMENT);
+          }
+        case 97: break;
+        case 63: 
+          { if(e4xSupported){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+          }
+        case 98: break;
+        case 59: 
+          { int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); start = temp; yybegin(e4x_prevState);
+          }
+        case 99: break;
+        case 7: 
+          { addToken(Token.OPERATOR);
+          }
+        case 100: break;
+        case 53: 
+          { yybegin(E4X); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION);
+          }
+        case 101: break;
+        case 48: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION);
+          }
+        case 102: break;
+        case 18: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JS_COMMENT_DOCUMENTATION); return firstToken;
+          }
+        case 103: break;
+        case 25: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); addEndToken(INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+          }
+        case 104: break;
+        case 5: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 105: break;
+        case 42: 
+          { addToken(isE4xSupported() ? Token.MARKUP_TAG_ATTRIBUTE : Token.ERROR_IDENTIFIER);
+          }
+        case 106: break;
+        case 65: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 107: break;
+        case 55: 
+          { start = zzMarkedPos-3; yybegin(JS_DOCCOMMENT);
+          }
+        case 108: break;
+        case 9: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING);
+          }
+        case 109: break;
+        case 51: 
+          { start = zzMarkedPos-2; e4x_inInternalDtd = false; yybegin(E4X_DTD);
+          }
+        case 110: break;
+        case 24: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_E4X_COMMENT - e4x_prevState); return firstToken;
+          }
+        case 111: break;
+        case 10: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR);
+          }
+        case 112: break;
+        case 28: 
+          { e4x_inInternalDtd = true;
+          }
+        case 113: break;
+        case 67: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos;
+          }
+        case 114: break;
+        case 40: 
+          { start = zzMarkedPos-2; yybegin(JS_MLC);
+          }
+        case 115: break;
+        case 38: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 116: break;
+        case 72: 
+          { addToken(Token.MARKUP_CDATA_DELIMITER); start = zzMarkedPos; yybegin(E4X_CDATA);
+          }
+        case 117: break;
+        case 31: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */
+          }
+        case 118: break;
+        case 2: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 119: break;
+        case 69: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos;
+          }
+        case 120: break;
+        case 32: 
+          { yybegin(E4X); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 121: break;
+        case 22: 
+          { addToken(Token.MARKUP_ENTITY_REFERENCE);
+          }
+        case 122: break;
+        case 56: 
+          { if(isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+          }
+        case 123: break;
+        case 62: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 124: break;
+        case 4: 
+          { addNullToken(); return firstToken;
+          }
+        case 125: break;
+        case 43: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 126: break;
+        case 47: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 127: break;
+        case 57: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 128: break;
+        case 21: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(E4X_INTAG);
+          }
+        case 129: break;
+        case 8: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 130: break;
+        case 30: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 131: break;
+        case 66: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos;
+          }
+        case 132: break;
+        case 16: 
+          { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(YYINITIAL);
+          }
+        case 133: break;
+        case 39: 
+          { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT);
+          }
+        case 134: break;
+        case 20: 
+          { addEndToken(INTERNAL_E4X); return firstToken;
+          }
+        case 135: break;
+        case 12: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+          }
+        case 136: break;
+        case 37: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 137: break;
+        case 50: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(E4X_INTAG);
+          }
+        case 138: break;
+        case 54: 
+          { boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+          }
+        case 139: break;
+        case 27: 
+          { if (!e4x_inInternalDtd) { yybegin(E4X); addToken(start,zzStartRead, Token.MARKUP_DTD); }
+          }
+        case 140: break;
+        case 6: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 141: break;
+        case 29: 
+          { e4x_inInternalDtd = false;
+          }
+        case 142: break;
+        case 14: 
+          { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 143: break;
+        case 1: 
+          { 
+          }
+        case 144: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case JS_STRING: {
+              addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+            }
+            case 604: break;
+            case E4X: {
+              addEndToken(INTERNAL_E4X); return firstToken;
+            }
+            case 605: break;
+            case E4X_INTAG: {
+              addToken(start,zzStartRead-1, INTERNAL_E4X_INTAG); return firstToken;
+            }
+            case 606: break;
+            case E4X_PI: {
+              addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); addEndToken(INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+            }
+            case 607: break;
+            case JS_MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+            }
+            case 608: break;
+            case JS_CHAR: {
+              addToken(start,zzStartRead-1, Token.ERROR_CHAR); addNullToken(); return firstToken;
+            }
+            case 609: break;
+            case JS_EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+            }
+            case 610: break;
+            case E4X_COMMENT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_E4X_COMMENT - e4x_prevState); return firstToken;
+            }
+            case 611: break;
+            case JS_DOCCOMMENT: {
+              yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JS_COMMENT_DOCUMENTATION); return firstToken;
+            }
+            case 612: break;
+            case E4X_DTD: {
+              addToken(start,zzStartRead-1, Token.MARKUP_DTD); addEndToken(e4x_inInternalDtd ? INTERNAL_E4X_DTD_INTERNAL : INTERNAL_E4X_DTD); return firstToken;
+            }
+            case 613: break;
+            case E4X_INATTR_SINGLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_E4X_ATTR_SINGLE); return firstToken;
+            }
+            case 614: break;
+            case E4X_INATTR_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_E4X_ATTR_DOUBLE); return firstToken;
+            }
+            case 615: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 616: break;
+            case E4X_CDATA: {
+              addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addEndToken(INTERNAL_E4X_MARKUP_CDATA); return firstToken;
+            }
+            case 617: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.flex
new file mode 100644
index 0000000..2bfb4db
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.flex
@@ -0,0 +1,754 @@
+/*
+ * 11/13/2004
+ *
+ * JavaTokenMaker.java - Scanner for the Java programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Java programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated JavaTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class JavaTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public JavaTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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}|"_")
+Underscores						= ([_]+)
+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							= ("\\"(([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}[\"])
+
+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
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"abstract"|
+	"assert" |
+	"break"	 |
+	"case"	 |
+	"catch"	 |
+	"class"	 |
+	"const"	 |
+	"continue" |
+	"default" |
+	"do"	 |
+	"else"	 |
+	"enum"	 |
+	"extends" |
+	"final"	 |
+	"finally" |
+	"for"	 |
+	"goto"	 |
+	"if"	 |
+	"implements" |
+	"import" |
+	"instanceof" |
+	"interface" |
+	"native" |
+	"new"	 |
+	"null"	 |
+	"package" |
+	"private" |
+	"protected" |
+	"public" |
+	"static" |
+	"strictfp" |
+	"super"	 |
+	"switch" |
+	"synchronized" |
+	"this"	 |
+	"throw"	 |
+	"throws" |
+	"transient" |
+	"try"	 |
+	"void"	 |
+	"volatile" |
+	"while"					{ addToken(Token.RESERVED_WORD); }
+	"return"				{ addToken(Token.RESERVED_WORD_2); }
+
+	/* Data types. */
+	"boolean" |
+	"byte" |
+	"char" |
+	"double" |
+	"float" |
+	"int" |
+	"long" |
+	"short"					{ addToken(Token.DATA_TYPE); }
+
+	/* Booleans. */
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+	/* java.lang classes */
+	"Appendable" |
+	"AutoCloseable" |
+	"CharSequence" |
+	"Cloneable" |
+	"Comparable" |
+	"Iterable" |
+	"Readable" |
+	"Runnable" |
+	"Thread.UncaughtExceptionHandler" |
+	"Boolean" |
+	"Byte" |
+	"Character" |
+	"Character.Subset" | 
+	"Character.UnicodeBlock" | 
+	"Class" |
+	"ClassLoader" |
+	"Compiler" |
+	"Double" |
+	"Enum" |
+	"Float" |
+	"InheritableThreadLocal" |
+	"Integer" |
+	"Long" |
+	"Math" |
+	"Number" |
+	"Object" |
+	"Package" |
+	"Process" |
+	"ProcessBuilder" |
+	"ProcessBuilder.Redirect" |
+	"Runtime" |
+	"RuntimePermission" |
+	"SecurityManager" |
+	"Short" |
+	"StackTraceElement" |
+	"StrictMath" |
+	"String" |
+	"StringBuffer" |
+	"StringBuilder" |
+	"System" |
+	"Thread" |
+	"ThreadGroup" |
+	"ThreadLocal" |
+	"Throwable" |
+	"Void" |
+	"Character.UnicodeScript" |
+	"ProcessBuilder.Redirect.Type" |
+	"Thread.State" |
+	"ArithmeticException" |
+	"ArrayIndexOutOfBoundsException" |
+	"ArrayStoreException" |
+	"ClassCastException" |
+	"ClassNotFoundException" |
+	"CloneNotSupportedException" |
+	"EnumConstantNotPresentException" |
+	"Exception" |
+	"IllegalAccessException" |
+	"IllegalArgumentException" |
+	"IllegalMonitorStateException" |
+	"IllegalStateException" |
+	"IllegalThreadStateException" |
+	"IndexOutOfBoundsException" |
+	"InstantiationException" |
+	"InterruptedException" |
+	"NegativeArraySizeException" |
+	"NoSuchFieldException" |
+	"NoSuchMethodException" |
+	"NullPointerException" |
+	"NumberFormatException" |
+	"RuntimeException" |
+	"SecurityException" |
+	"StringIndexOutOfBoundsException" |
+	"TypeNotPresentException" |
+	"UnsupportedOperationException" |
+	"AbstractMethodError" |
+	"AssertionError" |
+	"ClassCircularityError" |
+	"ClassFormatError" |
+	"Error" |
+	"ExceptionInInitializerError" |
+	"IllegalAccessError" |
+	"IncompatibleClassChangeError" |
+	"InstantiationError" |
+	"InternalError" |
+	"LinkageError" |
+	"NoClassDefFoundError" |
+	"NoSuchFieldError" |
+	"NoSuchMethodError" |
+	"OutOfMemoryError" |
+	"StackOverflowError" |
+	"ThreadDeath" |
+	"UnknownError" |
+	"UnsatisfiedLinkError" |
+	"UnsupportedClassVersionError" |
+	"VerifyError" |
+	"VirtualMachineError" |
+
+	/* java.io classes*/
+    "Closeable" |
+    "DataInput" |
+    "DataOutput" |
+    "Externalizable" |
+    "FileFilter" |
+    "FilenameFilter" |
+    "Flushable" |
+    "ObjectInput" |
+    "ObjectInputValidation" |
+    "ObjectOutput" |
+    "ObjectStreamConstants" |
+    "Serializable" |
+
+    "BufferedInputStream" |
+    "BufferedOutputStream" |
+    "BufferedReader" |
+    "BufferedWriter" |
+    "ByteArrayInputStream" |
+    "ByteArrayOutputStream" |
+    "CharArrayReader" |
+    "CharArrayWriter" |
+    "Console" |
+    "DataInputStream" |
+    "DataOutputStream" |
+    "File" |
+    "FileDescriptor" |
+    "FileInputStream" |
+    "FileOutputStream" |
+    "FilePermission" |
+    "FileReader" |
+    "FileWriter" |
+    "FilterInputStream" |
+    "FilterOutputStream" |
+    "FilterReader" |
+    "FilterWriter" |
+    "InputStream" |
+    "InputStreamReader" |
+    "LineNumberInputStream" |
+    "LineNumberReader" |
+    "ObjectInputStream" |
+    "ObjectInputStream.GetField" |
+    "ObjectOutputStream" |
+    "ObjectOutputStream.PutField" |
+    "ObjectStreamClass" |
+    "ObjectStreamField" |
+    "OutputStream" |
+    "OutputStreamWriter" |
+    "PipedInputStream" |
+    "PipedOutputStream" |
+    "PipedReader" |
+    "PipedWriter" |
+    "PrintStream" |
+    "PrintWriter" |
+    "PushbackInputStream" |
+    "PushbackReader" |
+    "RandomAccessFile" |
+    "Reader" |
+    "SequenceInputStream" |
+    "SerializablePermission" |
+    "StreamTokenizer" |
+    "StringBufferInputStream" |
+    "StringReader" |
+    "StringWriter" |
+    "Writer" |
+
+    "CharConversionException" |
+    "EOFException" |
+    "FileNotFoundException" |
+    "InterruptedIOException" |
+    "InvalidClassException" |
+    "InvalidObjectException" |
+    "IOException" |
+    "NotActiveException" |
+    "NotSerializableException" |
+    "ObjectStreamException" |
+    "OptionalDataException" |
+    "StreamCorruptedException" |
+    "SyncFailedException" |
+    "UnsupportedEncodingException" |
+    "UTFDataFormatException" |
+    "WriteAbortedException" |
+
+    "IOError" |
+
+	/* java.util classes */
+    "Collection" |
+    "Comparator" |
+    "Deque" |
+    "Enumeration" |
+    "EventListener" |
+    "Formattable" |
+    "Iterator" |
+    "List" |
+    "ListIterator" |
+    "Map" |
+    "Map.Entry" |
+    "NavigableMap" |
+    "NavigableSet" |
+    "Observer" |
+    "Queue" |
+    "RandomAccess" |
+    "Set" |
+    "SortedMap" |
+    "SortedSet" |
+
+    "AbstractCollection" |
+    "AbstractList" |
+    "AbstractMap" |
+    "AbstractMap.SimpleEntry" |
+    "AbstractMap.SimpleImmutableEntry" |
+    "AbstractQueue" |
+    "AbstractSequentialList" |
+    "AbstractSet" |
+    "ArrayDeque" |
+    "ArrayList" |
+    "Arrays" |
+    "BitSet" |
+    "Calendar" |
+    "Collections" |
+    "Currency" |
+    "Date" |
+    "Dictionary" |
+    "EnumMap" |
+    "EnumSet" |
+    "EventListenerProxy" |
+    "EventObject" |
+    "FormattableFlags" |
+    "Formatter" |
+    "GregorianCalendar" |
+    "HashMap" |
+    "HashSet" |
+    "Hashtable" |
+    "IdentityHashMap" |
+    "LinkedHashMap" |
+    "LinkedHashSet" |
+    "LinkedList" |
+    "ListResourceBundle" |
+    "Locale" |
+    "Locale.Builder" |
+    "Objects" |
+    "Observable" |
+    "PriorityQueue" |
+    "Properties" |
+    "PropertyPermission" |
+    "PropertyResourceBundle" |
+    "Random" |
+    "ResourceBundle" |
+    "ResourceBundle.Control" |
+    "Scanner" |
+    "ServiceLoader" |
+    "SimpleTimeZone" |
+    "Stack" |
+    "StringTokenizer" |
+    "Timer" |
+    "TimerTask" |
+    "TimeZone" |
+    "TreeMap" |
+    "TreeSet" |
+    "UUID" |
+    "Vector" |
+    "WeakHashMap" |
+
+    "Formatter.BigDecimalLayoutForm" |
+    "Locale.Category" |
+
+    "ConcurrentModificationException" |
+    "DuplicateFormatFlagsException" |
+    "EmptyStackException" |
+    "FormatFlagsConversionMismatchException" |
+    "FormatterClosedException" |
+    "IllegalFormatCodePointException" |
+    "IllegalFormatConversionException" |
+    "IllegalFormatException" |
+    "IllegalFormatFlagsException" |
+    "IllegalFormatPrecisionException" |
+    "IllegalFormatWidthException" |
+    "IllformedLocaleException" |
+    "InputMismatchException" |
+    "InvalidPropertiesFormatException" |
+    "MissingFormatArgumentException" |
+    "MissingFormatWidthException" |
+    "MissingResourceException" |
+    "NoSuchElementException" |
+    "TooManyListenersException" |
+    "UnknownFormatConversionException" |
+    "UnknownFormatFlagsException" |
+
+    "ServiceConfigurationError" 		{ addToken(Token.FUNCTION); }
+
+	{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. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+	{DocCommentBegin}				{ start = zzMarkedPos-3; yybegin(DOCCOMMENT); }
+	{LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+	/* Annotations. */
+	{Annotation}					{ addToken(Token.ANNOTATION); }
+
+	/* Separators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{BinaryLiteral}					{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as identifiers. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<MLC> {
+
+	[^hwf\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<DOCCOMMENT> {
+
+	[^hwf\@\{\n\<\*]+			{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
+	[hwf]						{}
+
+	"@"{BlockTag}				{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+	"@"							{}
+	"{@"{InlineTag}[^\}]*"}"	{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+	"{"							{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken; }
+	"<"[/]?({Letter}[^\>]*)?">"	{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos; }
+	\<							{}
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION); }
+	\*							{}
+	<<EOF>>						{ yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken; }
+
+}
+
+
+<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; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.java
new file mode 100644
index 0000000..3abe535
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.java
@@ -0,0 +1,4966 @@
+/* The following code was generated by JFlex 1.4.1 on 12/10/11 12:57 AM */
+
+/*
+ * 11/13/2004
+ *
+ * JavaTokenMaker.java - Scanner for the Java programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Java programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated JavaTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class JavaTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int EOL_COMMENT = 3;
+  public static final int DOCCOMMENT = 2;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\23\1\11\1\0\1\23\1\20\22\0\1\23\1\53\1\16"+
+    "\1\21\1\22\1\53\1\55\1\10\2\77\1\25\1\46\1\45\1\34"+
+    "\1\35\1\24\1\4\1\5\2\17\4\7\2\3\1\56\1\45\1\47"+
+    "\1\50\1\52\1\54\1\76\1\101\1\27\1\6\1\67\1\33\1\32"+
+    "\1\115\1\107\1\104\2\1\1\26\1\110\1\111\1\112\1\114\1\120"+
+    "\1\74\1\102\1\105\1\106\1\116\1\117\1\31\1\1\1\121\1\77"+
+    "\1\12\1\77\1\51\1\2\1\0\1\41\1\30\1\63\1\61\1\40"+
+    "\1\15\1\72\1\57\1\65\1\113\1\75\1\42\1\66\1\14\1\60"+
+    "\1\62\1\103\1\37\1\43\1\36\1\13\1\71\1\70\1\64\1\73"+
+    "\1\100\1\122\1\51\1\44\1\54\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 =
+    "\4\0\1\1\1\2\2\3\1\2\1\4\1\5\2\2"+
+    "\1\6\1\1\1\7\2\10\5\2\1\10\7\2\1\11"+
+    "\1\2\5\10\11\2\1\12\16\2\1\13\1\14\5\13"+
+    "\1\15\10\13\1\16\3\13\1\1\2\17\1\20\1\3"+
+    "\1\17\1\20\2\17\1\21\2\17\5\2\1\4\1\22"+
+    "\1\0\1\4\7\2\2\6\1\23\1\24\1\25\40\2"+
+    "\1\0\1\10\1\2\1\26\10\2\1\26\14\2\1\12"+
+    "\56\2\2\0\1\27\4\0\1\30\2\0\1\31\22\0"+
+    "\1\1\1\3\1\20\1\0\2\21\1\3\1\21\10\2"+
+    "\1\4\1\32\2\4\1\22\1\4\5\2\1\6\1\33"+
+    "\1\6\1\34\61\2\1\35\17\2\1\1\10\2\1\36"+
+    "\37\2\1\36\30\2\37\0\1\1\2\17\12\2\1\4"+
+    "\3\2\1\6\1\37\3\2\1\36\3\2\1\36\2\2"+
+    "\1\35\4\2\2\36\6\2\1\40\37\2\1\1\51\2"+
+    "\1\0\32\2\2\0\1\41\2\0\1\42\10\0\1\43"+
+    "\17\0\1\44\1\1\2\2\1\36\10\2\1\4\1\26"+
+    "\1\6\35\2\1\26\25\2\1\1\11\2\1\36\27\2"+
+    "\1\36\6\2\1\0\32\2\35\0\1\1\14\2\1\4"+
+    "\1\2\1\6\1\36\33\2\1\45\16\2\1\36\1\1"+
+    "\11\2\1\36\26\2\1\36\10\2\1\0\2\2\1\36"+
+    "\10\2\1\36\13\2\22\0\13\2\1\0\37\2\1\36"+
+    "\2\2\1\1\40\2\1\0\11\2\1\0\23\2\1\36"+
+    "\7\2\2\0\1\43\6\0\12\2\2\0\75\2\2\0"+
+    "\7\2\1\0\33\2\11\0\4\2\1\36\4\2\2\0"+
+    "\5\2\1\36\10\2\1\36\6\2\1\36\43\2\2\0"+
+    "\6\2\1\36\26\2\5\0\4\2\1\0\2\2\1\36"+
+    "\2\0\3\2\1\0\51\2\2\0\27\2\5\0\3\2"+
+    "\2\0\1\2\2\0\3\2\1\0\1\36\11\2\1\36"+
+    "\14\2\1\36\12\2\2\0\14\2\1\36\4\2\2\0"+
+    "\2\2\2\0\1\2\2\0\3\2\1\0\5\2\1\36"+
+    "\3\2\1\0\1\2\1\36\2\2\1\36\16\2\1\0"+
+    "\13\2\1\36\3\2\1\36\4\2\2\0\1\2\1\0"+
+    "\2\2\1\0\2\2\1\36\6\2\1\0\12\2\1\0"+
+    "\21\2\2\0\3\2\1\0\4\2\1\36\1\2\1\0"+
+    "\12\2\1\0\15\2\1\36\2\0\3\2\1\0\3\2"+
+    "\1\0\1\2\1\0\11\2\1\0\12\2\2\0\2\2"+
+    "\1\0\2\2\1\0\1\2\1\0\7\2\1\0\6\2"+
+    "\2\0\1\2\1\0\1\2\1\0\1\2\1\0\4\2"+
+    "\1\0\3\2\1\36\1\2\3\0\1\2\1\0\1\2"+
+    "\1\0\1\2\1\0\2\2\1\0\3\2\1\0\1\36"+
+    "\3\0\1\2\1\0\1\2\2\0\2\2\1\0\2\2"+
+    "\5\0\1\2\1\0\1\2\2\0\1\2\6\0\1\2"+
+    "\1\0\1\2\16\0\1\36\23\0";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[1725];
+    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\123\0\246\0\371\0\u014c\0\u019f\0\u01f2\0\u0245"+
+    "\0\u0298\0\u02eb\0\u033e\0\u0391\0\u03e4\0\u0437\0\u033e\0\u048a"+
+    "\0\u04dd\0\u0530\0\u0583\0\u05d6\0\u0629\0\u067c\0\u06cf\0\u0722"+
+    "\0\u0775\0\u07c8\0\u081b\0\u086e\0\u08c1\0\u0914\0\u0967\0\u033e"+
+    "\0\u033e\0\u09ba\0\u0a0d\0\u0a60\0\u033e\0\u0ab3\0\u0b06\0\u0b59"+
+    "\0\u0bac\0\u0bff\0\u0c52\0\u0ca5\0\u0cf8\0\u0d4b\0\u0d9e\0\u0df1"+
+    "\0\u0e44\0\u0e97\0\u0eea\0\u0f3d\0\u0f90\0\u0fe3\0\u1036\0\u1089"+
+    "\0\u10dc\0\u112f\0\u1182\0\u11d5\0\u1228\0\u127b\0\u12ce\0\u033e"+
+    "\0\u1321\0\u1374\0\u13c7\0\u141a\0\u146d\0\u033e\0\u14c0\0\u1513"+
+    "\0\u1566\0\u15b9\0\u160c\0\u165f\0\u16b2\0\u1705\0\u033e\0\u1758"+
+    "\0\u17ab\0\u17fe\0\u1851\0\u18a4\0\u18f7\0\u18a4\0\u18a4\0\u194a"+
+    "\0\u199d\0\u19f0\0\u1a43\0\u1a96\0\u1ae9\0\u1b3c\0\u1b8f\0\u1be2"+
+    "\0\u1c35\0\u1c88\0\u1cdb\0\u1d2e\0\u033e\0\u1d81\0\u1dd4\0\u1e27"+
+    "\0\u1e7a\0\u1ecd\0\u1f20\0\u1f73\0\u1fc6\0\u2019\0\u206c\0\u20bf"+
+    "\0\u033e\0\u033e\0\u2112\0\u2165\0\u21b8\0\u220b\0\u225e\0\u22b1"+
+    "\0\u2304\0\u2357\0\u23aa\0\u23fd\0\u2450\0\u24a3\0\u24f6\0\u2549"+
+    "\0\u259c\0\u25ef\0\u2642\0\u2695\0\u26e8\0\u273b\0\u278e\0\u27e1"+
+    "\0\u2834\0\u2887\0\u28da\0\u292d\0\u2980\0\u29d3\0\u2a26\0\u2a79"+
+    "\0\u2acc\0\u2b1f\0\u2b72\0\u0530\0\u2bc5\0\u2c18\0\u2c6b\0\u2cbe"+
+    "\0\u2d11\0\u2d64\0\u2db7\0\u2e0a\0\u2e5d\0\u2eb0\0\u2f03\0\u019f"+
+    "\0\u2f56\0\u2fa9\0\u2ffc\0\u304f\0\u30a2\0\u30f5\0\u3148\0\u319b"+
+    "\0\u31ee\0\u3241\0\u3294\0\u32e7\0\u333a\0\u338d\0\u33e0\0\u3433"+
+    "\0\u3486\0\u34d9\0\u352c\0\u357f\0\u35d2\0\u3625\0\u3678\0\u36cb"+
+    "\0\u371e\0\u3771\0\u37c4\0\u3817\0\u386a\0\u38bd\0\u3910\0\u3963"+
+    "\0\u39b6\0\u3a09\0\u3a5c\0\u3aaf\0\u3b02\0\u3b55\0\u3ba8\0\u3bfb"+
+    "\0\u3c4e\0\u3ca1\0\u3cf4\0\u3d47\0\u3d9a\0\u3ded\0\u3e40\0\u3e93"+
+    "\0\u3ee6\0\u3f39\0\u3f8c\0\u3fdf\0\u4032\0\u4085\0\u40d8\0\u412b"+
+    "\0\u417e\0\u41d1\0\u4224\0\u4277\0\u42ca\0\u033e\0\u431d\0\u4370"+
+    "\0\u43c3\0\u4416\0\u033e\0\u4469\0\u44bc\0\u033e\0\u450f\0\u4562"+
+    "\0\u45b5\0\u4608\0\u465b\0\u46ae\0\u4701\0\u4754\0\u47a7\0\u47fa"+
+    "\0\u484d\0\u48a0\0\u48f3\0\u4946\0\u4999\0\u49ec\0\u4a3f\0\u4a92"+
+    "\0\u4ae5\0\u4b38\0\u4b8b\0\u4bde\0\u4c31\0\u18a4\0\u4c84\0\u4cd7"+
+    "\0\u4d2a\0\u4d7d\0\u4dd0\0\u4e23\0\u4e76\0\u4ec9\0\u4f1c\0\u4f6f"+
+    "\0\u4fc2\0\u033e\0\u5015\0\u5068\0\u1d81\0\u50bb\0\u510e\0\u5161"+
+    "\0\u51b4\0\u5207\0\u525a\0\u52ad\0\u033e\0\u5300\0\u5353\0\u53a6"+
+    "\0\u53f9\0\u544c\0\u549f\0\u54f2\0\u5545\0\u5598\0\u55eb\0\u563e"+
+    "\0\u5691\0\u56e4\0\u5737\0\u578a\0\u57dd\0\u5830\0\u5883\0\u58d6"+
+    "\0\u5929\0\u597c\0\u59cf\0\u5a22\0\u5a75\0\u5ac8\0\u5b1b\0\u5b6e"+
+    "\0\u5bc1\0\u5c14\0\u5c67\0\u5cba\0\u5d0d\0\u5d60\0\u5db3\0\u5e06"+
+    "\0\u5e59\0\u5eac\0\u5eff\0\u5f52\0\u5fa5\0\u5ff8\0\u604b\0\u609e"+
+    "\0\u60f1\0\u6144\0\u6197\0\u61ea\0\u623d\0\u6290\0\u62e3\0\u6336"+
+    "\0\u6389\0\u63dc\0\u642f\0\u6482\0\u64d5\0\u6528\0\u657b\0\u65ce"+
+    "\0\u6621\0\u6674\0\u66c7\0\u671a\0\u676d\0\u67c0\0\u6813\0\u6866"+
+    "\0\u68b9\0\u690c\0\u695f\0\u69b2\0\u6a05\0\u6a58\0\u6aab\0\u6afe"+
+    "\0\u6b51\0\u019f\0\u6ba4\0\u6bf7\0\u6c4a\0\u6c9d\0\u6cf0\0\u6d43"+
+    "\0\u6d96\0\u6de9\0\u6e3c\0\u6e8f\0\u6ee2\0\u6f35\0\u6f88\0\u6fdb"+
+    "\0\u702e\0\u7081\0\u70d4\0\u7127\0\u717a\0\u71cd\0\u7220\0\u7273"+
+    "\0\u72c6\0\u7319\0\u736c\0\u73bf\0\u7412\0\u7465\0\u74b8\0\u750b"+
+    "\0\u755e\0\u75b1\0\u7604\0\u7657\0\u76aa\0\u76fd\0\u7750\0\u77a3"+
+    "\0\u77f6\0\u7849\0\u789c\0\u78ef\0\u7942\0\u7995\0\u79e8\0\u7a3b"+
+    "\0\u7a8e\0\u7ae1\0\u7b34\0\u7b87\0\u7bda\0\u7c2d\0\u7c80\0\u7cd3"+
+    "\0\u7d26\0\u7d79\0\u7dcc\0\u7e1f\0\u7e72\0\u7ec5\0\u7f18\0\u7f6b"+
+    "\0\u7fbe\0\u8011\0\u8064\0\u80b7\0\u810a\0\u815d\0\u81b0\0\u8203"+
+    "\0\u8256\0\u82a9\0\u82fc\0\u834f\0\u83a2\0\u83f5\0\u8448\0\u849b"+
+    "\0\u84ee\0\u8541\0\u8594\0\u85e7\0\u863a\0\u868d\0\u86e0\0\u8733"+
+    "\0\u8786\0\u87d9\0\u4c84\0\u882c\0\u887f\0\u88d2\0\u8925\0\u8978"+
+    "\0\u89cb\0\u8a1e\0\u8a71\0\u8ac4\0\u8b17\0\u8b6a\0\u8bbd\0\u8c10"+
+    "\0\u8c63\0\u8cb6\0\u8d09\0\u033e\0\u8d5c\0\u8daf\0\u8e02\0\u8e55"+
+    "\0\u8ea8\0\u8efb\0\u8f4e\0\u8fa1\0\u8ff4\0\u9047\0\u019f\0\u909a"+
+    "\0\u90ed\0\u9140\0\u9193\0\u91e6\0\u9239\0\u928c\0\u92df\0\u9332"+
+    "\0\u9385\0\u93d8\0\u942b\0\u019f\0\u947e\0\u94d1\0\u9524\0\u9577"+
+    "\0\u95ca\0\u961d\0\u9670\0\u96c3\0\u9716\0\u9769\0\u97bc\0\u980f"+
+    "\0\u9862\0\u98b5\0\u9908\0\u995b\0\u99ae\0\u9a01\0\u9a54\0\u9aa7"+
+    "\0\u9afa\0\u9b4d\0\u9ba0\0\u9bf3\0\u9c46\0\u9c99\0\u9cec\0\u9d3f"+
+    "\0\u9d92\0\u9de5\0\u9e38\0\u9e8b\0\u9ede\0\u9f31\0\u9f84\0\u9fd7"+
+    "\0\ua02a\0\ua07d\0\ua0d0\0\ua123\0\ua176\0\ua1c9\0\ua21c\0\ua26f"+
+    "\0\ua2c2\0\ua315\0\ua368\0\ua3bb\0\ua40e\0\ua461\0\ua4b4\0\ua507"+
+    "\0\ua55a\0\ua5ad\0\ua600\0\ua653\0\ua6a6\0\ua6f9\0\ua74c\0\ua79f"+
+    "\0\ua7f2\0\ua845\0\ua898\0\ua8eb\0\ua93e\0\ua991\0\ua9e4\0\uaa37"+
+    "\0\uaa8a\0\uaadd\0\uab30\0\uab83\0\uabd6\0\uac29\0\uac7c\0\uaccf"+
+    "\0\uad22\0\uad75\0\uadc8\0\uae1b\0\uae6e\0\uaec1\0\uaf14\0\uaf67"+
+    "\0\uafba\0\ub00d\0\ub060\0\ub0b3\0\ub106\0\ub159\0\ub1ac\0\ub1ff"+
+    "\0\ub252\0\ub2a5\0\ub2f8\0\ub34b\0\ub39e\0\ub3f1\0\ub444\0\ub497"+
+    "\0\ub4ea\0\ub53d\0\ub590\0\ub5e3\0\ub636\0\ub689\0\ub6dc\0\ub72f"+
+    "\0\ub782\0\ub7d5\0\ub828\0\ub87b\0\ub8ce\0\ub921\0\u033e\0\ub974"+
+    "\0\ub9c7\0\uba1a\0\uba6d\0\ubac0\0\ubb13\0\ubb66\0\ubbb9\0\ubc0c"+
+    "\0\ubc5f\0\ubcb2\0\ubd05\0\ubd58\0\ubdab\0\ubdfe\0\ube51\0\ubea4"+
+    "\0\ubef7\0\ubf4a\0\ubf9d\0\ubff0\0\uc043\0\uc096\0\uc0e9\0\uc13c"+
+    "\0\uc18f\0\uc1e2\0\uc235\0\uc288\0\uc2db\0\uc32e\0\uc381\0\uc3d4"+
+    "\0\uc427\0\uc47a\0\uc4cd\0\uc520\0\uc573\0\uc5c6\0\uc619\0\uc66c"+
+    "\0\uc6bf\0\uc712\0\uc765\0\uc7b8\0\uc80b\0\uc85e\0\uc8b1\0\uc904"+
+    "\0\uc957\0\uc9aa\0\uc9fd\0\uca50\0\ucaa3\0\ucaf6\0\ucb49\0\ucb9c"+
+    "\0\ucbef\0\ucc42\0\ucc95\0\u5bc1\0\ucce8\0\ucd3b\0\ucd8e\0\ucde1"+
+    "\0\uce34\0\uce87\0\uceda\0\ucf2d\0\ucf80\0\ucfd3\0\ud026\0\ud079"+
+    "\0\ud0cc\0\ud11f\0\ud172\0\ud1c5\0\ud218\0\ud26b\0\ud2be\0\ud311"+
+    "\0\ud364\0\ud3b7\0\ud40a\0\ud45d\0\ud4b0\0\ud503\0\ud556\0\ud5a9"+
+    "\0\ud5fc\0\ud64f\0\ud6a2\0\ud6f5\0\ud748\0\ud79b\0\ud7ee\0\ud841"+
+    "\0\ud894\0\ud8e7\0\ud93a\0\ud98d\0\ud9e0\0\uda33\0\uda86\0\udad9"+
+    "\0\udb2c\0\udb7f\0\udbd2\0\udc25\0\udc78\0\udccb\0\udd1e\0\udd71"+
+    "\0\uddc4\0\ude17\0\ude6a\0\udebd\0\udf10\0\udf63\0\udfb6\0\ue009"+
+    "\0\ue05c\0\ue0af\0\ue102\0\ue155\0\ue1a8\0\ue1fb\0\ue24e\0\ue2a1"+
+    "\0\ue2f4\0\ue347\0\ue39a\0\ue3ed\0\ue440\0\ue493\0\ue4e6\0\ue539"+
+    "\0\ue58c\0\ue5df\0\ue632\0\ue685\0\ue6d8\0\ue72b\0\ue77e\0\ue7d1"+
+    "\0\ue824\0\ue877\0\ue8ca\0\ue91d\0\ue970\0\ue9c3\0\ub590\0\uea16"+
+    "\0\ub689\0\uea69\0\ueabc\0\ueb0f\0\ueb62\0\uebb5\0\uec08\0\uec5b"+
+    "\0\uecae\0\ued01\0\ued54\0\ueda7\0\uedfa\0\uee4d\0\ueea0\0\ueef3"+
+    "\0\uef46\0\uef99\0\uefec\0\uf03f\0\uf092\0\uf0e5\0\uf138\0\uf18b"+
+    "\0\uf1de\0\ube51\0\uf231\0\uf284\0\uf2d7\0\uf32a\0\uf37d\0\uf3d0"+
+    "\0\uf423\0\uf476\0\uf4c9\0\uf51c\0\uf56f\0\uf5c2\0\uf615\0\uf668"+
+    "\0\uf6bb\0\uf70e\0\uf761\0\uf7b4\0\uf807\0\uf85a\0\uf8ad\0\uf900"+
+    "\0\uf953\0\uf9a6\0\uf9f9\0\ufa4c\0\ufa9f\0\ufaf2\0\ufb45\0\ufb98"+
+    "\0\ufbeb\0\ufc3e\0\ufc91\0\ufce4\0\ufd37\0\ufd8a\0\ufddd\0\ufe30"+
+    "\0\ufe83\0\ufed6\0\uff29\0\uff7c\0\uffcf\1\42\0\u019f\1\165"+
+    "\1\310\1\u011b\1\u016e\1\u01c1\1\u0214\1\u0267\1\u02ba\1\u030d"+
+    "\1\u0360\1\u03b3\1\u0406\1\u0459\1\u04ac\1\u04ff\1\u0552\1\u05a5"+
+    "\1\u05f8\1\u064b\1\u069e\1\u06f1\1\u0744\1\u0797\1\u07ea\1\u083d"+
+    "\1\u0890\1\u08e3\1\u0936\1\u0989\1\u09dc\1\u0a2f\1\u0a82\1\u0ad5"+
+    "\1\u0b28\1\u0b7b\1\u0bce\1\u0c21\1\u0c74\1\u0cc7\1\u0d1a\1\u0d6d"+
+    "\1\u0dc0\1\u0e13\1\u0e66\1\u0eb9\1\u0f0c\1\u0f5f\1\u0fb2\1\u1005"+
+    "\1\u1058\1\u10ab\1\u10fe\1\u1151\1\u11a4\1\u11f7\1\u124a\1\u129d"+
+    "\1\u12f0\1\u1343\1\u1396\1\u13e9\1\u143c\1\u148f\1\u14e2\1\u1535"+
+    "\1\u1588\1\u15db\1\u162e\1\u1681\1\u16d4\1\u1727\1\u177a\1\u17cd"+
+    "\1\u1820\1\u1873\1\u18c6\1\u1919\1\u196c\1\u19bf\1\u1a12\1\u1a65"+
+    "\1\u1ab8\1\u1b0b\1\u1b5e\1\u1bb1\1\u1c04\1\u1c57\1\u1caa\1\u1cfd"+
+    "\1\u1d50\1\u1da3\1\u1df6\1\u1e49\1\u1e9c\1\u1eef\1\u1f42\1\u1f95"+
+    "\1\u1fe8\1\u203b\1\u208e\1\u20e1\1\u2134\1\u2187\1\u21da\1\u222d"+
+    "\1\u2280\1\u22d3\1\u2326\1\u2379\1\u23cc\1\u241f\1\u2472\1\u24c5"+
+    "\1\u2518\1\u256b\1\u25be\1\u2611\1\u2664\1\u26b7\1\u270a\1\u275d"+
+    "\1\u27b0\1\u2803\1\u2856\1\u28a9\1\u28fc\1\u294f\1\u29a2\1\u29f5"+
+    "\1\u2a48\1\u2a9b\1\u2aee\1\u2b41\1\u2b94\1\u2be7\1\u2c3a\1\u2c8d"+
+    "\1\u2ce0\1\u2d33\1\u2d86\1\u2dd9\1\u2e2c\1\u2e7f\1\u2ed2\1\u2f25"+
+    "\1\u2f78\1\u2fcb\1\u301e\1\u3071\1\u30c4\1\u3117\1\u316a\1\u31bd"+
+    "\1\u3210\1\u3263\1\u32b6\1\u3309\1\u335c\1\u33af\1\u3402\1\u3455"+
+    "\1\u34a8\1\u34fb\1\u354e\1\u35a1\1\u35f4\1\u3647\1\u369a\1\u36ed"+
+    "\1\u3740\1\u3793\1\u37e6\1\u3839\1\u388c\1\u38df\1\u3932\1\u3985"+
+    "\1\u39d8\1\u3a2b\1\u3a7e\1\u3ad1\1\u3b24\1\u3b77\1\u3bca\1\u3c1d"+
+    "\1\u3c70\1\u3cc3\1\u13e9\1\u3d16\1\u3d69\1\u3dbc\1\u3e0f\1\u3e62"+
+    "\1\u3eb5\1\u3f08\1\u3f5b\1\u3fae\1\u4001\1\u4054\1\u40a7\1\u40fa"+
+    "\1\u414d\1\u41a0\1\u41f3\1\u4246\1\u4299\1\u42ec\1\u433f\1\u4392"+
+    "\1\u43e5\1\u4438\1\u448b\1\u44de\1\u4531\1\u4584\1\u45d7\1\u462a"+
+    "\1\u467d\1\u46d0\1\u4723\1\u4776\1\u47c9\1\u481c\1\u486f\1\u48c2"+
+    "\1\u4915\1\u4968\1\u49bb\1\u4a0e\1\u4a61\1\u4ab4\1\u4b07\1\u4b5a"+
+    "\1\u4bad\1\u4c00\1\u4c53\1\u4ca6\1\u4cf9\1\u4d4c\1\u4d9f\1\u4df2"+
+    "\1\u4e45\1\u4e98\1\u4eeb\1\u4f3e\1\u4f91\1\u4fe4\1\u5037\1\u508a"+
+    "\1\u50dd\1\u5130\1\u5183\1\u51d6\1\u5229\1\u527c\1\u52cf\1\u5322"+
+    "\1\u5375\1\u53c8\1\u541b\1\u546e\1\u54c1\1\u5514\1\u5567\1\u55ba"+
+    "\1\u560d\1\u5660\1\u56b3\1\u5706\1\u5759\1\u57ac\1\u57ff\1\u5852"+
+    "\1\u58a5\1\u58f8\1\u594b\1\u599e\1\u59f1\1\u5a44\1\u5a97\1\u5aea"+
+    "\1\u5b3d\1\u5b90\1\u5be3\1\u5c36\1\u5c89\1\u5cdc\1\u5d2f\1\u5d82"+
+    "\1\u5dd5\1\u5e28\1\u5e7b\1\u5ece\1\u5f21\1\u5f74\1\u5fc7\1\u601a"+
+    "\1\u606d\1\u60c0\1\u6113\1\u6166\1\u61b9\1\u620c\1\u625f\1\u62b2"+
+    "\1\u6305\1\u6358\1\u63ab\1\u63fe\1\u6451\1\u64a4\1\u64f7\1\u654a"+
+    "\1\u659d\1\u65f0\1\u6643\1\u6696\1\u66e9\1\u673c\1\u678f\1\u67e2"+
+    "\1\u6835\1\u6888\1\u68db\1\u692e\1\u6981\1\u69d4\1\u6a27\1\u6a7a"+
+    "\1\u6acd\1\u6b20\1\u6b73\1\u6bc6\1\u6c19\1\u6c6c\1\u6cbf\1\u6d12"+
+    "\1\u6d65\1\u6db8\1\u6e0b\1\u6e5e\1\u6eb1\1\u6f04\1\u6f57\1\u6faa"+
+    "\1\u6ffd\1\u7050\1\u70a3\1\u70f6\1\u7149\1\u719c\1\u71ef\1\u7242"+
+    "\1\u7295\1\u72e8\1\u733b\1\u738e\1\u73e1\1\u7434\1\u7487\1\u74da"+
+    "\1\u752d\1\u7580\1\u75d3\1\u7626\1\u7679\1\u76cc\1\u771f\1\u7772"+
+    "\1\u77c5\1\u7818\1\u786b\1\u78be\1\u7911\1\u7964\1\u79b7\1\u75d3"+
+    "\1\u7a0a\1\u7a5d\1\u7ab0\1\u7b03\1\u7b56\1\u7ba9\1\u7bfc\1\u7c4f"+
+    "\1\u7ca2\1\u7cf5\1\u7d48\1\u7d9b\1\u7dee\1\u7e41\1\u7e94\1\u7ee7"+
+    "\1\u7f3a\1\u7f8d\1\u7fe0\1\u8033\1\u8086\1\u80d9\1\u812c\1\u817f"+
+    "\1\u81d2\1\u8225\1\u8278\1\u82cb\1\u831e\1\u8371\1\u83c4\1\u8417"+
+    "\1\u846a\1\u84bd\1\u8510\1\u8563\1\u85b6\1\u8609\1\u865c\1\u86af"+
+    "\1\u8702\1\u8755\1\u87a8\0\u033e\1\u87fb\1\u884e\1\u88a1\1\u88f4"+
+    "\1\u8947\1\u899a\1\u89ed\1\u8a40\1\u8a93\1\u8ae6\1\u8b39\1\u8b8c"+
+    "\1\u8bdf\1\u8c32\1\u8c85\1\u8cd8\1\u8d2b\1\u8d7e\1\u8dd1\1\u8e24"+
+    "\1\u8e77\1\u8eca\1\u8f1d\1\u8f70\1\u8fc3\1\u9016\1\u9069\1\u90bc"+
+    "\1\u910f\1\u9162\1\u91b5\1\u9208\1\u925b\1\u92ae\1\u8d2b\1\u9301"+
+    "\1\u9354\1\u93a7\1\u93fa\1\u944d\1\u94a0\1\u94f3\1\u9546\1\u9599"+
+    "\1\u95ec\1\u963f\1\u9692\1\u96e5\1\u9738\1\u978b\1\u97de\1\u9831"+
+    "\1\u9884\1\u98d7\1\u992a\1\u997d\1\u99d0\1\u9a23\1\u9a76\1\u9ac9"+
+    "\1\u9b1c\1\u9b6f\1\u9bc2\1\u9c15\1\u9c68\1\u9cbb\1\u9d0e\1\u9d61"+
+    "\1\u9db4\1\u9e07\1\u9e5a\1\u9ead\1\u9f00\1\u9f53\1\u9fa6\1\u9ff9"+
+    "\1\ua04c\1\ua09f\1\ua0f2\1\ua145\1\ua198\1\ua1eb\1\ua23e\1\ua291"+
+    "\1\ua2e4\1\ua337\1\ua38a\1\ua3dd\1\ua430\1\ua483\1\ua4d6\1\ua529"+
+    "\1\ua57c\1\ua5cf\1\ua622\1\ua675\1\ua6c8\1\ua71b\1\ua76e\1\ua7c1"+
+    "\1\ua814\1\ua867\1\ua8ba\1\ua90d\1\ua960\1\ua9b3\1\uaa06\1\uaa59"+
+    "\1\uaaac\1\uaaff\1\uab52\1\uaba5\1\uabf8\1\uac4b\1\uac9e\1\uacf1"+
+    "\1\uad44\1\uad97\1\uadea\1\uae3d\1\uae90\1\uaee3\1\uaf36\1\uaf89"+
+    "\1\uafdc\1\ub02f\1\ub082\1\ub0d5\1\ub128\1\ub17b\1\ub1ce\1\ub221"+
+    "\1\ub274\1\ub2c7\1\ub31a\1\ub36d\1\ub3c0\1\ub413\1\ub466\1\ub4b9"+
+    "\1\ub50c\1\ub55f\1\ub5b2\1\ub605\1\ub658\1\ub6ab\1\ub6fe\1\ub751"+
+    "\1\ub7a4\1\ub7f7\1\ub84a\1\ub89d\1\ub8f0\1\ub943\1\ub996\1\ub9e9"+
+    "\1\uba3c\1\uba8f\1\ubae2\1\ubb35\1\ubb88\1\ubbdb\1\ubc2e\1\ubc81"+
+    "\1\ubcd4\1\ubd27\1\ubd7a\1\ubdcd\1\ube20\1\ube73\1\ubec6\1\ubf19"+
+    "\1\ubf6c\1\ubfbf\1\uc012\1\uc065\1\uc0b8\1\uc10b\1\uc15e\1\uc1b1"+
+    "\1\uc204\1\uc257\1\uc2aa\1\uc2fd\1\uc350\1\uc3a3\1\uc3f6\1\uc449"+
+    "\1\uc49c\1\uc4ef\1\uc542\1\uc595\1\uc5e8\1\uc63b\1\uc68e\1\uc6e1"+
+    "\1\uc734\1\uc787\1\uc7da\1\uc82d\1\uc880\1\u5a44\1\uc8d3\1\uc926"+
+    "\1\uc979\1\uc9cc\1\uca1f\1\uca72\1\ucac5\1\ucb18\1\ucb6b\1\ucbbe"+
+    "\1\ucc11\1\ucc64\1\uccb7\1\ucd0a\1\ucd5d\1\ucdb0\1\uce03\1\uce56"+
+    "\1\ucea9\1\ucefc\1\ucf4f\1\ucfa2\1\ucff5\1\ud048\1\ud09b\1\ud0ee"+
+    "\1\ud141\1\ud194\1\ud1e7\1\ud23a\1\ud28d\1\ud2e0\1\ud333\1\ud386"+
+    "\1\ud3d9\1\ud42c\1\ud47f\1\ud4d2\1\ud525\1\ud578\1\ud5cb\1\ud61e"+
+    "\1\ud671\1\ud6c4\1\ud717\1\ud76a\1\ud7bd\1\ud810\1\ud863\1\ud8b6"+
+    "\1\ud909\1\ud95c\1\ud9af\1\uda02\1\uda55\1\udaa8\1\udafb\1\udb4e"+
+    "\1\udba1\1\udbf4\1\udc47\1\udc9a\1\udced\1\udd40\1\udd93\1\udde6"+
+    "\1\ude39\1\ude8c\1\udedf\1\udf32\1\udf85\1\udfd8\1\ue02b\1\ue07e"+
+    "\1\ue0d1\1\ue124\1\ue177\1\ue1ca\1\ue21d\1\ue270\1\ue2c3\1\ue316"+
+    "\1\ue369\1\ue3bc\1\ue40f\1\ue462\1\ue4b5\1\ue508\1\ue55b\1\ue5ae"+
+    "\1\ue601\1\ue654\1\ue6a7\1\ue6fa\1\ue74d\1\ue7a0\1\ue7f3\1\ue846"+
+    "\1\ue899\1\ue8ec\1\ue93f\1\ue992\1\ue9e5\1\uea38\1\uea8b\1\ueade"+
+    "\1\ueb31\1\ueb84\1\uebd7\1\uec2a\1\uec7d\1\uecd0\1\ued23\1\ued76"+
+    "\1\uedc9\1\uee1c\1\uee6f\1\ueec2\1\uef15\1\uef68\1\uefbb\1\uf00e"+
+    "\1\uf061\1\uf0b4\1\uf107\1\uf15a\1\uf1ad\1\uf200\1\uf253\1\uf2a6"+
+    "\1\uf2f9\1\uf34c\1\uf39f\1\uf3f2\1\uf445\1\uf498\1\uf4eb\1\uf53e"+
+    "\1\uf591\1\uf5e4\1\uf637\1\uf68a\1\uf6dd\1\uf730\1\uf783\1\uf7d6"+
+    "\1\uf829\1\uf87c\1\uf8cf\1\uf922\1\uf975\1\uf9c8\1\ufa1b\1\ufa6e"+
+    "\1\ufac1\1\ufb14\1\ufb67\1\ufbba\1\ufc0d\1\ufc60\1\ufcb3\1\ufd06"+
+    "\1\ufd59\1\ufdac\1\ufdff\1\ufe52\1\ufea5\1\ufef8\1\uff4b\1\uff9e"+
+    "\1\ufff1\2\104\2\227\2\352\2\u013d\2\u0190\2\u01e3\2\u0236"+
+    "\2\u0289\2\u02dc\2\u032f\2\u0382\2\u03d5\2\u0428\2\u047b\2\u04ce"+
+    "\2\u0521\2\u0574\2\u05c7\2\u061a\2\u066d\2\u06c0\2\u0713\2\u0766"+
+    "\2\u07b9\2\u080c\2\u085f\2\u08b2\2\u0905\2\u0958\2\u09ab\2\u09fe"+
+    "\2\u0a51\2\u0aa4\2\u0af7\2\u0b4a\2\u0b9d\2\u0bf0\2\u0c43\2\u0c96"+
+    "\2\u0ce9\2\u0d3c\2\u0d8f\2\u0de2\2\u0e35\2\u0e88\2\u0edb\2\u0f2e"+
+    "\2\u0f81\2\u0fd4\2\u1027\2\u107a\2\u10cd\2\u1120\2\u1173\2\u11c6"+
+    "\2\u1219\2\u126c\2\u12bf\2\u1312\2\u1365\2\u13b8\2\u140b\2\u145e"+
+    "\2\u14b1\2\u1504\2\u1557\2\u15aa\2\u15fd\2\u1650\2\u16a3\2\u16f6"+
+    "\2\u1749\2\u179c\2\u17ef\2\u1842\2\u1895\2\u18e8\2\u193b\2\u198e"+
+    "\2\u19e1\2\u1a34\2\u1a87\2\u1ada\2\u1b2d\2\u1b80\2\u1bd3\2\u1c26"+
+    "\2\u1c79\2\u1ccc\2\u1d1f\2\u1d72\2\u1dc5\2\u1e18\2\u1e6b\2\u1ebe"+
+    "\2\u1f11\2\u1f64\2\u1fb7\2\u200a\2\u205d\2\u20b0\2\u2103\2\u2156"+
+    "\2\u21a9\2\u21fc\2\u224f\2\u22a2\2\u22f5";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[1725];
+    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\5\2\6\1\7\1\10\1\7\1\11\1\7\1\12"+
+    "\1\13\1\5\1\6\1\14\1\15\1\16\1\7\1\17"+
+    "\1\5\1\6\1\20\1\21\1\22\1\23\1\24\1\25"+
+    "\1\6\1\26\1\27\1\30\1\31\1\32\1\33\1\34"+
+    "\1\35\1\36\1\37\1\40\1\41\1\42\1\43\2\22"+
+    "\1\44\1\22\1\45\1\46\1\45\2\6\1\47\1\50"+
+    "\1\51\1\6\1\52\1\6\1\53\1\54\1\55\1\56"+
+    "\1\6\1\57\1\6\1\60\1\40\1\6\1\61\1\62"+
+    "\1\6\1\63\1\64\1\65\1\66\1\67\1\70\1\71"+
+    "\1\6\1\72\1\73\1\74\1\75\1\76\1\6\1\40"+
+    "\11\77\1\100\3\77\1\101\7\77\1\102\31\77\1\103"+
+    "\10\77\1\104\32\77\11\105\1\106\3\105\1\107\7\105"+
+    "\1\110\21\105\1\111\7\105\1\112\10\105\1\113\5\105"+
+    "\1\114\23\105\1\115\11\116\1\117\3\116\1\120\41\116"+
+    "\1\121\10\116\1\122\32\116\10\5\2\0\4\5\1\0"+
+    "\1\5\1\0\2\5\3\0\6\5\2\0\6\5\13\0"+
+    "\20\5\1\0\22\5\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\2\124\1\125\3\7\1\124\1\7\2\0\3\124\1\126"+
+    "\1\0\1\7\1\0\2\124\3\0\1\127\3\124\1\126"+
+    "\1\130\1\0\1\131\2\124\1\130\1\124\1\127\1\124"+
+    "\13\0\2\124\1\126\5\124\1\126\7\124\1\0\22\124"+
+    "\1\0\2\124\1\132\1\133\2\134\1\124\1\134\2\0"+
+    "\3\124\1\126\1\0\1\134\1\0\2\124\3\0\1\127"+
+    "\2\135\1\136\1\126\1\130\1\0\1\131\2\124\1\130"+
+    "\1\124\1\127\1\124\13\0\2\124\1\126\2\124\1\136"+
+    "\2\124\1\126\7\124\1\0\22\124\1\0\1\5\7\6"+
+    "\2\0\1\123\1\137\2\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\140\1\141\1\6"+
+    "\13\0\1\142\1\143\15\6\1\5\1\0\22\6\1\0"+
+    "\10\144\1\145\1\146\1\147\110\144\123\0\1\5\7\6"+
+    "\2\0\1\123\1\150\2\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\151\1\152\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\153\1\154\1\6\13\0"+
+    "\1\6\1\155\4\6\1\156\10\6\1\5\1\0\22\6"+
+    "\1\0\11\16\1\157\1\160\3\16\1\161\104\16\23\0"+
+    "\1\20\123\0\1\162\1\163\22\0\1\45\122\0\1\45"+
+    "\52\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\164\4\6\1\165\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\166\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\167\4\6\1\170\5\6\1\171\2\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\172\4\6\13\0\1\6\1\173\12\6"+
+    "\1\174\2\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\175\1\6\13\0\1\6"+
+    "\1\176\4\6\1\177\10\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\200\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\201\4\6\13\0\5\6\1\202\1\6\1\203\2\6"+
+    "\1\204\4\6\1\5\1\0\12\6\1\205\7\6\35\0"+
+    "\1\45\13\0\1\45\55\0\3\131\1\0\1\131\7\0"+
+    "\1\131\103\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\206\4\6\13\0\1\207\16\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\210"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\211\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\212"+
+    "\1\6\13\0\5\6\1\213\11\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\2\6\1\214\3\6\2\0"+
+    "\5\6\1\215\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\216\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\217\2\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\220\5\6\13\0\1\221"+
+    "\10\6\1\222\2\6\1\223\2\6\1\5\1\0\22\6"+
+    "\47\0\1\45\1\0\1\45\121\0\1\224\1\45\122\0"+
+    "\1\45\1\0\1\225\120\0\1\45\4\0\1\45\45\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\226\3\6"+
+    "\13\0\1\6\1\227\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\230\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\231"+
+    "\1\6\1\232\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\233"+
+    "\1\234\1\6\13\0\1\235\1\236\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\237"+
+    "\1\240\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\7\6\1\241\7\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\242\2\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\243\1\244\2\6\13\0\1\6\1\245\4\6"+
+    "\1\246\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\247\16\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\250\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\251\15\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\252\2\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\253\1\254"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\2\255\3\5\1\255\1\5\2\0\1\5\3\255\1\0"+
+    "\1\5\1\0\1\5\1\255\3\0\6\255\2\0\6\255"+
+    "\13\0\17\255\1\5\1\0\22\255\1\0\1\5\7\6"+
+    "\2\0\1\123\1\256\2\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\2\6\1\257\3\6\2\0\1\6\1\260"+
+    "\3\6\1\261\13\0\3\6\1\262\13\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\263"+
+    "\1\6\1\264\3\6\13\0\1\265\1\266\2\6\1\267"+
+    "\1\6\1\270\5\6\1\271\2\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\272\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\273\3\6\1\274\1\6\13\0\2\6\1\275\14\6"+
+    "\1\5\1\0\12\6\1\276\7\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\277\4\6\13\0\1\300"+
+    "\1\301\4\6\1\302\5\6\1\303\2\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\304"+
+    "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\5\6\1\305"+
+    "\1\306\13\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\307\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\310"+
+    "\2\6\13\0\6\6\1\311\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\312\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\313\1\314\2\6\13\0\1\6\1\315\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\316"+
+    "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\2\6"+
+    "\1\317\3\6\2\0\6\6\13\0\3\6\1\320\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\321\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\322\1\6\1\323\2\6\13\0"+
+    "\6\6\1\324\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\325\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\326\3\6\13\0\1\6\1\327"+
+    "\4\6\1\330\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\331\1\332\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\333\2\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\11\77\1\0\3\77\1\0\7\77"+
+    "\1\0\31\77\1\0\10\77\1\0\32\77\36\0\1\334"+
+    "\26\0\1\335\61\0\1\336\134\0\1\337\154\0\1\340"+
+    "\32\0\11\105\1\0\3\105\1\0\7\105\1\0\21\105"+
+    "\1\0\7\105\1\0\10\105\1\0\5\105\1\0\23\105"+
+    "\37\0\1\341\26\0\1\342\61\0\1\343\77\0\1\344"+
+    "\4\0\1\344\4\0\3\344\6\0\1\345\1\0\6\344"+
+    "\2\0\6\344\6\0\1\346\4\0\17\344\2\0\22\344"+
+    "\37\0\1\347\154\0\1\350\70\0\1\351\1\352\1\353"+
+    "\1\354\1\0\1\355\14\0\1\356\1\357\1\360\1\361"+
+    "\1\0\1\362\3\0\1\363\127\0\1\364\24\0\11\116"+
+    "\1\0\3\116\1\0\41\116\1\0\10\116\1\0\32\116"+
+    "\36\0\1\365\26\0\1\366\73\0\1\367\154\0\1\370"+
+    "\32\0\10\5\2\0\1\5\1\371\2\5\1\0\1\5"+
+    "\1\0\2\5\3\0\6\5\2\0\6\5\13\0\20\5"+
+    "\1\0\22\5\1\0\10\124\2\0\4\124\1\0\1\124"+
+    "\1\0\2\124\3\0\6\124\2\0\6\124\13\0\20\124"+
+    "\1\0\22\124\1\0\2\124\1\125\3\372\1\124\1\372"+
+    "\2\0\4\124\1\0\1\372\1\0\2\124\3\0\6\124"+
+    "\2\0\6\124\13\0\20\124\1\0\22\124\1\0\3\124"+
+    "\3\373\1\124\1\373\2\0\4\124\1\0\1\373\1\0"+
+    "\2\124\3\0\6\124\1\374\1\0\6\124\2\0\1\374"+
+    "\10\0\20\124\1\0\22\124\1\0\3\124\3\131\1\124"+
+    "\1\131\2\0\3\124\1\126\1\0\1\131\1\0\2\124"+
+    "\3\0\4\124\1\126\1\130\2\0\2\124\1\130\3\124"+
+    "\13\0\2\124\1\126\5\124\1\126\7\124\1\0\22\124"+
+    "\1\0\2\124\1\132\1\124\2\375\1\124\1\375\2\0"+
+    "\4\124\1\0\1\375\1\0\2\124\3\0\6\124\2\0"+
+    "\6\124\13\0\20\124\1\0\22\124\1\0\3\124\3\133"+
+    "\1\124\1\133\2\0\3\124\1\126\1\0\1\133\1\0"+
+    "\2\124\3\0\4\124\1\126\1\130\1\0\1\131\2\124"+
+    "\1\130\3\124\13\0\2\124\1\126\5\124\1\126\7\124"+
+    "\1\0\22\124\1\0\2\124\1\132\1\133\2\134\1\124"+
+    "\1\134\2\0\3\124\1\126\1\0\1\134\1\0\2\124"+
+    "\3\0\1\376\3\124\1\126\1\130\1\0\1\131\2\124"+
+    "\1\130\1\124\1\376\1\124\13\0\2\124\1\126\5\124"+
+    "\1\126\7\124\1\0\22\124\1\0\4\124\2\377\2\124"+
+    "\2\0\4\124\1\0\1\124\1\0\2\124\3\0\6\124"+
+    "\2\0\6\124\13\0\20\124\1\0\22\124\1\0\3\124"+
+    "\5\u0100\2\0\3\124\1\u0100\1\0\1\u0100\1\0\2\124"+
+    "\3\0\1\124\2\u0100\1\124\2\u0100\2\0\2\124\2\u0100"+
+    "\2\124\13\0\2\124\1\u0100\1\124\1\u0100\3\124\1\u0100"+
+    "\7\124\1\0\1\124\1\u0100\20\124\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0101\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u0102\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0103\2\6\13\0\1\6\1\u0104\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0105\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u0106\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u0107\1\6\13\0\7\6\1\u0108\7\6\1\5\1\0"+
+    "\22\6\1\0\10\u0109\1\u010a\1\0\111\u0109\10\0\1\u010a"+
+    "\112\0\4\u0109\2\u010b\1\u0109\1\u010c\1\u010d\1\0\1\144"+
+    "\1\u010e\3\144\1\u010b\10\u0109\1\144\5\u0109\2\144\63\u0109"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\4\6\1\u010f\1\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\11\6\1\240\5\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0110\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u0111"+
+    "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u0112"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\240\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0113\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\12\157\1\u0114\3\157\1\u0115\110\157\2\16\1\157"+
+    "\2\16\1\0\1\16\1\u0116\4\16\10\157\1\16\5\157"+
+    "\2\16\63\157\25\0\1\u0117\75\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u0118\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0119"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u011a\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u011b\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\2\6\1\u011c\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\u011d\15\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u011e\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u011f\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0120"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u0121"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u0122\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\u0123\2\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u0124\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u0125"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\u0126\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\u0127\2\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0128\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0129\5\6\13\0"+
+    "\4\6\1\u012a\12\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\3\6\1\u012b"+
+    "\13\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u012c\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u012d"+
+    "\1\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\u012e\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u012f\2\6\13\0\14\6\1\240\2\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0130\4\6\13\0\6\6\1\u0131\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u0132"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\u0133\2\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u0134\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0135\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\5\6\1\u0136\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u0137\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u0138\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u0139\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u013a\1\6\1\u013b\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u013c\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\6\6\1\u013d\10\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u013e\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\51\0\1\45\1\0"+
+    "\1\22\50\0\1\5\7\6\2\0\1\123\2\6\1\u013f"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\u0140\2\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\2\6"+
+    "\1\u0141\3\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u0142\4\6\1\u0143\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\4\6\1\u0144\12\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0145\4\6\1\u0134"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u0146\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u0147\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\u0148"+
+    "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0149\4\6\1\u014a"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u014b\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\3\6\1\u014c\13\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\3\6\1\u014d\16\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u014e\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\u014f\2\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\4\6\1\u0150\12\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u0151\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u0152\1\6\13\0\6\6"+
+    "\1\u0153\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u0154\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0155\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0156"+
+    "\1\6\1\u0157\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u0158\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\255"+
+    "\2\0\1\u0159\3\255\1\0\1\255\1\0\1\5\1\255"+
+    "\3\0\6\255\2\0\6\255\13\0\17\255\1\5\1\0"+
+    "\22\255\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u015a"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u015b\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u015c\4\6\13\0\6\6\1\u015d\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u015e\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\3\6\1\u015f\13\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u0160\1\6\1\u0161"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u0162\1\u0163\4\6\13\0"+
+    "\4\6\1\u0164\12\6\1\5\1\0\3\6\1\u0165\16\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\u0166\15\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u0167\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u0168\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\7\6\1\u0169\7\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u016a\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u016b\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u016c\4\6\1\u016d"+
+    "\13\0\1\u016e\1\6\1\u016f\1\u0170\1\u0171\5\6\1\u0172"+
+    "\4\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0173\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\4\6\1\u0174\1\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0175"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\5\6\1\u0176\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0177\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0178\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u0179\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u017a\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\3\6\1\u017b\13\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+    "\1\u017c\13\0\16\6\1\u017d\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\4\6\1\u017e\1\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\4\6\1\u017f\15\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u0180\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0181\5\6"+
+    "\13\0\3\6\1\u0182\13\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\5\6\1\u0183\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u0184\1\6\13\0\7\6\1\u0185"+
+    "\7\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\13\6\1\u0186\3\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\12\6\1\u0187\4\6\1\5\1\0\22\6"+
+    "\1\0\1\5\5\6\1\u0188\1\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u0189\5\6\13\0\17\6\1\5\1\0\2\6\1\u018a"+
+    "\17\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u018b"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u018c\13\0\17\6"+
+    "\1\5\1\0\13\6\1\u018d\6\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u018e\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u018f\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u0190\4\6\1\u0191\10\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u0192\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u0193\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0194\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0195\4\6\13\0\4\6\1\u0196\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\6\6\1\u0197\10\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u0198\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u0199\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u019a\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u014d\3\6\13\0\17\6\1\5\1\0\22\6\63\0"+
+    "\1\u019b\102\0\1\u019c\116\0\1\u019d\154\0\1\u019e\114\0"+
+    "\1\u019f\102\0\1\u01a0\60\0\52\344\1\346\50\344\1\0"+
+    "\1\344\4\0\1\344\4\0\3\344\10\0\6\344\2\0"+
+    "\6\344\6\0\1\346\4\0\17\344\2\0\22\344\37\0"+
+    "\1\u01a1\154\0\1\u01a2\45\0\1\u01a3\43\0\1\u01a4\1\u01a5"+
+    "\102\0\1\u01a6\146\0\1\u01a7\51\0\1\u01a8\147\0\1\u01a9"+
+    "\24\0\1\u01aa\65\0\1\u01ab\132\0\1\u01ac\123\0\1\u01ad"+
+    "\122\0\1\u01ae\75\0\1\u01af\146\0\1\u01b0\124\0\1\u01b1"+
+    "\16\0\1\u01b2\1\0\1\u01b3\1\0\1\u01b4\3\0\1\u01b5"+
+    "\113\0\1\u01b6\102\0\1\u01b7\116\0\1\u01b8\154\0\1\u01b9"+
+    "\32\0\3\5\5\u01ba\2\0\3\5\1\u01ba\1\0\1\u01ba"+
+    "\1\0\2\5\3\0\1\5\2\u01ba\1\5\2\u01ba\2\0"+
+    "\2\5\2\u01ba\2\5\13\0\2\5\1\u01ba\1\5\1\u01ba"+
+    "\3\5\1\u01ba\7\5\1\0\1\5\1\u01ba\20\5\1\0"+
+    "\2\124\1\125\3\372\1\124\1\372\2\0\4\124\1\0"+
+    "\1\372\1\0\2\124\3\0\1\127\5\124\2\0\4\124"+
+    "\1\127\1\124\13\0\20\124\1\0\22\124\1\0\3\124"+
+    "\3\373\1\124\1\373\2\0\3\124\1\126\1\0\1\373"+
+    "\1\0\2\124\3\0\4\124\1\126\1\124\2\0\6\124"+
+    "\13\0\2\124\1\126\5\124\1\126\7\124\1\0\22\124"+
+    "\4\0\3\373\1\0\1\373\7\0\1\373\103\0\2\124"+
+    "\1\132\1\124\2\375\1\124\1\375\2\0\4\124\1\0"+
+    "\1\375\1\0\2\124\3\0\1\376\5\124\2\0\4\124"+
+    "\1\376\1\124\13\0\20\124\1\0\22\124\1\0\2\124"+
+    "\1\u01bb\1\124\2\377\2\124\2\0\4\124\1\0\1\124"+
+    "\1\0\2\124\3\0\6\124\2\0\6\124\13\0\20\124"+
+    "\1\0\22\124\1\0\2\124\1\u01bc\5\u0100\2\0\3\124"+
+    "\1\u0100\1\0\1\u0100\1\0\2\124\3\0\1\376\2\u0100"+
+    "\1\124\2\u0100\2\0\2\124\2\u0100\1\376\1\124\13\0"+
+    "\2\124\1\u0100\1\124\1\u0100\3\124\1\u0100\7\124\1\0"+
+    "\1\124\1\u0100\20\124\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u01bd\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u01be\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\5\6\1\u01bf\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u01c0\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u01c1\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u01c2\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+    "\1\u01c3\13\0\4\6\1\u01c4\12\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u01c5"+
+    "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\3\6\1\u01c6"+
+    "\13\6\1\5\1\0\22\6\1\0\10\u0109\1\145\1\0"+
+    "\115\u0109\2\u010c\1\u0109\1\u010c\1\u010a\1\0\5\u0109\1\u010c"+
+    "\107\u0109\2\144\1\u0109\1\144\1\u010a\1\0\5\u0109\1\144"+
+    "\106\u0109\5\u01c7\1\145\1\0\3\u0109\1\u01c7\1\u0109\1\u01c7"+
+    "\7\u0109\2\u01c7\1\u0109\2\u01c7\4\u0109\2\u01c7\17\u0109\1\u01c7"+
+    "\1\u0109\1\u01c7\3\u0109\1\u01c7\11\u0109\1\u01c7\21\u0109\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\240\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u01c8\10\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u012e\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u01c9\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u01ca\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\11\157\1\0\114\157\5\u01cb"+
+    "\2\157\1\u0114\2\157\1\u01cb\1\u0115\1\u01cb\7\157\2\u01cb"+
+    "\1\157\2\u01cb\4\157\2\u01cb\17\157\1\u01cb\1\157\1\u01cb"+
+    "\3\157\1\u01cb\11\157\1\u01cb\21\157\24\0\1\u01cc\76\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\13\6"+
+    "\1\u0162\3\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u01cd\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u01ce\3\6\13\0\16\6\1\u01cf\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u01d0\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\2\6\1\u01d1\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u01d2\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\2\6\1\u01d3\17\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u01d4"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u01d5\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u01d6\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u01d7\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u01d8"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u01d9\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\7\6\1\u01da\7\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u01db"+
+    "\1\6\1\u01dc\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\7\6\1\u01dd\7\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u01de"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u01df\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u01e0\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u01e1\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u01e2\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\5\6"+
+    "\1\u01e3\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u01e4"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u01e5\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u01e6\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\240\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\u01e7\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\7\6\1\240\7\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\240\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u01e8"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u01e9\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u01ea\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\13\6\1\u01d7\3\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\155\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u01eb\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u01ec\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u01c9"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u0145\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u01ed\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u01ee\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\2\6\1\u01ef\3\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u01ec\1\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u01f0\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\12\6\1\u01f1\4\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\16\6\1\u01f2"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u01f3\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+    "\1\u0131\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u01d7\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u01f4\4\6\1\u01f5\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u01f6\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u01f7\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u01f8\1\6\13\0\1\6"+
+    "\1\u01ea\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u01f9\1\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u01fa\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0162"+
+    "\1\u01fb\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\2\6\1\u01fc\3\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u01fd\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\4\6\1\u0134\1\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u01fe"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\2\6\1\240"+
+    "\14\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\240\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u01ff\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u0200\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\2\6\1\u0201\14\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u0202\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\2\6\1\u0203\14\6"+
+    "\1\5\1\0\22\6\1\0\10\5\2\0\1\5\1\u0204"+
+    "\2\5\1\0\1\5\1\0\2\5\3\0\6\5\2\0"+
+    "\6\5\13\0\20\5\1\0\22\5\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u0205\15\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0206\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0207"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u0208\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0209\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u020a\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u020b\3\6"+
+    "\13\0\6\6\1\u020c\10\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u020d\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u020e\3\6"+
+    "\1\u020f\4\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\u0210\2\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\u0211"+
+    "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u01d9\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u0212\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0213\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\3\6\1\u0214\13\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0215"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u0216\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u0217\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0218\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0219\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u021a\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\u021b\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u021c\15\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u021d\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u021e\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\2\6\1\u021f\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0220"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u0221\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\201\4\6\13\0\5\6\1\u0222"+
+    "\11\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0223\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0224\3\6\13\0\1\6\1\u0225\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\10\6\1\u0226\11\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0227"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u0228\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\u0229\2\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u022a\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u022b\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\10\6\1\u022c\6\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\10\6"+
+    "\1\u0162\6\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\u022d\16\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\u0162\16\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\1\0\1\u022e\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\5\6\1\u022f\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u0230\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\2\6\1\u0231\3\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u0232\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u0233\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u0234\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\1\6\1\u0235\1\u0236\17\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\u0237\2\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\3\6\1\u0238\13\6\1\5\1\0"+
+    "\12\6\1\u0239\7\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u023a\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u023b\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u023c\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\u023d\16\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\3\6\1\u023e\1\u023f\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\u0240"+
+    "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u0241\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\16\6\1\u0242\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u0243\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\13\6\1\u0244\3\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u0245\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0128\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\2\6\1\u0162\14\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0246\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0247\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\16\6\1\u0248\1\5"+
+    "\1\0\22\6\57\0\1\u0249\104\0\1\u019b\144\0\1\u024a"+
+    "\75\0\1\u024b\143\0\1\u024c\104\0\1\u019f\144\0\1\u024d"+
+    "\75\0\1\u024e\123\0\1\u024f\123\0\1\u0250\144\0\1\u0251"+
+    "\77\0\1\u0252\125\0\1\u0253\21\0\1\u0254\75\0\1\u0255"+
+    "\123\0\1\u0256\1\u0257\76\0\1\u0258\151\0\1\u0259\141\0"+
+    "\1\u025a\77\0\1\u025b\121\0\1\u025c\122\0\1\u025d\22\0"+
+    "\1\u025e\100\0\1\u025f\150\0\1\u0260\115\0\1\u0261\122\0"+
+    "\1\u0262\56\0\1\u0263\147\0\1\u0264\137\0\1\u0265\104\0"+
+    "\1\u01b6\144\0\1\u0266\75\0\1\u0267\65\0\3\5\5\u0268"+
+    "\2\0\3\5\1\u0268\1\0\1\u0268\1\0\2\5\3\0"+
+    "\1\5\2\u0268\1\5\2\u0268\2\0\2\5\2\u0268\2\5"+
+    "\13\0\2\5\1\u0268\1\5\1\u0268\3\5\1\u0268\7\5"+
+    "\1\0\1\5\1\u0268\20\5\1\0\2\124\1\u01bc\5\u0100"+
+    "\2\0\3\124\1\u0100\1\0\1\u0100\1\0\2\124\3\0"+
+    "\1\124\2\u0100\1\124\2\u0100\2\0\2\124\2\u0100\2\124"+
+    "\13\0\2\124\1\u0100\1\124\1\u0100\3\124\1\u0100\7\124"+
+    "\1\0\1\124\1\u0100\20\124\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0269\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u026a\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u026b"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u026c\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u01ff\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\5\6\1\u026d\1\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u026e\2\6\13\0\17\6\1\5\1\0"+
+    "\1\6\1\u026f\1\u0270\17\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u01fc\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\u0271"+
+    "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u0272\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u0173\2\6\13\0\6\6"+
+    "\1\u0273\10\6\1\5\1\0\22\6\1\0\3\u0109\5\u0274"+
+    "\1\145\1\0\3\u0109\1\u0274\1\u0109\1\u0274\7\u0109\2\u0274"+
+    "\1\u0109\2\u0274\4\u0109\2\u0274\17\u0109\1\u0274\1\u0109\1\u0274"+
+    "\3\u0109\1\u0274\11\u0109\1\u0274\21\u0109\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\12\6\1\u0134\4\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u01d7\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\4\6\1\u0275\1\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\3\157\5\u0276"+
+    "\2\157\1\u0114\2\157\1\u0276\1\u0115\1\u0276\7\157\2\u0276"+
+    "\1\157\2\u0276\4\157\2\u0276\17\157\1\u0276\1\157\1\u0276"+
+    "\3\157\1\u0276\11\157\1\u0276\21\157\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u0277\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\11\6\1\u0278\10\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0279"+
+    "\1\u027a\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\15\6"+
+    "\1\u027b\1\6\1\5\1\0\4\6\1\u027c\15\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u027d\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u027e\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u01d9\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\1\6\1\u027f\20\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\16\6"+
+    "\1\240\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0280\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\u01ff\16\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0162\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u0281\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0282\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u0283\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u0284"+
+    "\1\6\2\0\6\6\13\0\10\6\1\u0285\4\6\1\u0286"+
+    "\1\6\1\5\1\0\4\6\1\u0287\4\6\1\u0288\1\u0289"+
+    "\1\6\1\u028a\2\6\1\u028b\2\6\1\0\1\5\5\6"+
+    "\1\u028c\1\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u028d\3\6"+
+    "\13\0\17\6\1\5\1\0\2\6\1\u01d3\5\6\1\u028e"+
+    "\11\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0162\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u028f\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u0290\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\14\6\1\u0291\2\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u0292"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\5\6\1\u0222"+
+    "\11\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\5\6\1\u0293\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\11\6\1\u0294\5\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u0295\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u0296\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u0297\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u01f5\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u0298\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u0299\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\u029a\16\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\u029b\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u0122\1\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u029c\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u029d\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u029e\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\240\16\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u029f\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\240\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u02a0\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u02a1\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u02a2\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u02a3\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u0162\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\4\6\1\u02a4"+
+    "\5\6\1\u02a5\7\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u01fa\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\6\6\1\u02a6\10\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\247\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u014f\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u02a7\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u01de"+
+    "\1\u014f\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\u02a8\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u02a9\15\6\1\5"+
+    "\1\0\22\6\1\0\3\5\5\u02aa\2\0\3\5\1\u02aa"+
+    "\1\0\1\u02aa\1\0\2\5\3\0\1\5\2\u02aa\1\5"+
+    "\2\u02aa\2\0\2\5\2\u02aa\2\5\13\0\2\5\1\u02aa"+
+    "\1\5\1\u02aa\3\5\1\u02aa\7\5\1\0\1\5\1\u02aa"+
+    "\20\5\1\0\1\5\5\6\1\u02ab\1\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u02ac\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\14\6\1\u02ad\2\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\u02ae\16\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u02af"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u02b0\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u02b1\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u02b2\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\4\6\1\u02b3\12\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\16\6\1\u02b4\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u02b5\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u02b6\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u02b7\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u02b8\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u02b9\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u02ba\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u02bb\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\4\6\1\u02bc\1\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u02bd\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u02be\4\6\13\0\13\6"+
+    "\1\u02ba\3\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u02bf\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u02c0\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\5\6\1\u02c1\11\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u02c2\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\7\6\1\u02c3\7\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\4\6\1\u02c4\1\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u02c5"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u02c6"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\13\6\1\u02c7\3\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u02c8\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u02c9\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\2\6\1\u01d3\5\6\1\u028e\11\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u02ca\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\11\6\1\u01ff\5\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u02cb\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u02cc\4\6"+
+    "\13\0\17\6\1\5\1\0\21\6\1\u02cd\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\11\6\1\u02ce\10\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\3\6\1\u02cf\13\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u02d0\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u02d1\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u02d2\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u01ff\5\6\13\0\17\6\1\5\1\0\2\6"+
+    "\1\u01d3\5\6\1\u028e\11\6\34\0\1\u02d3\67\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u02d4"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\14\6"+
+    "\1\u02d5\5\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u02d6\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u02d7\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\13\6\1\u02d8\3\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u02d9\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\4\6\1\u02da\12\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u02db\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\4\6\1\u02dc\12\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u02dd\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\2\6\1\u02de\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u02df\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u02e0\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u02e1\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\2\6\1\u02e2\3\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u02e3\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u02e4\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u02e5"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u02e6\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u02e7\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\2\6\1\u02e8\14\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\u02e9\15\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\2\6\1\u02ea\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u02eb\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u02ec"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\7\6\1\u02ed\12\6\25\0\1\u02ee\141\0\1\u019b"+
+    "\12\0\1\u0249\45\0\1\u024b\1\u02ef\5\u024b\1\u02ef\2\0"+
+    "\3\u024b\1\0\1\u024b\1\0\1\u02ef\1\u024b\1\0\1\u024b"+
+    "\1\u02ef\6\u024b\2\u02ef\6\u024b\1\0\2\u02ef\1\0\1\u02ef"+
+    "\2\0\4\u02ef\17\u024b\2\u02ef\22\u024b\25\0\1\u02f0\141\0"+
+    "\1\u019f\12\0\1\u024c\45\0\1\u024e\1\u02f1\5\u024e\1\u02f1"+
+    "\2\0\3\u024e\1\0\1\u024e\1\0\1\u02f1\1\u024e\1\0"+
+    "\1\u024e\1\u02f1\6\u024e\2\u02f1\6\u024e\1\0\2\u02f1\1\0"+
+    "\1\u02f1\2\0\4\u02f1\17\u024e\2\u02f1\22\u024e\61\0\1\u02f2"+
+    "\102\0\1\u02f3\17\0\1\u02f4\122\0\1\u0257\55\0\1\u02f5"+
+    "\175\0\1\u02f6\74\0\1\u02f7\1\0\1\u02f8\137\0\1\u02f9"+
+    "\130\0\1\u02fa\120\0\1\u02fb\117\0\1\u02fc\101\0\1\u02fd"+
+    "\124\0\1\u02fe\121\0\1\u02ff\122\0\1\u0300\122\0\1\u0301"+
+    "\125\0\1\u0302\73\0\1\u0303\21\0\1\u0304\147\0\1\u0305"+
+    "\120\0\1\u0306\120\0\1\u0307\105\0\1\u0308\104\0\1\u0309"+
+    "\141\0\1\u01b6\12\0\1\u0265\45\0\1\u0267\1\u030a\5\u0267"+
+    "\1\u030a\2\0\3\u0267\1\0\1\u0267\1\0\1\u030a\1\u0267"+
+    "\1\0\1\u0267\1\u030a\6\u0267\2\u030a\6\u0267\1\0\2\u030a"+
+    "\1\0\1\u030a\2\0\4\u030a\17\u0267\2\u030a\22\u0267\1\0"+
+    "\3\5\5\u030b\2\0\3\5\1\u030b\1\0\1\u030b\1\0"+
+    "\2\5\3\0\1\5\2\u030b\1\5\2\u030b\2\0\2\5"+
+    "\2\u030b\2\5\13\0\2\5\1\u030b\1\5\1\u030b\3\5"+
+    "\1\u030b\7\5\1\0\1\5\1\u030b\20\5\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u030c\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\2\6\1\u030d\14\6\1\5"+
+    "\1\0\22\6\1\0\1\5\5\6\1\u030e\1\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\1\u030f\3\6\1\u0310\1\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\11\6\1\u0288\10\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u014f\2\6\13\0\17\6"+
+    "\1\5\1\0\11\6\1\u0311\10\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u0312\15\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u0313\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0314\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u0315\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0316\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u0317\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u02ba\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\3\u0109\5\u0318\1\145\1\0\3\u0109\1\u0318\1\u0109\1\u0318"+
+    "\7\u0109\2\u0318\1\u0109\2\u0318\4\u0109\2\u0318\17\u0109\1\u0318"+
+    "\1\u0109\1\u0318\3\u0109\1\u0318\11\u0109\1\u0318\21\u0109\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\u0319\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\3\157\5\u031a\2\157"+
+    "\1\u0114\2\157\1\u031a\1\u0115\1\u031a\7\157\2\u031a\1\157"+
+    "\2\u031a\4\157\2\u031a\17\157\1\u031a\1\157\1\u031a\3\157"+
+    "\1\u031a\11\157\1\u031a\21\157\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u031b\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\u031c\2\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\2\6\1\u031d"+
+    "\14\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\13\6\1\u031e\3\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u031f\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0320\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0193\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u0321\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0322\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u0323\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u0324\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u02e8\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0325"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u0326"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0327\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0328\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u0329\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u032a"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\u032b\2\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u032c\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u032d\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u032e\15\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u032f\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0330\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u0331\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u0332\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\2\6\1\u0333\17\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\1\u0334\5\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\12\6\1\u0335\7\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u0336\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u0337\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\2\6\1\u0131\14\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0338\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0339\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\4\6\1\240\12\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u033a\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u01f5"+
+    "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u033b"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u0134\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\13\6\1\u0134\3\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u033c\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\2\6\1\u033d\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u033e\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\7\6\1\u033f\7\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0340"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u0341\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\u0342"+
+    "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u0343\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0344\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u0345\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\7\6\1\u0346\7\6\1\5\1\0\22\6\1\0"+
+    "\3\5\5\u0347\2\0\3\5\1\u0347\1\0\1\u0347\1\0"+
+    "\2\5\3\0\1\5\2\u0347\1\5\2\u0347\2\0\2\5"+
+    "\2\u0347\2\5\13\0\2\5\1\u0347\1\5\1\u0347\3\5"+
+    "\1\u0347\7\5\1\0\1\5\1\u0347\20\5\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\u0348\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u0349\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\1\u034a\5\6"+
+    "\2\0\5\6\1\u0162\13\0\10\6\1\u034b\6\6\1\5"+
+    "\1\0\2\6\1\u034c\1\6\1\u034d\15\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\7\6\1\u034e"+
+    "\7\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u034f\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\2\6\1\u01ff\14\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\7\6"+
+    "\1\u0350\7\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\13\6\1\u0351\3\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0352\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\5\6\1\u0353\4\6\1\u0354\7\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u0355"+
+    "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0356"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u0357\10\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0358\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\2\6\1\u0223\14\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u01de\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0359\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\u035a\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\7\6\1\u0162\7\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u035b\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u035c"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u035d\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u035e\10\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\12\6\1\u035f\7\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\2\6\1\u0360\5\6\1\u0361\11\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\3\6\1\u0362\13\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u0363"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\2\6\1\u01fc\3\6\2\0\1\u0128\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u0364\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0365\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u0366\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u0367\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\2\6\1\u0368\14\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\u0369"+
+    "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\5\6\1\u036a\14\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u036b\15\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u036c\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\3\6\1\u036d\13\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u036e\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\11\6\1\u036f\5\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0370\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\15\0\1\u0371\106\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0372\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\u0373\15\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u0374\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u0375\10\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\u0376\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u0377"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u0378\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u0379\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\u037a\16\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u037b\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\10\6\1\u037c\11\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\12\6\1\u0201\4\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u037d\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u037e\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u037f\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u0380\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\5\6\1\u0381\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\2\6\1\u0382\14\6"+
+    "\1\u028b\2\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u0383\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\13\6\1\u01fa\3\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\15\6\1\u0286"+
+    "\1\6\1\5\1\0\4\6\1\u0287\5\6\1\u0289\4\6"+
+    "\1\u028b\2\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u0384\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\14\6\1\u0385\2\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u0386\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u0162\4\6\13\0\17\6\1\5"+
+    "\1\0\1\6\1\u0387\20\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u0388\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\25\0\1\u024b\122\0\1\u024e\135\0\1\u0389"+
+    "\124\0\1\u038a\151\0\1\u038b\71\0\1\u038c\145\0\1\u038d"+
+    "\122\0\1\u038e\53\0\1\u038f\167\0\1\u0390\103\0\1\u0391"+
+    "\121\0\1\u0257\124\0\1\u0392\120\0\1\u0393\150\0\1\u0257"+
+    "\126\0\1\u0394\67\0\1\u0395\147\0\1\u0257\123\0\1\u0396"+
+    "\132\0\1\u0397\65\0\1\u0398\156\0\1\u0399\66\0\1\u0397"+
+    "\122\0\1\u039a\75\0\1\u0306\133\0\1\u0267\76\0\3\5"+
+    "\5\6\2\0\3\5\1\6\1\0\1\6\1\0\2\5"+
+    "\3\0\1\5\2\6\1\5\2\6\2\0\2\5\2\6"+
+    "\2\5\13\0\2\5\1\6\1\5\1\6\3\5\1\6"+
+    "\7\5\1\0\1\5\1\6\20\5\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\4\6\1\u039b\12\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u01de\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u039c\2\6\13\0\6\6\1\u039d\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u0328\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u039e\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u039f\15\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u03a0\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u03a1"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u03a2\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\3\6"+
+    "\1\u03a3\16\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u03a4\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u03a5\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\3\u0109\5\144"+
+    "\1\145\1\0\3\u0109\1\144\1\u0109\1\144\7\u0109\2\144"+
+    "\1\u0109\2\144\4\u0109\2\144\17\u0109\1\144\1\u0109\1\144"+
+    "\3\u0109\1\144\11\u0109\1\144\21\u0109\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\14\6\1\240\2\6\1\5"+
+    "\1\0\22\6\1\0\3\157\5\16\2\157\1\u0114\2\157"+
+    "\1\16\1\u0115\1\16\7\157\2\16\1\157\2\16\4\157"+
+    "\2\16\17\157\1\16\1\157\1\16\3\157\1\16\11\157"+
+    "\1\16\21\157\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\1\0\1\u03a6"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\7\6\1\u03a7"+
+    "\7\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\1\u034a\5\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\7\6\1\u03a8\12\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0385\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+    "\1\u03a9\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u03aa\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u0162\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u03ab\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u01d7\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\4\6\1\u03ac\1\6\2\0\1\u03ad\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u03ae\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u03af\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+    "\1\u03b0\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u03b1\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\3\6\1\u03b2\13\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u03b3\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0329\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u03b4\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u03af\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u03b5\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u03b6\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\3\6\1\u0162\13\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\u03b7\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\6\6\1\u03b8\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u03b9\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u03ba\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\2\6\1\u03bb\3\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u03bc\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\4\6\1\u01f5\12\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\2\6\1\u03bd\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\u03be\15\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u03bf\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u0134\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u03c0"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u03c1"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u03c2\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\u03c3\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\3\6\1\u03c4\13\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u0341\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u03c5\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u03c6\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u03c7\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\1\6\1\u03c8\20\6\1\0\3\5\5\u03c9\2\0\3\5"+
+    "\1\u03c9\1\0\1\u03c9\1\0\2\5\3\0\1\5\2\u03c9"+
+    "\1\5\2\u03c9\2\0\2\5\2\u03c9\2\5\13\0\2\5"+
+    "\1\u03c9\1\5\1\u03c9\3\5\1\u03c9\7\5\1\0\1\5"+
+    "\1\u03c9\20\5\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u03ca\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\4\6\1\u03cb\12\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u03cc"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\243\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u03cd\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u03ce\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u03cf\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u03d0\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\5\6\1\u03d1\1\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\5\6\1\u03d2"+
+    "\14\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\1\6\1\u03d3\4\6"+
+    "\2\0\6\6\13\0\15\6\1\u0286\1\6\1\5\1\0"+
+    "\4\6\1\u034d\1\u03d2\11\6\1\u028b\2\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\10\6\1\u03d4\11\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u03d5\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\12\6\1\u03d6\4\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\6\6\1\u03d7\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u03d8\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u03d9\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\4\6\1\u03da\12\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\5\6\1\u03db\14\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u03dc\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u03dd\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\u03de\2\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u03df\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u03e0\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\u03e1\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u03e2\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u03e3\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u03e4"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\2\6\1\u03e5"+
+    "\14\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\7\6\1\u03e6\7\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\4\6\1\u03e7\1\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u03e8\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u03b6\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\1\u03e9"+
+    "\5\6\1\0\1\u03ea\6\6\13\0\10\6\1\u03eb\6\6"+
+    "\1\5\1\0\15\6\1\u03ec\4\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\14\6\1\u03ed\2\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u03ee\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\u01fa"+
+    "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u03ef\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u03f0\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u03f1\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u03f2\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u03f3\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\37\0\1\u03f4\64\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\13\6\1\u03f5\3\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u03f6\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\4\6\1\u03f7\1\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\12\6"+
+    "\1\u03f8\4\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\2\6\1\u03f9\3\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u03fa\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\6\6\1\u03fb\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u03fc"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\4\6\1\u03fd\1\u03fe\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\10\6\1\u03ff\11\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\2\6"+
+    "\1\u0400\17\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0401\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u0162"+
+    "\13\0\17\6\1\5\1\0\2\6\1\u0402\1\6\1\u0403"+
+    "\5\6\1\u0404\7\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u0405\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\4\6\1\u0406\12\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0407\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\5\6\1\u0408\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u0409"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u040a\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u040b\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\5\6\1\u040c\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\u040d\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\2\6\1\u040e\3\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u040f\13\0\17\6\1\5\1\0\22\6\66\0"+
+    "\1\u0410\116\0\1\u0411\104\0\1\u0257\73\0\1\u0257\150\0"+
+    "\1\u02fb\116\0\1\u0302\145\0\1\u02fb\100\0\1\u0257\125\0"+
+    "\1\u0412\120\0\1\u0413\145\0\1\u0414\117\0\1\u0415\56\0"+
+    "\1\u0410\166\0\1\u038c\42\0\44\u0397\1\u0257\56\u0397\37\0"+
+    "\1\u0416\143\0\1\u0417\101\0\1\u0418\63\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\14\6\1\u0162\2\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u0419\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u041a"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u041b\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u041c\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\12\6\1\u041d\4\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u041e\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u041f\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u0420\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0421"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u0422"+
+    "\10\6\1\5\1\0\22\6\7\0\1\u0423\20\0\1\u0424"+
+    "\73\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\2\6\1\u0425\3\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u0426\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u0427\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u0428\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0429"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\u042a\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u042b\1\u042c\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u042d\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u02ba"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u042e"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\2\6\1\u02ba\14\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\u042f"+
+    "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\4\6\1\u0430\1\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0431\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u0432\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0433\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u0434\1\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u0435\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0436\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\5\6\1\u0437\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\13\6"+
+    "\1\u0438\6\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u01f5\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\3\6\1\240\13\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u0439\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0153\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\4\6\1\u0134\12\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u043a"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u043b\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u043c\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\u043d\2\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u043e\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\5\6\1\u01e3\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\14\6\1\u028a\5\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u043f\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\4\6\1\u0440\12\6\1\5\1\0\22\6\1\0"+
+    "\3\5\5\255\2\0\3\5\1\255\1\0\1\255\1\0"+
+    "\2\5\3\0\1\5\2\255\1\5\2\255\2\0\2\5"+
+    "\2\255\2\5\13\0\2\5\1\255\1\5\1\255\3\5"+
+    "\1\255\7\5\1\0\1\5\1\255\20\5\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u01c1\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0441\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u01d9"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u0442\15\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\2\6\1\u016f\14\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u0443"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u0444"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u0445\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u0446\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\u0447\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u0448\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u0449\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u044a\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\1\u044b\21\6\1\0\1\5\5\6\1\u044c"+
+    "\1\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\1\u030f\5\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\14\6\1\u044d\2\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u044e\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u044f\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u0450\1\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u0385\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\3\6\1\u0451\13\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u0452\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u0453\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0454\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u0455"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u0456\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0457\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\5\6\1\u0458\1\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\12\6\1\u0459\1\6"+
+    "\1\u045a\5\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u045b\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\4\6\1\u045c\1\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\1\6\1\u045d\1\u045e"+
+    "\2\6\1\u045f\2\6\1\u0460\11\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\14\6\1\u0248\2\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u0461\15\6\1\5\1\0"+
+    "\22\6\103\0\1\u0462\3\0\1\u0463\14\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u03d4\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u0464\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\1\u0465\5\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u0466\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\14\6\1\u0467"+
+    "\5\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0468\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\2\6\1\u0469\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\4\6\1\u046a\1\u040c\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\40\0\1\u046b\63\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\4\6\1\u046c\1\6\2\0\6\6\13\0\15\6\1\u046d"+
+    "\1\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u046e\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u046f\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0470"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\u0177\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\10\6\1\u0471\6\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\12\6\1\u0472\4\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0473"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u0474"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u0475\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0476\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0477\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0478\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0479\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u047a\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\u047b\2\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u047c\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\16\6\1\u047d\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u047e"+
+    "\5\6\1\u047f\2\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\1\6\1\u0480\4\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u0481\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\14\6\1\u0482\2\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0483"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\201\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\10\6"+
+    "\1\u0484\11\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u0485\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\u0486\16\6\1\5\1\0\22\6\42\0\1\u0487\124\0"+
+    "\1\u0488\111\0\1\u0489\34\0\1\u048a\71\0\1\u02fb\125\0"+
+    "\1\u048b\120\0\1\u048c\124\0\1\u048d\141\0\1\u048e\127\0"+
+    "\1\u048f\35\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u012d"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0490"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\7\6\1\u0491\7\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\2\6\1\u0492\17\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0493"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u0494\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\14\6\1\u0495\2\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0496\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u0497\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u0498"+
+    "\15\6\1\5\1\0\22\6\42\0\1\u0499\74\0\1\u049a"+
+    "\107\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u049b"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u049c\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u049d\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0196"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\14\6\1\u049e"+
+    "\2\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u049f\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u04a0\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\2\6\1\u04a1\3\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\4\6\1\u0284\1\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u04a2\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u04a3\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u04a4\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u04a5\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u04a6\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\6\6\1\u04a7\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u04a8"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u04a9\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\4\6\1\u04aa\12\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u04ab\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u04ac\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u04ad\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u04ae\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0131\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u04af\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u04b0\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u039b\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\1\6\1\u04b1\4\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u04b2\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\5\6\1\u04b3\1\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\1\u034a"+
+    "\5\6\2\0\6\6\13\0\17\6\1\5\1\0\2\6"+
+    "\1\u04b4\5\6\1\u04b5\7\6\1\76\1\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u0472\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u04b6\10\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0385\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u04b7"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\16\6\1\u04b8"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\2\6\1\u04b9\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u04ba\10\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u0181\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u04bb\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u04bc\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u04bd\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u04be\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\5\6\1\u01e3\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\10\6\1\u04bf\11\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\4\6\1\u0287\15\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\7\6\1\u04c0\7\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u04c1\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u04c2\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u04c3\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\2\6"+
+    "\1\u04c4\3\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\12\6\1\u04c5\7\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u04c6\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u04c7\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u04c8\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u04c9\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\2\6\1\u04ca\3\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u04cb\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\2\6\1\u04cc\14\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u04cd\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u04ce\4\6"+
+    "\13\0\4\6\1\u04cf\12\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u04d0\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\u04d1\16\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u04d2\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u04d3\12\6\1\5\1\0\22\6\37\0\1\u04d4\100\0"+
+    "\1\u04d5\106\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u04d6\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u04d7\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\16\6\1\u0162\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u04d8\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u04d9\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u04da\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u04db\15\6\1\5\1\0"+
+    "\22\6\74\0\1\u04dc\27\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u04dd\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u04de\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u04df\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u04e0\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\1\6\1\u04e1\20\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u04e2"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u012d\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u04e3\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u04e4\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u04e5"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u04e6\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u04e7\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u04e8\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u04e9\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u04ea\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u04eb\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\10\6\1\u04ec\6\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\15\6\1\u0286"+
+    "\1\6\1\5\1\0\4\6\1\u0287\15\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u04ed\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\15\6\1\u027b\1\6\1\5"+
+    "\1\0\14\6\1\u028a\5\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\u04ee\2\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u04ef\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\20\6\1\76\1\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u04f0\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u04f1\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u04f2\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\10\6\1\u028e\11\6\43\0\1\u0257\121\0"+
+    "\1\u04f3\146\0\1\u04f4\76\0\1\u04f5\117\0\1\u04f6\157\0"+
+    "\1\u0257\71\0\1\u0397\116\0\1\u0397\122\0\1\u04f7\64\0"+
+    "\1\5\7\6\2\0\1\123\1\u04f8\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u04f9\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\u04fa"+
+    "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u04fb\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\1\0\1\u04fc\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\15\6\1\u0286\1\6\1\5\1\0\17\6"+
+    "\1\u028b\2\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u04fd\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u04fe\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u04ff\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\37\0\1\u0500\151\0\1\u0501\35\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u047d\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\u0223\16\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u0502\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\4\6\1\u0287\5\6\1\u0289\7\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\13\6\1\u0503\3\6\1\5\1\0\22\6\1\0\1\5"+
+    "\5\6\1\u0504\1\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\1\0\1\u0505\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u0506\1\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u0507\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\2\6\1\u0382\17\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\u0508\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\5\6\1\u0509\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u050a\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u0321\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\1\u01ff\21\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\4\6\1\u050b\15\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\16\6\1\u012d\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u050c\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u01d9\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\1\u03bf\21\6\1\0\1\5"+
+    "\7\6\2\0\1\123\2\6\1\240\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\4\6"+
+    "\1\u050d\1\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\u050e\2\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u050f\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u0510\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0511\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0512"+
+    "\1\u0513\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u012d\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0514\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0515\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\2\6\1\u0516"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\u03b1\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0517\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\2\6"+
+    "\1\u0518\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\2\6\1\u0519\3\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u051a\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u051b\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u051c\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\2\6"+
+    "\1\u012d\14\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u051d\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u051e\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u051f"+
+    "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\2\6\1\u0520\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u0521\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0522\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\2\6\1\u0523\3\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u0524\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\13\6\1\u0525"+
+    "\6\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u0526\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\1\u0527\5\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u0528\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\13\6\1\u0529\3\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\4\6\1\u052a\12\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u052b\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u052c\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u052d\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u052e"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\42\0\1\u052f"+
+    "\144\0\1\u0530\37\0\1\5\7\6\2\0\1\123\1\u0330"+
+    "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\5\6\1\u0531\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0532\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0533\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0534"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u0535\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u0536\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u0537\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u0538\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0539\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u053a\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\2\6\1\u053b"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u053c"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u053d\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\7\6\1\u053e\7\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\u053f\16\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u0540\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u02ea\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u0541\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\u0542\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\3\6\1\u0543\13\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\u0544\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u0162"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u0545\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u02bd\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\5\6\1\u0546\1\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u0547\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u0450\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\16\0\1\u0548\145\0\1\u0549\120\0\1\u054a"+
+    "\124\0\1\u054b\151\0\1\u054c\33\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u054d\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u0385\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\3\6"+
+    "\1\u054e\13\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\5\6\1\u054f\13\0\17\6\1\5"+
+    "\1\0\22\6\103\0\1\u0550\3\0\1\u0551\14\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u01fa"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\10\6"+
+    "\1\u0552\11\6\41\0\1\u0553\124\0\1\u0554\60\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0555"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\5\6\1\u0556\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u0557\1\6\13\0\17\6\1\5\1\0\22\6\30\0"+
+    "\1\u0558\73\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u0559\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\3\6"+
+    "\1\u0196\13\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u04c1\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u0433\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u055a\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u055b\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u055c\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u055d\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u055e\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u055f\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u0560\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u0162"+
+    "\5\6\13\0\17\6\1\5\1\0\3\6\1\u0561\16\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0562\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u0563\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u0564\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u0565\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u0566\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\5\6\1\u0567\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u0568\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\4\6\1\u0569\1\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\2\6\1\u056a\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u056b\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\21\6\1\u02cd\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\2\6\1\u056c\14\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u056d\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u056e\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\1\6\1\u056f\4\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0570\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0571\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u0572"+
+    "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u0573\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0574\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\3\6\1\u0575\13\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u0576\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0577\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u04e5\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0578"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u0472\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0579\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\6\6\1\u057a\10\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\4\6\1\u0162\1\6"+
+    "\13\0\17\6\1\5\1\0\22\6\37\0\1\u057b\125\0"+
+    "\1\u057c\61\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u057d"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u053e\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\2\6\1\u057e\14\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\2\6\1\u057f\14\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\7\6"+
+    "\1\u0580\7\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0581\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u0582\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u012d\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u0419\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0583\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\4\6"+
+    "\1\u0584\1\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\1\u0585\21\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\2\6\1\276"+
+    "\14\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0586\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u053d\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0587"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u0588\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u0589\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\u058a\2\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u058b\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u058c\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\140\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\u058d"+
+    "\16\6\1\5\1\0\22\6\41\0\1\u058e\124\0\1\u054b"+
+    "\121\0\1\u0257\142\0\1\u0257\121\0\1\u058f\42\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u0590\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\3\6\1\u040e\13\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u0591\10\6\1\5\1\0\22\6"+
+    "\14\0\1\u0592\123\0\1\u0593\106\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u0594\15\6\1\5"+
+    "\1\0\22\6\73\0\1\u0595\111\0\1\u0596\41\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u0597\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\5\6\1\u0598"+
+    "\1\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u0599\15\6\1\5\1\0\22\6"+
+    "\66\0\1\u059a\35\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u059b"+
+    "\1\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0228\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\4\6\1\u059c\15\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u059d\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u059e\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\2\6"+
+    "\1\u059f\14\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\5\6\1\u05a0\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\4\6\1\u05a1\1\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\u05a2\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\u05a3\16\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\1\0"+
+    "\1\u05a4\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\3\6"+
+    "\1\u04f2\13\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u05a5\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u05a6\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u05a7\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u05a8\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u05a9\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u05aa\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u05ab\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\5\6\1\u01e3\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\4\6\1\u05ac\15\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u05ad"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\5\6"+
+    "\1\u05ae\14\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u05af\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\15\6\1\u0286\1\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u05b0"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u05b1\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u012d\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u0419\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u05b2\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u05b3\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u05b4\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\5\6\1\u05b5\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u05b6\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u05b7\5\6\13\0\17\6\1\5\1\0\22\6\41\0"+
+    "\1\u04dc\75\0\1\u05b8\107\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u05b9\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\5\6\1\u05ba\1\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\5\6"+
+    "\1\u05bb\2\0\6\6\13\0\17\6\1\5\1\0\12\6"+
+    "\1\u05bc\7\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\1\u05bd\5\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u05be\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u05bf\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u05c0\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u05c1"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u05c2"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u05c3\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0419\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\7\6\1\u05c4\7\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\7\6\1\u05c5"+
+    "\7\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\2\6"+
+    "\1\u05c6\13\6\1\u05c7\3\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u05c8\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u012d\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\2\6"+
+    "\1\u05c9\14\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u05ca\10\6"+
+    "\1\5\1\0\22\6\37\0\1\u048c\147\0\1\u0397\37\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u05cb\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u05cc\15\6"+
+    "\1\5\1\0\22\6\31\0\1\u05cd\157\0\1\u05ce\35\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\2\6"+
+    "\1\u05cf\14\6\1\5\1\0\22\6\61\0\1\u03f4\102\0"+
+    "\1\u05d0\62\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\1\6\1\u05d1\4\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u05d2\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\5\6\1\u0450\13\0\17\6\1\5"+
+    "\1\0\22\6\73\0\1\u05d3\30\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u05d4\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u05d5\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u05d6"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\7\6\1\u05d7"+
+    "\7\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u05d8\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u05d9"+
+    "\1\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u05da"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u05db\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6";
+
+  private static final String ZZ_TRANS_PACKED_1 =
+    "\2\0\6\6\13\0\1\6\1\u05dc\15\6\1\5\1\0"+
+    "\22\6\103\0\1\u05dd\20\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\1\u02ba\21\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u05de"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\11\6\1\u0385"+
+    "\5\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\14\6"+
+    "\1\u028a\5\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\13\6\1\u05df\3\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\13\6\1\u02ba\3\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\12\6\1\u012d\7\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\276\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\u05e0\16\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\u05e1\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\u012d\16\6\1\5\1\0"+
+    "\22\6\1\0\1\5\5\6\1\u05e2\1\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u05e3\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u05e4\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u05e5\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\276"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\2\6\1\u05e6\14\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u05e7\15\6\1\5\1\0"+
+    "\22\6\73\0\1\u05e8\30\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u05e9\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u05ea\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u05eb\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u05ec\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u05ed\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u05ee"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u05ef\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u05f0\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\14\6\1\u05f1\2\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\u05f2\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\2\6\1\u05e4\3\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\17\6\1\u028b\2\6"+
+    "\1\0\1\5\5\6\1\u05f3\1\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u05f4"+
+    "\1\u01e3\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u05f5\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u05f6\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\2\6\1\u05f7"+
+    "\17\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u05f8\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u031e\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u05f9\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u012d\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\44\0\1\u05fa\142\0\1\u05fb\37\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u05fc\10\6"+
+    "\1\5\1\0\22\6\40\0\1\u04dc\63\0\1\5\7\6"+
+    "\2\0\1\123\1\u05fd\2\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u05fe\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\70\0\1\u05ff\33\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\u0600\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\6\6\1\u0601\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\14\6\1\u0602\5\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u0603\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0604\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\6\6\1\u01fc\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u03b6"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u0605\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\2\6\1\u0385\14\6\1\5\1\0\22\6"+
+    "\66\0\1\u0606\35\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\7\6\1\u0607\7\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\u0608\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0609\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u060a\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u060b\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u060c\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u0472\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\5\6\1\u060d\1\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\4\6\1\u060e\1\u01e3\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\14\6\1\u060f\2\6\1\u0610\2\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\2\6\1\u045e\17\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u05e6\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\60\0\1\u0611\43\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0612\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\u0613\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\4\6\1\u0614\12\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u0615\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u0616\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\5\6\1\u026d\1\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\4\6\1\u060e\1\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\1\6\1\u0617\15\6"+
+    "\1\u0610\2\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\4\6\1\u0472\12\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\2\6\1\u0618\17\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u05dc\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u0619\1\6\13\0\1\6\1\u061a"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u061b\10\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u061c\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u061d"+
+    "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u061e\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u061f\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u02ea"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\41\0\1\u0620"+
+    "\142\0\1\u0621\42\0\1\5\7\6\2\0\1\123\2\6"+
+    "\1\u0622\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u0623\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\12\6\1\u0624\4\6"+
+    "\1\5\1\0\22\6\41\0\1\u0625\62\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\13\6\1\u04ed\3\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0626\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u0627"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u0628\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\1\0\1\u0629\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u062a\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\67\0\1\u062b\34\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u062c\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u062d\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u062e\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\2\6\1\u0573\14\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u062f\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u0630\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u0631\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u0632\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u0633\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u0634\10\6"+
+    "\1\5\1\0\22\6\37\0\1\u0635\64\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0573\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u0636\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\u0637\15\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u0638\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\16\6\1\u0385\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u04ce\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u0639\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u063a\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u063b\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u063c\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u063d\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u063e\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u063f\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\1\0\1\u0640"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\37\0\1\u04dc"+
+    "\145\0\1\u0641\41\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u0642\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\2\6\1\u01fc\14\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u0643\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\64\0\1\u0644\37\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u0645"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u0646\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u060e"+
+    "\1\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\7\0\1\u0647\114\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u0648\10\6\1\5\1\0\22\6"+
+    "\63\0\1\u0649\40\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u01d9\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u02af"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u064a\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\5\6\1\u064b\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u064c\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u03a0\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\2\6\1\u064d\14\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u064e\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u064f\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\2\6\1\u0650\14\6\1\5\1\0"+
+    "\22\6\34\0\1\u0651\67\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u0652\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\2\6\1\u0653\14\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u0654\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\1\u0472"+
+    "\21\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+    "\1\u04ed\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u0655\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u0197\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0656\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\2\6"+
+    "\1\u032f\14\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u0657\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\75\0\1\u0658\66\0\1\u0659\62\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u0638\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u065a\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\66\0\1\u065b\35\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u065c\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\5\6\1\u039b\11\6\1\5\1\0"+
+    "\22\6\61\0\1\u065d\42\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u065e\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\43\0\1\u065f\60\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\2\6\1\u0660\14\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+    "\1\u0661\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u03f3\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0662\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\13\6\1\u0573\3\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u0663\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u05b0\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\65\0\1\u0664\36\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\16\6"+
+    "\1\u0665\3\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u0666\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u054f\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u0667\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\7\6\1\u0668\7\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0669"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\41\0\1\u066a"+
+    "\111\0\1\u066b\52\0\1\u066c\20\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\5\6\1\u066d\13\0\17\6\1\5\1\0"+
+    "\22\6\67\0\1\u066e\34\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u066f\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\15\0\1\u0670\106\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u0671\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\41\0\1\u0672\62\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\1\u03e9"+
+    "\5\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\5\6\1\u0673\1\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\14\6\1\u0674\5\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u04fb\10\6\1\5"+
+    "\1\0\22\6\64\0\1\u0675\37\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0676\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0677\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0678"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\1\0\1\u0679\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\7\6\1\u067a\7\6\1\5\1\0"+
+    "\22\6\62\0\1\u067b\103\0\1\u067c\143\0\1\u067d\37\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u067e\10\6\1\5\1\0\22\6\42\0\1\u067f\61\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u0680\10\6\1\5\1\0\22\6\37\0\1\u0681\64\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\1\u034a\5\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\34\0\1\u02d3\50\0\1\u0682"+
+    "\16\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\u0683\16\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u0684\15\6"+
+    "\1\5\1\0\22\6\41\0\1\u0685\62\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0686\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\13\6\1\u012d\3\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\u0687"+
+    "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\116\0"+
+    "\1\u0688\5\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\1\0\1\u0689"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\66\0\1\u068a"+
+    "\115\0\1\u068b\101\0\1\u068c\63\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u068d\15\6\1\5"+
+    "\1\0\22\6\43\0\1\u068e\60\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\1\u068f"+
+    "\21\6\40\0\1\u0690\151\0\1\u0691\34\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u0692\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u0586\10\6\1\5\1\0"+
+    "\22\6\63\0\1\u0693\40\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u034f\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u04ed\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\41\0\1\u0694\176\0"+
+    "\1\u0695\45\0\1\u0696\146\0\1\u0697\124\0\1\u0698\35\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u0699\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\27\0\1\u069a\74\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u069b\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\61\0\1\u069c\130\0"+
+    "\1\u069d\34\0\1\5\7\6\2\0\1\123\1\6\1\u027a"+
+    "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\37\0"+
+    "\1\u069e\122\0\1\u069f\77\0\1\u0694\147\0\1\u06a0\157\0"+
+    "\1\u04dc\107\0\1\u0620\40\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\10\6\1\u0361"+
+    "\11\6\42\0\1\u06a1\61\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u0385\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\43\0\1\u04dc\73\0\1\u06a2\174\0\1\u06a3\67\0"+
+    "\1\u06a4\153\0\1\u06a5\132\0\1\u06a6\65\0\1\u06a7\144\0"+
+    "\1\u06a8\127\0\1\u06a9\73\0\1\u06aa\144\0\1\u06ab\103\0"+
+    "\1\u06ac\75\0\1\u06ad\146\0\1\u06ae\117\0\1\u06af\100\0"+
+    "\1\u06b0\137\0\1\u06b1\201\0\1\u06b2\55\0\1\u06b3\165\0"+
+    "\1\u06b4\53\0\1\u06b5\126\0\1\u06b6\121\0\1\u06b7\142\0"+
+    "\1\u04dc\134\0\1\u06b8\61\0\1\u06b9\130\0\1\u022e\76\0"+
+    "\1\u06ba\170\0\1\u057b\120\0\1\u06bb\123\0\1\u06bc\100\0"+
+    "\1\u06bd\125\0\1\u0596\146\0\1\u04dc\34\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[140104];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_1, 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 =
+    "\4\0\6\1\1\11\3\1\1\11\20\1\2\11\3\1"+
+    "\1\11\32\1\1\11\5\1\1\11\10\1\1\11\25\1"+
+    "\1\11\1\0\12\1\2\11\41\1\1\0\107\1\2\0"+
+    "\1\11\4\0\1\11\2\0\1\11\22\0\3\1\1\0"+
+    "\15\1\1\11\12\1\1\11\205\1\37\0\22\1\1\11"+
+    "\141\1\1\0\32\1\2\0\1\1\2\0\1\1\10\0"+
+    "\1\11\17\0\154\1\1\0\32\1\35\0\146\1\1\0"+
+    "\27\1\22\0\13\1\1\0\103\1\1\0\11\1\1\0"+
+    "\33\1\2\0\1\1\6\0\12\1\2\0\75\1\2\0"+
+    "\7\1\1\0\33\1\11\0\11\1\2\0\71\1\2\0"+
+    "\6\1\1\11\26\1\5\0\4\1\1\0\3\1\2\0"+
+    "\3\1\1\0\51\1\2\0\27\1\5\0\3\1\2\0"+
+    "\1\1\2\0\3\1\1\0\42\1\2\0\21\1\2\0"+
+    "\2\1\2\0\1\1\2\0\3\1\1\0\11\1\1\0"+
+    "\23\1\1\0\24\1\2\0\1\1\1\0\2\1\1\0"+
+    "\11\1\1\0\12\1\1\0\21\1\2\0\3\1\1\0"+
+    "\6\1\1\0\12\1\1\0\16\1\2\0\3\1\1\0"+
+    "\3\1\1\0\1\1\1\0\11\1\1\0\12\1\2\0"+
+    "\2\1\1\0\2\1\1\0\1\1\1\0\7\1\1\0"+
+    "\6\1\2\0\1\1\1\0\1\1\1\0\1\1\1\0"+
+    "\4\1\1\0\5\1\3\0\1\1\1\0\1\1\1\0"+
+    "\1\1\1\0\2\1\1\0\3\1\1\0\1\1\3\0"+
+    "\1\1\1\0\1\1\2\0\2\1\1\0\2\1\5\0"+
+    "\1\1\1\0\1\1\2\0\1\1\6\0\1\1\1\0"+
+    "\1\1\16\0\1\1\23\0";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[1725];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public JavaTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+		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 JavaTokenMaker(java.io.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 JavaTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 192) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 38: break;
+        case 32: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 39: break;
+        case 13: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken;
+          }
+        case 40: break;
+        case 18: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 41: break;
+        case 15: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 42: break;
+        case 4: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 43: break;
+        case 19: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 44: break;
+        case 10: 
+          { addToken(Token.ANNOTATION);
+          }
+        case 45: break;
+        case 30: 
+          { addToken(Token.FUNCTION);
+          }
+        case 46: break;
+        case 6: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 47: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 48: break;
+        case 34: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos;
+          }
+        case 49: break;
+        case 26: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 50: break;
+        case 17: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 51: break;
+        case 21: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 52: break;
+        case 7: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 53: break;
+        case 24: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION);
+          }
+        case 54: break;
+        case 29: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 55: break;
+        case 23: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 56: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 57: break;
+        case 25: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos;
+          }
+        case 58: break;
+        case 28: 
+          { start = zzMarkedPos-3; yybegin(DOCCOMMENT);
+          }
+        case 59: break;
+        case 35: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos;
+          }
+        case 60: break;
+        case 22: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 61: break;
+        case 33: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 62: break;
+        case 37: 
+          { addToken(Token.RESERVED_WORD_2);
+          }
+        case 63: break;
+        case 14: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 64: break;
+        case 9: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 65: break;
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 66: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 67: break;
+        case 8: 
+          { addToken(Token.OPERATOR);
+          }
+        case 68: break;
+        case 16: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 69: break;
+        case 36: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 70: break;
+        case 20: 
+          { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+          }
+        case 71: break;
+        case 31: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 72: break;
+        case 11: 
+          { 
+          }
+        case 73: break;
+        case 27: 
+          { addToken(Token.ERROR_STRING_DOUBLE);
+          }
+        case 74: 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 1726: break;
+            case DOCCOMMENT: {
+              yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken;
+            }
+            case 1727: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 1728: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 1729: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JsonTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/JsonTokenMaker.flex
new file mode 100644
index 0000000..91ba285
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JsonTokenMaker.flex
@@ -0,0 +1,260 @@
+/*
+ * 12/23/2012
+ *
+ * JsonTokenMaker.java - Scanner for the JSON.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the JSON.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated JsonTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class JsonTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public JsonTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns <code>true</code> always as C-style languages use curly braces
+	 * to denote code blocks.
+	 *
+	 * @return <code>true</code> always.
+	 */
+	public boolean getCurlyBracesDenoteCodeBlocks() {
+		return true;
+	}
+
+
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	public boolean getShouldIndentNextLineAfter(Token t) {
+		if (t!=null && t.textCount==1) {
+			char ch = t.text[t.textOffset];
+			return ch=='{' || ch=='[';
+		}
+		return false;
+	}
+
+
+	/**
+	 * 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 = YYINITIAL;
+		start = text.offset;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.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;
+	}
+
+
+%}
+
+Whitespace				= ([ \t\f]+)
+Digit					= ([0-9])
+HexDigit				= ({Digit}|[A-Fa-f])
+IdentifierStart			= ([^\" \t\f\[\]\{\}\:,0-9\-])
+IdentifierPart			= ({IdentifierStart}|{Digit}|[\-])
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+
+AnyCharacterButDoubleQuoteOrBackSlash	= ([^\\\"\n])
+EscapedSourceCharacter	= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape					= ("\\"(([btnfr\"\\/])|{EscapedSourceCharacter}))
+StringLiteral			= ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
+UnclosedStringLiteral	= ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral		= ({UnclosedStringLiteral}[\"])
+
+IntegerLiteral			= ("-"?{Digit}+)
+FloatLiteral			= ({IntegerLiteral}("."({Digit}+))?([eE][+\-]?{Digit}+)?)
+
+BooleanLiteral			= ("true"|"false")
+
+Separator				= ([\{\}\[\]])
+Separator2				= ([\:,])
+
+%%
+
+<YYINITIAL> {
+
+	"null"	 					{ addToken(Token.RESERVED_WORD); }
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+	{Identifier}				{ addToken(Token.IDENTIFIER); }
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}		{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{ErrorStringLiteral}		{ addToken(Token.ERROR_STRING_DOUBLE); }
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}				{ addToken(Token.IDENTIFIER); }
+	{IntegerLiteral}			{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{FloatLiteral}				{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	\n |
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as identifiers. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JsonTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/JsonTokenMaker.java
new file mode 100644
index 0000000..f76a8c2
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JsonTokenMaker.java
@@ -0,0 +1,699 @@
+/* The following code was generated by JFlex 1.4.1 on 12/23/12 10:47 PM */
+
+/*
+ * 12/23/2012
+ *
+ * JsonTokenMaker.java - Scanner for the JSON.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the JSON.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated JsonTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class JsonTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int YYINITIAL = 0;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\1\1\6\1\0\1\1\23\0\1\1\1\0\1\7\10\0"+
+    "\1\16\1\4\1\5\1\14\1\12\12\2\1\4\6\0\4\3\1\15"+
+    "\1\3\24\0\1\26\1\11\1\26\3\0\1\23\1\13\2\3\1\21"+
+    "\1\22\5\0\1\24\1\0\1\27\3\0\1\20\1\25\1\17\1\10"+
+    "\5\0\1\26\1\0\1\26\uff82\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 =
+    "\1\0\1\1\1\2\1\3\2\1\1\4\2\1\1\5"+
+    "\1\1\2\0\1\4\1\6\1\4\3\1\2\7\1\0"+
+    "\1\10\2\4\3\1\1\4\1\11\1\12\2\4";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[33];
+    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\30\0\60\0\110\0\140\0\170\0\220\0\250"+
+    "\0\300\0\140\0\330\0\360\0\u0108\0\u0120\0\140\0\u0138"+
+    "\0\u0150\0\u0168\0\u0180\0\u0198\0\u01b0\0\u01b0\0\140\0\u01c8"+
+    "\0\u01e0\0\u01f8\0\u0210\0\u0228\0\u0240\0\30\0\30\0\u0258"+
+    "\0\u0270";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[33];
+    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\2\1\3\1\4\1\2\1\5\1\6\1\2\1\7"+
+    "\7\2\1\10\2\2\1\11\3\2\1\12\1\13\1\2"+
+    "\1\0\2\2\1\0\2\2\1\0\16\2\1\0\1\2"+
+    "\1\0\1\3\30\0\1\4\11\0\1\14\1\15\3\0"+
+    "\1\15\40\0\1\4\25\0\6\7\1\16\1\17\1\7"+
+    "\1\20\16\7\1\2\1\0\2\2\1\0\2\2\1\0"+
+    "\10\2\1\21\5\2\1\0\2\2\1\0\2\2\1\0"+
+    "\2\2\1\0\13\2\1\22\2\2\1\0\2\2\1\0"+
+    "\2\2\1\0\2\2\1\0\1\23\15\2\1\0\1\2"+
+    "\2\0\1\24\27\0\1\25\2\0\1\26\10\0\1\26"+
+    "\11\0\7\16\1\27\1\16\1\30\24\16\1\0\1\7"+
+    "\1\31\3\7\3\16\2\7\1\16\1\7\4\16\1\7"+
+    "\1\2\1\0\2\2\1\0\2\2\1\0\1\32\15\2"+
+    "\1\0\2\2\1\0\2\2\1\0\2\2\1\0\14\2"+
+    "\1\33\1\2\1\0\2\2\1\0\2\2\1\0\2\2"+
+    "\1\0\14\2\1\34\1\2\1\0\1\2\2\0\1\24"+
+    "\12\0\1\15\3\0\1\15\10\0\1\25\25\0\6\16"+
+    "\1\0\23\16\2\35\3\16\1\27\1\16\1\30\1\16"+
+    "\1\35\1\16\1\35\3\16\3\35\4\16\1\2\1\0"+
+    "\2\2\1\0\2\2\1\0\11\2\1\36\4\2\1\0"+
+    "\2\2\1\0\2\2\1\0\2\2\1\0\15\2\1\32"+
+    "\1\0\2\2\1\0\2\2\1\0\2\2\1\0\14\2"+
+    "\1\37\1\2\1\0\1\2\2\16\2\40\3\16\1\27"+
+    "\1\16\1\30\1\16\1\40\1\16\1\40\3\16\3\40"+
+    "\6\16\2\41\3\16\1\27\1\16\1\30\1\16\1\41"+
+    "\1\16\1\41\3\16\3\41\6\16\2\7\3\16\1\27"+
+    "\1\16\1\30\1\16\1\7\1\16\1\7\3\16\3\7"+
+    "\4\16";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[648];
+    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 =
+    "\1\0\3\1\1\11\4\1\1\11\1\1\2\0\1\1"+
+    "\1\11\6\1\1\0\1\11\12\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[33];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public JsonTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns <code>true</code> always as C-style languages use curly braces
+	 * to denote code blocks.
+	 *
+	 * @return <code>true</code> always.
+	 */
+	public boolean getCurlyBracesDenoteCodeBlocks() {
+		return true;
+	}
+
+
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	public boolean getShouldIndentNextLineAfter(Token t) {
+		if (t!=null && t.textCount==1) {
+			char ch = t.text[t.textOffset];
+			return ch=='{' || ch=='[';
+		}
+		return false;
+	}
+
+
+	/**
+	 * 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 = YYINITIAL;
+		start = text.offset;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 JsonTokenMaker(java.io.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 JsonTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 90) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 10: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 11: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 12: break;
+        case 6: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 13: break;
+        case 7: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 14: break;
+        case 2: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 15: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 16: break;
+        case 9: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 17: break;
+        case 4: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 18: break;
+        case 8: 
+          { addToken(Token.ERROR_STRING_DOUBLE);
+          }
+        case 19: break;
+        case 5: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 20: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 34: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.flex
new file mode 100644
index 0000000..d720d06
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.flex
@@ -0,0 +1,268 @@
+/*
+ * 04/24/2012
+ *
+ * LatexTokenMaker.java - Scanner for LaTeX.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the LaTeX.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RSTA always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated LatexTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class LatexTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public LatexTokenMaker() {
+	}
+
+
+	/**
+	 * 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() {
+		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;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	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(java.io.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])
+Digit					= ([0-9])
+LetterOrUnderscore		= ({Letter}|[_])
+AnyChar					= ({LetterOrUnderscore}|{Digit}|[\-])
+Whitespace				= ([ \t\f])
+LineCommentBegin		= "%"
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	([\\]{AnyChar}+)			{ addToken(Token.FUNCTION); }
+	[\{\}]						{ addToken(Token.SEPARATOR); }
+	("\\begin{"{AnyChar}+"}")   { int temp = zzStartRead;
+							addToken(temp, temp+5, Token.RESERVED_WORD);
+							addToken(temp+6, temp+6, Token.SEPARATOR);
+							addToken(temp+7, zzMarkedPos-2, Token.RESERVED_WORD);
+							addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+								}
+	("\\end{"{AnyChar}+"}")		{ int temp = zzStartRead;
+							addToken(temp, temp+3, Token.RESERVED_WORD);
+							addToken(temp+4, temp+4, Token.SEPARATOR);
+							addToken(temp+5, zzMarkedPos-2, Token.RESERVED_WORD);
+							addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+								}
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+
+	{LineCommentBegin}			{ start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
+
+	"\n" |
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as identifiers. */
+	{AnyChar}+ |
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+
+<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 |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.java
new file mode 100644
index 0000000..e335280
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.java
@@ -0,0 +1,716 @@
+/* The following code was generated by JFlex 1.4.1 on 4/28/12 4:57 PM */
+
+/*
+ * 04/24/2012
+ *
+ * LatexTokenMaker.java - Scanner for LaTeX.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the LaTeX.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RSTA always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated LatexTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class LatexTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** 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\3\1\32\1\0\1\3\23\0\1\3\1\5\1\0\1\5"+
+    "\1\7\1\4\7\5\1\2\1\22\1\6\12\1\1\20\1\5\1\0"+
+    "\1\5\1\0\2\5\32\1\1\5\1\23\1\5\1\0\1\2\1\0"+
+    "\1\1\1\25\1\1\1\31\1\17\1\14\1\26\1\10\1\15\2\1"+
+    "\1\16\1\1\1\27\1\1\1\12\2\1\1\13\1\11\2\1\1\21"+
+    "\3\1\1\30\1\0\1\24\1\5\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\1\2\1\3\1\1\1\4\1\5\4\6"+
+    "\1\7\3\10\4\0\2\10\4\0\2\10\2\0\1\11"+
+    "\1\0\1\10\3\0\1\10\1\12\2\0\1\13";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[42];
+    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\33\0\66\0\121\0\66\0\66\0\154\0\66"+
+    "\0\66\0\207\0\242\0\275\0\330\0\66\0\363\0\u010e"+
+    "\0\u0129\0\u0144\0\u015f\0\u017a\0\u0195\0\u01b0\0\u01cb\0\u01e6"+
+    "\0\u0201\0\u021c\0\u0237\0\u0252\0\u026d\0\u0288\0\u02a3\0\u02be"+
+    "\0\u02d9\0\u02f4\0\u030f\0\u02be\0\u032a\0\u0345\0\66\0\u0360"+
+    "\0\u037b\0\66";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[42];
+    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\3\3\10\4\1\3\1\4"+
+    "\1\3\1\7\1\10\3\4\1\10\1\4\1\11\10\12"+
+    "\1\13\3\12\1\14\4\12\1\15\10\12\1\16\34\0"+
+    "\2\4\5\0\10\4\1\0\1\4\3\0\3\4\1\0"+
+    "\1\4\2\0\2\17\5\0\7\17\1\20\1\0\1\17"+
+    "\3\0\1\21\2\17\1\0\1\17\1\0\10\12\1\0"+
+    "\3\12\1\0\4\12\1\0\10\12\12\0\1\22\32\0"+
+    "\1\23\3\0\1\24\36\0\1\25\12\0\2\17\5\0"+
+    "\10\17\1\0\1\17\3\0\3\17\1\0\1\17\2\0"+
+    "\2\17\5\0\10\17\1\0\1\17\3\0\2\17\1\26"+
+    "\1\0\1\17\2\0\2\17\5\0\7\17\1\27\1\0"+
+    "\1\17\3\0\3\17\1\0\1\17\12\0\1\30\33\0"+
+    "\1\31\36\0\1\32\35\0\1\33\12\0\2\17\5\0"+
+    "\10\17\1\0\1\17\3\0\3\17\1\0\1\34\2\0"+
+    "\2\17\5\0\10\17\1\0\1\17\3\0\1\17\1\35"+
+    "\1\17\1\0\1\17\13\0\1\36\40\0\1\37\31\0"+
+    "\1\31\35\0\1\40\11\0\2\17\5\0\10\17\1\0"+
+    "\1\17\3\0\3\17\1\41\1\17\2\0\2\17\5\0"+
+    "\5\17\1\42\2\17\1\0\1\17\3\0\3\17\1\0"+
+    "\1\17\14\0\1\31\4\0\1\37\20\0\1\43\25\0"+
+    "\1\40\1\44\1\0\2\44\12\40\1\44\1\40\1\44"+
+    "\2\0\3\40\1\0\1\40\2\0\2\45\5\0\10\45"+
+    "\1\0\1\45\3\0\3\45\1\0\1\45\2\0\2\17"+
+    "\5\0\10\17\1\0\1\17\3\0\2\17\1\46\1\0"+
+    "\1\17\7\0\1\40\25\0\2\45\5\0\10\45\1\0"+
+    "\1\45\2\0\1\47\3\45\1\0\1\45\2\0\2\17"+
+    "\5\0\10\17\1\0\1\17\3\0\3\17\1\50\1\17"+
+    "\2\0\2\51\5\0\10\51\1\0\1\51\3\0\3\51"+
+    "\1\0\1\51\2\0\2\51\5\0\10\51\1\0\1\51"+
+    "\2\0\1\52\3\51\1\0\1\51\1\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[918];
+    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\1\1\2\11\1\1\2\11\4\1\1\11"+
+    "\3\1\4\0\2\1\4\0\2\1\2\0\1\1\1\0"+
+    "\1\1\3\0\1\1\1\11\2\0\1\11";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[42];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public LatexTokenMaker() {
+	}
+
+
+	/**
+	 * 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() {
+		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;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	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(java.io.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;
+		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 LatexTokenMaker(java.io.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 LatexTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 112) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 12: break;
+        case 8: 
+          { addToken(Token.FUNCTION);
+          }
+        case 13: break;
+        case 2: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 14: break;
+        case 9: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 15: break;
+        case 3: 
+          { start = zzMarkedPos-1; yybegin(EOL_COMMENT);
+          }
+        case 16: break;
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 17: break;
+        case 7: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 18: break;
+        case 10: 
+          { int temp = zzStartRead;
+							addToken(temp, temp+3, Token.RESERVED_WORD);
+							addToken(temp+4, temp+4, Token.SEPARATOR);
+							addToken(temp+5, zzMarkedPos-2, Token.RESERVED_WORD);
+							addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+          }
+        case 19: break;
+        case 11: 
+          { int temp = zzStartRead;
+							addToken(temp, temp+5, Token.RESERVED_WORD);
+							addToken(temp+6, temp+6, Token.SEPARATOR);
+							addToken(temp+7, zzMarkedPos-2, Token.RESERVED_WORD);
+							addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+          }
+        case 20: break;
+        case 6: 
+          { 
+          }
+        case 21: break;
+        case 4: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 22: 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 43: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 44: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.flex
new file mode 100644
index 0000000..6fdbb96
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.flex
@@ -0,0 +1,432 @@
+/*
+ * 11/13/2004
+ *
+ * LispTokenMaker.java - Scanner for the Lisp programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Lisp programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated LispTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class LispTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public LispTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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])
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({LetterOrUnderscore}|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+MLCBegin					= "#|"
+MLCEnd					= "|#"
+LineCommentBegin			= ";"
+
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral				= ({IntegerHelper1}[lL]?)
+HexLiteral				= ({IntegerHelper2}[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}+)
+
+Separator					= ([\(\)])
+
+NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator			= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+Operator					= ({NonAssignmentOperator}|{AssignmentOperator})
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier			= ({NonSeparator}+)
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state STRING
+%state MLC
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	"defclass" |
+	"defconstant" |
+	"defgeneric" |
+	"define-compiler-macro" |
+	"define-condition" |
+	"define-method-combination" |
+	"define-modify-macro" |
+	"define-setf-expander" |
+	"define-symbol-macro" |
+	"defmacro" |
+	"defmethod" |
+	"defpackage" |
+	"defparameter" |
+	"defsetf" |
+	"defstruct" |
+	"deftype" |
+	"defun" |
+	"defvar"						{ addToken(Token.RESERVED_WORD); }
+
+	"abort" |
+	"assert" |
+	"block" |
+	"break" |
+	"case" |
+	"catch" |
+	"ccase" |
+	"cerror" |
+	"cond" |
+	"ctypecase" |
+	"declaim" |
+	"declare" |
+	"do" |
+	"do*" |
+	"do-all-symbols" |
+	"do-external-symbols" |
+	"do-symbols" |
+	"dolist" |
+	"dotimes" |
+	"ecase" |
+	"error" |
+	"etypecase" |
+	"eval-when" |
+	"flet" |
+	"handler-bind" |
+	"handler-case" |
+	"if" |
+	"ignore-errors" |
+	"in-package" |
+	"labels" |
+	"lambda" |
+	"let" |
+	"let*" |
+	"locally" |
+	"loop" |
+	"macrolet" |
+	"multiple-value-bind" |
+	"proclaim" |
+	"prog" |
+	"prog*" |
+	"prog1" |
+	"prog2" |
+	"progn" |
+	"progv" |
+	"provide" |
+	"require" |
+	"restart-bind" |
+	"restart-case" |
+	"restart-name" |
+	"return" |
+	"return-from" |
+	"signal" |
+	"symbol-macrolet" |
+	"tagbody" |
+	"the" |
+	"throw" |
+	"typecase" |
+	"unless" |
+	"unwind-protect" |
+	"when" |
+	"with-accessors" |
+	"with-compilation-unit" |
+	"with-condition-restarts" |
+	"with-hash-table-iterator" |
+	"with-input-from-string" |
+	"with-open-file" |
+	"with-open-stream" |
+	"with-output-to-string" |
+	"with-package-iterator" |
+	"with-simple-restart" |
+	"with-slots" |
+	"with-standard-io-syntax"		{ addToken(Token.RESERVED_WORD); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+	[\"]							{ start = zzMarkedPos-1; yybegin(STRING); }
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+	{LineCommentBegin}			{ start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Operator}					{ 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); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<STRING> {
+	[^\n\\\"]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\"					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+
+<MLC> {
+
+	[^hwf\n\|]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\|						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<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; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.java
new file mode 100644
index 0000000..a2a485e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.java
@@ -0,0 +1,1308 @@
+/* The following code was generated by JFlex 1.4.1 on 6/11/09 9:34 AM */
+
+/*
+ * 11/13/2004
+ *
+ * LispTokenMaker.java - Scanner for the Lisp programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Lisp programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated LispTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class LispTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** 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 = 3;
+  public static final int STRING = 1;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 2;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\14\1\13\1\0\1\14\1\10\22\0\1\14\1\34\1\73"+
+    "\1\11\1\1\1\34\1\37\1\42\2\25\1\32\1\26\1\42\1\23"+
+    "\1\24\1\35\1\4\1\71\1\71\5\6\2\3\1\40\1\16\1\27"+
+    "\1\30\1\33\1\36\1\41\3\5\1\21\1\22\1\21\5\1\1\20"+
+    "\13\1\1\17\2\1\1\42\1\12\1\42\1\31\1\2\1\0\1\56"+
+    "\1\64\1\55\1\54\1\52\1\47\1\61\1\43\1\50\1\1\1\67"+
+    "\1\51\1\63\1\60\1\57\1\45\1\72\1\62\1\46\1\44\1\7"+
+    "\1\70\1\53\1\66\1\65\1\1\1\10\1\15\1\10\1\36\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 =
+    "\4\0\1\1\1\2\2\3\1\2\2\1\1\4\1\5"+
+    "\1\6\1\7\1\6\1\1\1\10\5\6\17\2\1\11"+
+    "\1\12\1\13\1\14\1\15\1\12\1\16\5\12\1\17"+
+    "\3\12\1\1\1\20\1\3\1\21\1\20\1\21\1\20"+
+    "\1\22\1\20\1\2\1\23\1\0\1\6\10\2\1\24"+
+    "\14\2\1\24\12\2\1\13\1\25\10\0\1\1\1\21"+
+    "\1\0\2\22\12\2\1\0\1\2\1\24\13\2\1\0"+
+    "\1\24\16\2\10\0\1\1\7\2\1\24\3\2\1\0"+
+    "\20\2\3\0\11\2\2\0\1\26\2\0\1\27\1\1"+
+    "\10\2\1\0\3\2\2\0\13\2\3\0\5\2\4\0"+
+    "\1\1\5\2\1\0\1\2\10\0\12\2\3\0\1\24"+
+    "\2\2\1\0\1\2\16\0\3\2\1\0\4\2\4\0"+
+    "\2\2\21\0\2\2\3\0\2\2\4\0\1\2\21\0"+
+    "\1\2\5\0\2\2\23\0\1\2\201\0";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[512];
+    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\74\0\170\0\264\0\360\0\u012c\0\u0168\0\u01a4"+
+    "\0\u01e0\0\u021c\0\u0258\0\u021c\0\u0294\0\u02d0\0\u021c\0\u030c"+
+    "\0\u0348\0\u021c\0\u0384\0\u03c0\0\u03fc\0\u021c\0\u0438\0\u0474"+
+    "\0\u04b0\0\u04ec\0\u0528\0\u0564\0\u05a0\0\u05dc\0\u0618\0\u0654"+
+    "\0\u0690\0\u06cc\0\u0708\0\u0744\0\u0780\0\u07bc\0\u021c\0\u07f8"+
+    "\0\u0834\0\u021c\0\u021c\0\u0870\0\u021c\0\u08ac\0\u08e8\0\u0924"+
+    "\0\u0960\0\u099c\0\u021c\0\u09d8\0\u0a14\0\u0a50\0\u0a8c\0\u0ac8"+
+    "\0\u0ac8\0\u0ac8\0\u0b04\0\u0b40\0\u0b7c\0\u0bb8\0\u0bf4\0\u0c30"+
+    "\0\u021c\0\u02d0\0\u0c6c\0\u0ca8\0\u0ce4\0\u0d20\0\u0d5c\0\u0d98"+
+    "\0\u0dd4\0\u0e10\0\u0e4c\0\u012c\0\u0e88\0\u0ec4\0\u0f00\0\u0f3c"+
+    "\0\u0f78\0\u0fb4\0\u0ff0\0\u102c\0\u1068\0\u10a4\0\u10e0\0\u111c"+
+    "\0\u1158\0\u1194\0\u11d0\0\u120c\0\u1248\0\u1284\0\u12c0\0\u12fc"+
+    "\0\u1338\0\u1374\0\u13b0\0\u021c\0\u021c\0\u13ec\0\u1428\0\u1464"+
+    "\0\u14a0\0\u14dc\0\u1518\0\u1554\0\u1590\0\u15cc\0\u1608\0\u1644"+
+    "\0\u0ac8\0\u1680\0\u16bc\0\u16f8\0\u1734\0\u1770\0\u17ac\0\u17e8"+
+    "\0\u1824\0\u1860\0\u189c\0\u18d8\0\u1914\0\u1950\0\u198c\0\u19c8"+
+    "\0\u1a04\0\u1a40\0\u1a7c\0\u1ab8\0\u1af4\0\u1b30\0\u1b6c\0\u1ba8"+
+    "\0\u1be4\0\u1c20\0\u1c5c\0\u021c\0\u1c98\0\u1cd4\0\u1d10\0\u1d4c"+
+    "\0\u1d88\0\u1dc4\0\u1e00\0\u1e3c\0\u1e78\0\u1eb4\0\u1ef0\0\u1f2c"+
+    "\0\u1f68\0\u1fa4\0\u1fe0\0\u201c\0\u2058\0\u2094\0\u20d0\0\u210c"+
+    "\0\u2148\0\u2184\0\u21c0\0\u21fc\0\u2238\0\u2274\0\u22b0\0\u22ec"+
+    "\0\u2328\0\u2364\0\u23a0\0\u23dc\0\u2418\0\u2454\0\u2490\0\u24cc"+
+    "\0\u2508\0\u2544\0\u2580\0\u25bc\0\u25f8\0\u2634\0\u2670\0\u26ac"+
+    "\0\u26e8\0\u2724\0\u2760\0\u279c\0\u27d8\0\u2814\0\u2850\0\u288c"+
+    "\0\u28c8\0\u2904\0\u2940\0\u297c\0\u29b8\0\u29f4\0\u2a30\0\u2a6c"+
+    "\0\u2aa8\0\u2ae4\0\u2b20\0\u2b5c\0\u2b98\0\u2bd4\0\u2c10\0\u2c4c"+
+    "\0\u2c88\0\u2cc4\0\u2d00\0\u2d3c\0\u2d78\0\u2db4\0\u2df0\0\u2e2c"+
+    "\0\u2e68\0\u2ea4\0\u2ee0\0\u2f1c\0\u2f58\0\u2f94\0\u2fd0\0\u300c"+
+    "\0\u3048\0\u3084\0\u30c0\0\u30fc\0\u3138\0\u3174\0\u31b0\0\u31ec"+
+    "\0\u3228\0\u3264\0\u32a0\0\u32dc\0\u3318\0\u3354\0\u3390\0\u33cc"+
+    "\0\u3408\0\u3444\0\u3480\0\u34bc\0\u2bd4\0\u34f8\0\u2c88\0\u3534"+
+    "\0\u3570\0\u35ac\0\u35e8\0\u3624\0\u3660\0\u369c\0\u36d8\0\u3714"+
+    "\0\u3750\0\u378c\0\u37c8\0\u3804\0\u3840\0\u387c\0\u38b8\0\u38f4"+
+    "\0\u3930\0\u396c\0\u39a8\0\u39e4\0\u3a20\0\u3a5c\0\u3a98\0\u3ad4"+
+    "\0\u3b10\0\u3b4c\0\u3b88\0\u3bc4\0\u3c00\0\u3c3c\0\u3c78\0\u3cb4"+
+    "\0\u3cf0\0\u3d2c\0\u3d68\0\u3da4\0\u3de0\0\u3e1c\0\u3e58\0\u3e94"+
+    "\0\u3ed0\0\u3f0c\0\u3f48\0\u3f84\0\u3fc0\0\u3ffc\0\u4038\0\u4074"+
+    "\0\u40b0\0\u40ec\0\u4128\0\u4164\0\u41a0\0\u41dc\0\u4218\0\u4254"+
+    "\0\u4290\0\u42cc\0\u4308\0\u4344\0\u4380\0\u43bc\0\u43f8\0\u4434"+
+    "\0\u4470\0\u44ac\0\u44e8\0\u4524\0\u4560\0\u459c\0\u45d8\0\u4614"+
+    "\0\u4650\0\u468c\0\u46c8\0\u4704\0\u4740\0\u477c\0\u47b8\0\u47f4"+
+    "\0\u4830\0\u486c\0\u48a8\0\u48e4\0\u4920\0\u495c\0\u4998\0\u49d4"+
+    "\0\u4a10\0\u4a4c\0\u4a88\0\u4ac4\0\u4b00\0\u4b3c\0\u4b78\0\u4bb4"+
+    "\0\u4bf0\0\u4c2c\0\u4c68\0\u4ca4\0\u4ce0\0\u4d1c\0\u4d58\0\u4d94"+
+    "\0\u4dd0\0\u4e0c\0\u4e48\0\u4e84\0\u4ec0\0\u4efc\0\u4f38\0\u4f74"+
+    "\0\u4fb0\0\u4fec\0\u5028\0\u5064\0\u50a0\0\u50dc\0\u5118\0\u5154"+
+    "\0\u5190\0\u51cc\0\u5208\0\u5244\0\u5280\0\u52bc\0\u52f8\0\u5334"+
+    "\0\u5370\0\u53ac\0\u53e8\0\u5424\0\u5460\0\u549c\0\u54d8\0\u5514"+
+    "\0\u5550\0\u558c\0\u55c8\0\u5604\0\u5640\0\u567c\0\u56b8\0\u56f4"+
+    "\0\u5730\0\u576c\0\u57a8\0\u57e4\0\u5820\0\u585c\0\u5898\0\u58d4"+
+    "\0\u5910\0\u594c\0\u5988\0\u59c4\0\u5a00\0\u5a3c\0\u5a78\0\u5ab4"+
+    "\0\u5af0\0\u5b2c\0\u5b68\0\u5ba4\0\u5be0\0\u5c1c\0\u5c58\0\u5c94"+
+    "\0\u5cd0\0\u5d0c\0\u5d48\0\u5d84\0\u5dc0\0\u5dfc\0\u5e38\0\u5e74"+
+    "\0\u5eb0\0\u5eec\0\u5f28\0\u5f64\0\u5fa0\0\u5fdc\0\u6018\0\u6054"+
+    "\0\u6090\0\u60cc\0\u6108\0\u6144\0\u6180\0\u61bc\0\u61f8\0\u6234"+
+    "\0\u6270\0\u62ac\0\u62e8\0\u6324\0\u6360\0\u639c\0\u63d8\0\u6414"+
+    "\0\u6450\0\u648c\0\u64c8\0\u6504\0\u6540\0\u657c\0\u65b8\0\u65f4"+
+    "\0\u6630\0\u666c\0\u66a8\0\u66e4\0\u6720\0\u675c\0\u6798\0\u67d4"+
+    "\0\u6810\0\u684c\0\u6888\0\u68c4\0\u6900\0\u693c\0\u6978\0\u69b4"+
+    "\0\u69f0\0\u6a2c\0\u6a68\0\u6aa4\0\u6ae0\0\u6b1c\0\u6b58\0\u6b94"+
+    "\0\u6bd0\0\u6c0c\0\u6c48\0\u6c84\0\u6cc0\0\u6cfc\0\u6d38\0\u6d74"+
+    "\0\u6db0\0\u6dec\0\u6e28\0\u6e64\0\u6ea0\0\u6edc\0\u6f18\0\u6f54"+
+    "\0\u6f90\0\u6fcc\0\u7008\0\u7044\0\u7080\0\u70bc\0\u70f8\0\u7134"+
+    "\0\u7170\0\u71ac\0\u71e8\0\u7224\0\u7260\0\u729c\0\u72d8\0\u7314";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[512];
+    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\5\2\6\1\7\1\10\1\6\1\7\1\11\1\12"+
+    "\1\13\1\5\1\14\1\15\1\16\1\17\4\6\1\20"+
+    "\1\21\1\22\1\23\1\24\3\16\1\25\2\16\1\26"+
+    "\1\27\1\26\1\5\1\12\1\30\1\31\1\32\1\33"+
+    "\1\34\1\35\1\36\1\37\1\40\1\41\1\42\1\43"+
+    "\3\6\1\44\1\45\1\46\4\6\1\7\1\6\1\47"+
+    "\12\50\1\51\1\52\57\50\1\53\13\54\1\55\1\54"+
+    "\1\56\25\54\1\57\3\54\1\60\3\54\1\61\20\54"+
+    "\13\62\1\63\27\62\1\64\3\62\1\65\3\62\1\66"+
+    "\20\62\10\5\1\0\2\5\4\0\4\5\16\0\1\5"+
+    "\1\0\30\5\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\30\6\1\0\3\70"+
+    "\2\7\1\70\1\7\1\70\1\0\2\70\4\0\1\70"+
+    "\1\71\1\72\1\73\1\0\1\74\14\0\1\70\1\0"+
+    "\4\70\1\72\1\70\1\71\1\73\1\70\1\72\14\70"+
+    "\1\7\1\70\1\0\3\70\1\75\1\76\1\70\1\76"+
+    "\1\70\1\0\2\70\4\0\1\77\1\71\1\72\1\73"+
+    "\1\0\1\74\14\0\1\70\1\0\4\70\1\72\1\70"+
+    "\1\71\1\73\1\70\1\72\11\70\1\77\2\70\1\76"+
+    "\1\70\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\15\6\1\100\12\6\75\0"+
+    "\10\5\1\0\2\5\2\0\1\101\1\0\4\5\16\0"+
+    "\1\5\1\0\30\5\15\0\1\15\107\0\1\26\66\0"+
+    "\1\26\4\0\1\26\46\0\2\74\1\0\1\74\62\0"+
+    "\1\74\30\0\1\26\1\0\1\26\72\0\1\102\1\26"+
+    "\73\0\1\26\2\0\1\103\70\0\1\26\6\0\1\26"+
+    "\34\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\13\6\1\104\14\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\1\105\12\6\1\106\6\6\1\107\5\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\17\6\1\110\10\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\5\6\1\111\14\6\1\112\5\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\6\6\1\113\21\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\4\6\1\114"+
+    "\10\6\1\115\1\116\11\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\7\6"+
+    "\1\117\3\6\1\120\1\121\13\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\1\6\1\122\10\6\1\123\4\6\1\124\5\6\1\125"+
+    "\2\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\1\126\4\6\1\127\22\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\7\6\1\130\4\6\1\131\13\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\1\6\1\122\5\6\1\132\2\6"+
+    "\1\123\1\133\1\134\13\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\3\6"+
+    "\1\135\15\6\1\136\6\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\7\6"+
+    "\1\137\20\6\1\0\1\5\6\6\1\140\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\13\6\1\141"+
+    "\14\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\6\6\1\142\10\6\1\143"+
+    "\10\6\1\0\12\50\2\0\57\50\1\0\13\144\1\0"+
+    "\60\144\13\54\1\0\1\54\1\0\25\54\1\0\3\54"+
+    "\1\0\3\54\1\0\20\54\11\0\1\145\126\0\1\146"+
+    "\73\0\1\147\3\0\1\150\76\0\1\151\20\0\13\62"+
+    "\1\0\27\62\1\0\3\62\1\0\3\62\1\0\20\62"+
+    "\44\0\1\152\73\0\1\153\3\0\1\154\76\0\1\155"+
+    "\20\0\7\5\1\156\1\0\2\5\4\0\4\5\16\0"+
+    "\1\5\1\0\30\5\1\0\10\70\1\0\2\70\4\0"+
+    "\4\70\16\0\1\70\1\0\30\70\1\0\3\70\2\157"+
+    "\1\70\1\157\1\70\1\0\2\70\4\0\4\70\1\160"+
+    "\2\0\1\160\12\0\1\70\1\0\26\70\1\157\1\70"+
+    "\1\0\3\70\2\74\1\70\1\74\1\70\1\0\2\70"+
+    "\4\0\2\70\1\72\1\73\16\0\1\70\1\0\4\70"+
+    "\1\72\2\70\1\73\1\70\1\72\14\70\1\74\1\70"+
+    "\1\0\3\70\2\75\1\70\1\75\1\70\1\0\2\70"+
+    "\4\0\2\70\1\72\1\73\1\0\1\74\14\0\1\70"+
+    "\1\0\4\70\1\72\2\70\1\73\1\70\1\72\14\70"+
+    "\1\75\1\70\1\0\3\70\1\75\1\76\1\70\1\76"+
+    "\1\70\1\0\2\70\4\0\1\70\1\161\1\72\1\73"+
+    "\1\0\1\74\14\0\1\70\1\0\4\70\1\72\1\70"+
+    "\1\161\1\73\1\70\1\72\14\70\1\76\1\70\1\0"+
+    "\3\70\4\162\1\70\1\0\2\70\4\0\2\70\2\162"+
+    "\16\0\1\70\1\0\4\70\1\162\2\70\1\162\1\70"+
+    "\3\162\5\70\1\162\4\70\1\162\1\70\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\6\6\1\163\1\6\1\164\17\6\31\0\1\26"+
+    "\2\0\1\16\40\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\15\6\1\165\12\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\7\6\1\114\7\6\1\166\10\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\16\6\1\167\11\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\2\6\1\170\25\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\14\6"+
+    "\1\171\13\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\16\6\1\172\11\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\20\6\1\173\7\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\7\6\1\174\20\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\1\175\15\0\1\5\1\0"+
+    "\30\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\15\6\1\176\12\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\1\6\1\177\26\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\20\6\1\200\1\201\6\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\12\6"+
+    "\1\202\1\6\1\203\13\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\22\6"+
+    "\1\107\5\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\13\6\1\204\14\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\17\6\1\205\10\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\13\6\1\206\14\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\7\6"+
+    "\1\207\20\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\1\6\1\210\26\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\4\6\1\211\5\6\1\212\15\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\1\213\6\0\1\214\6\0\1\5\1\0\1\6\1\215"+
+    "\4\6\1\216\21\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\17\6\1\124"+
+    "\10\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\1\6\1\217\1\6\1\220"+
+    "\24\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\15\6\1\221\12\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\3\6\1\222\24\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\14\6\1\223\13\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\1\6\1\224"+
+    "\1\6\1\225\23\6\1\226\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\6\6"+
+    "\1\227\21\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\12\6\1\230\15\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\14\6\1\231\13\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\7\6\1\232\20\6\45\0\1\233\74\0\1\234"+
+    "\77\0\1\235\75\0\1\236\64\0\1\237\74\0\1\240"+
+    "\77\0\1\241\75\0\1\242\20\0\3\5\4\243\1\5"+
+    "\1\0\2\5\4\0\2\5\2\243\16\0\1\5\1\0"+
+    "\4\5\1\243\2\5\1\243\1\5\3\243\5\5\1\243"+
+    "\4\5\1\243\1\5\1\0\3\70\2\157\1\70\1\157"+
+    "\1\70\1\0\2\70\4\0\2\70\1\72\1\70\16\0"+
+    "\1\70\1\0\4\70\1\72\4\70\1\72\14\70\1\157"+
+    "\1\70\4\0\2\157\1\0\1\157\62\0\1\157\2\0"+
+    "\3\70\4\162\1\70\1\0\2\70\4\0\1\70\1\161"+
+    "\2\162\16\0\1\70\1\0\4\70\1\162\1\70\1\161"+
+    "\1\162\1\70\3\162\5\70\1\162\4\70\1\162\1\70"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\7\6\1\244\20\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\5\6\1\245\22\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\11\6"+
+    "\1\246\16\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\14\6\1\247\13\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\21\6\1\250\6\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\7\6\1\251\20\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\12\6"+
+    "\1\252\3\6\1\253\6\6\1\254\2\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\15\6\1\255\12\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\21\6"+
+    "\1\256\6\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\1\6\1\114\26\6"+
+    "\46\0\1\257\26\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\14\6\1\260\13\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\7\0\1\214\6\0\1\5\1\0\30\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\21\6\1\261\6\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\7\6"+
+    "\1\262\20\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\13\6\1\263\14\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\2\6\1\114\25\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\3\6\1\220\24\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\14\6"+
+    "\1\264\13\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\6\6\1\265\21\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\15\6\1\114\12\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\1\266\27\6\1\0\1\5\6\6\1\207\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\1\6"+
+    "\1\267\1\270\1\271\1\6\1\272\4\6\1\273\3\6"+
+    "\1\274\1\6\1\275\4\6\1\276\2\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\6\6\1\277\21\6\47\0\1\300\3\0\1\301"+
+    "\3\0\1\302\15\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\5\6\1\303\22\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\5\6\1\304\22\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\12\6\1\305\15\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\7\6"+
+    "\1\114\20\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\11\6\1\114\16\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\7\6\1\223\20\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\17\6\1\174\10\6\1\0\1\5\6\6\1\306"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\30\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\1\6\1\307\26\6\1\0"+
+    "\1\5\6\6\1\310\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\30\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\1\6"+
+    "\1\311\26\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\17\6\1\312\10\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\12\6\1\313\15\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\13\6\1\313\14\6\46\0\1\314\66\0\1\315"+
+    "\105\0\1\234\45\0\1\316\114\0\1\317\66\0\1\320"+
+    "\105\0\1\240\45\0\1\321\47\0\3\5\4\322\1\5"+
+    "\1\0\2\5\4\0\2\5\2\322\16\0\1\5\1\0"+
+    "\4\5\1\322\2\5\1\322\1\5\3\322\5\5\1\322"+
+    "\4\5\1\322\1\5\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\3\6\1\323"+
+    "\24\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\15\6\1\324\12\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\6\6\1\325\21\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\10\6\1\114\17\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\14\6\1\326"+
+    "\13\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\12\6\1\123\15\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\6\6\1\327\21\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\7\0\1\214\6\0"+
+    "\1\5\1\0\15\6\1\114\7\6\2\114\1\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\5\6\1\330\22\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\13\6\1\331\14\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\14\6\1\332"+
+    "\13\6\57\0\1\333\15\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\17\6\1\334"+
+    "\10\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\11\6\1\335\16\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\6\6\1\323\21\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\6\6\1\336\21\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\17\6\1\114"+
+    "\10\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\1\337\15\0\1\5\1\0\30\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\1\340\15\0"+
+    "\1\5\1\0\30\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\22\6\1\341"+
+    "\5\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\13\6\1\342\14\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\1\6\1\343\5\6\1\344\20\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\15\6\1\345\12\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\6\6\1\346\5\6\1\347\13\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\7\6\1\350\20\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\7\6\1\351"+
+    "\3\6\1\352\14\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\13\6\1\264"+
+    "\14\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\13\6\1\353\14\6\66\0"+
+    "\1\354\74\0\1\355\56\0\1\356\22\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\20\6\1\357\7\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\3\6\1\174"+
+    "\24\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\1\114\27\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\17\6\1\360\10\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\13\6"+
+    "\1\361\14\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\5\6\1\362\22\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\5\6\1\363\22\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\14\6\1\34\13\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\24\6"+
+    "\1\114\3\6\41\0\1\315\5\0\1\234\62\0\1\364"+
+    "\37\0\1\316\1\365\5\316\1\0\1\365\4\0\1\365"+
+    "\4\316\4\365\1\0\1\365\1\0\1\365\1\0\1\365"+
+    "\1\316\5\365\30\316\41\0\1\320\5\0\1\240\62\0"+
+    "\1\366\37\0\1\321\1\367\5\321\1\0\1\367\4\0"+
+    "\1\367\4\321\4\367\1\0\1\367\1\0\1\367\1\0"+
+    "\1\367\1\321\5\367\30\321\1\0\3\5\4\370\1\5"+
+    "\1\0\2\5\4\0\2\5\2\370\16\0\1\5\1\0"+
+    "\4\5\1\370\2\5\1\370\1\5\3\370\5\5\1\370"+
+    "\4\5\1\370\1\5\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\3\6\1\114"+
+    "\24\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\11\6\1\371\16\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\7\6\1\372\20\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\11\6\1\373\16\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\13\6\1\374"+
+    "\14\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\11\6\1\220\16\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\6\6\1\114\21\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\6\6\1\375\21\6\56\0\1\376\16\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\7\6\1\377\20\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\13\6\1\114"+
+    "\14\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\6\6\1\373\21\6\54\0"+
+    "\1\u0100\63\0\1\u0101\1\0\1\u0102\1\u0103\1\0\1\u0104"+
+    "\4\0\1\u0105\1\u0106\1\u0107\14\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\2\6"+
+    "\1\220\25\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\12\6\1\u0108\4\6"+
+    "\1\u0109\10\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\17\6\1\u010a\10\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\1\6\1\u010b\26\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\7\6\1\u010c\20\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\13\6"+
+    "\1\244\14\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\15\6\1\u010d\12\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\15\6\1\u010e\12\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\1\6\1\u010f\26\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\12\6"+
+    "\1\u0110\15\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\5\6\1\u0111\11\6"+
+    "\1\220\10\6\64\0\1\u0112\54\0\1\u0113\100\0\1\u0114"+
+    "\22\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\7\6\1\323\20\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\15\6\1\u0115\12\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\17\6"+
+    "\1\u0116\10\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\17\6\1\220\10\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\2\6\1\u0117\25\6\36\0\1\316"+
+    "\73\0\1\321\36\0\3\5\4\6\1\5\1\0\2\5"+
+    "\4\0\2\5\2\6\16\0\1\5\1\0\4\5\1\6"+
+    "\2\5\1\6\1\5\3\6\5\5\1\6\4\5\1\6"+
+    "\1\5\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\1\u0118\15\0\1\5\1\0\30\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\17\6\1\u0119\10\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\22\6"+
+    "\1\114\5\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\5\6\1\u0111\22\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\1\u011a\15\0\1\5\1\0\30\6\70\0\1\u011b\4\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\1\u011c"+
+    "\15\0\1\5\1\0\30\6\44\0\1\u011d\106\0\1\u011e"+
+    "\73\0\1\u011f\61\0\1\u0120\3\0\1\u0121\1\u0122\102\0"+
+    "\1\u0123\72\0\1\u0124\71\0\1\u0125\25\0\1\u0126\35\0"+
+    "\1\u0127\26\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\24\6\1\u0128\3\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\13\6\1\u0129\14\6\1\0\1\5\6\6"+
+    "\1\u012a\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\30\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\4\6\1\114\23\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\1\u012b\15\0\1\5\1\0\30\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\3\6\1\u012c\24\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\7\6\1\u012d"+
+    "\20\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\1\u012e\27\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\17\6\1\u012f\10\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\20\6"+
+    "\1\114\7\6\65\0\1\u0130\61\0\1\u0131\44\0\1\u0132"+
+    "\50\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\1\u0133\15\0\1\5\1\0\30\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\1\6\1\u0134\26\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\6\6\1\u0135"+
+    "\21\6\46\0\1\u0136\26\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\1\u0137\15\0\1\5\1\0\30\6"+
+    "\64\0\1\u0138\66\0\1\u0139\67\0\1\u013a\73\0\1\u013b"+
+    "\67\0\1\u013c\102\0\1\u013d\74\0\1\u013e\100\0\1\u013f"+
+    "\67\0\1\u0140\61\0\1\u0141\106\0\1\u0142\2\0\1\u0143"+
+    "\65\0\1\u0144\62\0\1\u0145\101\0\1\u0146\21\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\13\6\1\u0147\14\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\20\6"+
+    "\1\u0148\7\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\12\6\1\174\15\6"+
+    "\47\0\1\u0149\6\0\1\u014a\5\0\1\u014b\10\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\1\6\1\u014c\26\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\17\6"+
+    "\1\u014d\10\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\14\6\1\221\13\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\14\6\1\114\13\6\60\0\1\u014e"+
+    "\76\0\1\u014f\57\0\1\300\74\0\1\u0150\24\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\1\u0151\15\0"+
+    "\1\5\1\0\30\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\7\6\1\u0152"+
+    "\20\6\63\0\1\u0153\66\0\1\u0154\6\0\1\u0155\65\0"+
+    "\1\u0156\76\0\1\u0157\74\0\1\u0158\71\0\1\214\56\0"+
+    "\1\u0159\117\0\1\u015a\64\0\1\u015b\60\0\1\u015c\72\0"+
+    "\1\u015d\36\0\1\u015e\140\0\1\u015f\64\0\1\u0160\100\0"+
+    "\1\u0161\66\0\1\u0162\106\0\1\u0163\13\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\16\6\1\220\11\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\7\6\1\u0164"+
+    "\20\6\53\0\1\u0165\12\0\1\u0166\65\0\1\u0167\66\0"+
+    "\1\u0168\4\0\1\u0169\14\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\13\6\1\u016a"+
+    "\14\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\5\6\1\u016b\22\6\52\0"+
+    "\1\u015d\102\0\1\u016c\75\0\1\u016d\66\0\1\u0154\2\0"+
+    "\1\u016e\3\0\1\u0155\7\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\1\u016f\15\0\1\5\1\0\30\6"+
+    "\60\0\1\u0170\72\0\1\u0171\65\0\1\u0172\100\0\1\u0173"+
+    "\70\0\1\214\103\0\1\u0174\34\0\1\u0175\126\0\1\u0176"+
+    "\71\0\1\u0177\70\0\1\u0178\70\0\1\214\71\0\1\u0179"+
+    "\77\0\1\u017a\73\0\1\u017b\71\0\1\u017c\34\0\1\u017d"+
+    "\107\0\1\u017e\50\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\1\6\1\u017f\26\6"+
+    "\45\0\1\u0180\112\0\1\u0181\70\0\1\u0182\2\0\1\u0183"+
+    "\54\0\1\u0184\103\0\1\u0185\17\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\15\6"+
+    "\1\174\12\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\12\6\1\114\15\6"+
+    "\57\0\1\356\74\0\1\u0186\72\0\1\u0187\105\0\1\u0188"+
+    "\47\0\1\u0189\75\0\1\u0157\105\0\1\u018a\75\0\1\u018b"+
+    "\70\0\1\u018c\60\0\1\u018d\110\0\1\u018e\70\0\1\u018f"+
+    "\67\0\1\u0190\44\0\1\u0191\114\0\1\u0192\100\0\1\u0193"+
+    "\70\0\1\u0174\71\0\1\u0194\75\0\1\u0195\1\u0196\24\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\7\6\1\264\20\6\50\0\1\u0197\110\0"+
+    "\1\u0198\63\0\1\u0199\64\0\1\u019a\71\0\1\u019b\100\0"+
+    "\1\u019c\106\0\1\214\73\0\1\u0157\66\0\1\u019d\67\0"+
+    "\1\u019e\75\0\1\214\76\0\1\u019f\76\0\1\u015d\67\0"+
+    "\1\u01a0\67\0\1\u01a1\103\0\1\u01a2\34\0\1\u01a3\117\0"+
+    "\1\u01a4\74\0\1\u01a5\101\0\1\u01a6\40\0\1\u01a7\114\0"+
+    "\1\u01a8\77\0\1\u01a9\46\0\1\u01aa\127\0\1\u01ab\64\0"+
+    "\1\u01ac\73\0\1\u01ad\102\0\1\u01ae\63\0\1\u01af\75\0"+
+    "\1\u01b0\77\0\1\u01b1\67\0\1\u01b2\106\0\1\u01b3\32\0"+
+    "\1\u01b4\124\0\1\u01b5\101\0\1\u01b6\73\0\1\u01b7\70\0"+
+    "\1\u01b8\60\0\1\u01b9\73\0\1\u01ba\111\0\1\u01bb\62\0"+
+    "\1\u0157\74\0\1\u01bc\72\0\1\u01bd\66\0\1\u01be\100\0"+
+    "\1\u01bf\76\0\1\u01c0\104\0\1\u01bd\15\0\1\u01c1\130\0"+
+    "\1\214\101\0\1\u01b1\72\0\1\u018e\72\0\1\u01c2\46\0"+
+    "\1\u01c3\122\0\1\u01c4\100\0\1\u01c5\74\0\1\u01c6\63\0"+
+    "\1\u01c7\102\0\1\u01c8\66\0\1\u01c9\107\0\1\u01ca\30\0"+
+    "\1\u01cb\120\0\1\u01cc\75\0\1\u01cd\44\0\1\u01ce\122\0"+
+    "\1\u01cf\65\0\1\u01d0\77\0\1\u01d1\71\0\1\u01d2\110\0"+
+    "\1\u01c8\33\0\1\u01d3\127\0\1\u01d4\37\0\1\u01d5\126\0"+
+    "\1\u0186\62\0\1\u01d6\111\0\1\u01d7\67\0\1\u013b\76\0"+
+    "\1\u01bd\66\0\1\u01d8\41\0\1\u01d9\122\0\1\u01da\100\0"+
+    "\1\u01db\60\0\1\u01dc\111\0\1\u01dd\71\0\1\u01de\61\0"+
+    "\1\u01df\103\0\1\u01e0\73\0\1\u01e1\74\0\1\u01e2\100\0"+
+    "\1\u0155\71\0\1\u01e3\34\0\1\u01e4\126\0\1\u01e5\67\0"+
+    "\1\u01e6\44\0\1\u01e7\114\0\1\u01e8\107\0\1\u01e9\70\0"+
+    "\1\u01ea\101\0\1\u01eb\66\0\1\u01ec\63\0\1\u01ed\107\0"+
+    "\1\u01b1\57\0\1\u01ee\34\0\1\u01ef\146\0\1\u01f0\65\0"+
+    "\1\u01f1\101\0\1\u01f2\75\0\1\u01f3\53\0\1\u01f4\114\0"+
+    "\1\u01f5\52\0\1\u01f6\107\0\1\u01f7\63\0\1\u01f8\75\0"+
+    "\1\u01f9\100\0\1\214\64\0\1\u01fa\102\0\1\u01f9\74\0"+
+    "\1\u01fb\71\0\1\u01fc\65\0\1\u01b1\103\0\1\u01fd\75\0"+
+    "\1\214\71\0\1\u01fe\57\0\1\u01ff\111\0\1\u0140\72\0"+
+    "\1\214\70\0\1\u01ac\73\0\1\u0200\103\0\1\214\5\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[29520];
+    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 =
+    "\4\0\5\1\1\11\1\1\1\11\2\1\1\11\2\1"+
+    "\1\11\3\1\1\11\20\1\1\11\2\1\2\11\1\1"+
+    "\1\11\5\1\1\11\15\1\1\11\1\0\41\1\2\11"+
+    "\10\0\2\1\1\0\14\1\1\0\15\1\1\0\1\11"+
+    "\16\1\10\0\14\1\1\0\20\1\3\0\11\1\2\0"+
+    "\1\1\2\0\12\1\1\0\3\1\2\0\13\1\3\0"+
+    "\5\1\4\0\6\1\1\0\1\1\10\0\12\1\3\0"+
+    "\3\1\1\0\1\1\16\0\3\1\1\0\4\1\4\0"+
+    "\2\1\21\0\2\1\3\0\2\1\4\0\1\1\21\0"+
+    "\1\1\5\0\2\1\23\0\1\1\201\0";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[512];
+    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[] = new char[ZZ_BUFFERSIZE];
+
+  /** 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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public LispTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+		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 LispTokenMaker(java.io.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 LispTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 160) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 24: break;
+        case 21: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 25: break;
+        case 19: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 26: break;
+        case 5: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 27: break;
+        case 18: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 28: break;
+        case 17: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 29: break;
+        case 20: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 30: break;
+        case 8: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 31: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 32: break;
+        case 15: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 33: break;
+        case 11: 
+          { /* Skip escaped chars. */
+          }
+        case 34: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 35: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 36: break;
+        case 23: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 37: break;
+        case 22: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 38: break;
+        case 16: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 39: break;
+        case 9: 
+          { start = zzMarkedPos-1; yybegin(STRING);
+          }
+        case 40: break;
+        case 7: 
+          { start = zzMarkedPos-1; yybegin(EOL_COMMENT);
+          }
+        case 41: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 42: break;
+        case 6: 
+          { addToken(Token.OPERATOR);
+          }
+        case 43: break;
+        case 13: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 44: break;
+        case 10: 
+          { 
+          }
+        case 45: break;
+        case 14: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 46: 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 513: break;
+            case STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 514: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 515: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 516: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.flex
new file mode 100644
index 0000000..2a15509
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.flex
@@ -0,0 +1,372 @@
+/*
+ * 07/14/2006
+ *
+ * LuaTokenMaker.java - Scanner for the Lua programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Lua programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>LuaTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+%%
+
+%public
+%class LuaTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public LuaTokenMaker() {
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = LONGSTRING;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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_]
+Digit					= [0-9]
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+UnclosedCharLiteral			= ([\']([^\'\n]|"\\'")*)
+CharLiteral				= ({UnclosedCharLiteral}"'")
+UnclosedStringLiteral		= ([\"]([^\"\n]|"\\\"")*)
+StringLiteral				= ({UnclosedStringLiteral}[\"])
+LongStringBegin			= ("[[")
+LongStringEnd				= ("]]")
+
+LineCommentBegin			= ("--")
+MLCBegin					= ({LineCommentBegin}{LongStringBegin})
+
+Number					= ( "."? {Digit} ({Digit}|".")* ([eE][+-]?)? ({Letter}|{Digit})* )
+BooleanLiteral				= ("true"|"false")
+
+Separator					= ([\(\)\{\}\[\]\]])
+Separator2				= ([\;:,.])
+
+ArithmeticOperator			= ("+"|"-"|"*"|"/"|"^"|"%")
+RelationalOperator			= ("<"|">"|"<="|">="|"=="|"~=")
+LogicalOperator			= ("and"|"or"|"not"|"#")
+ConcatenationOperator		= ("..")
+Elipsis					= ({ConcatenationOperator}".")
+Operator					= ({ArithmeticOperator}|{RelationalOperator}|{LogicalOperator}|{ConcatenationOperator}|{Elipsis})
+
+Identifier				= ({Letter}({Letter}|{Digit})*)
+
+
+%state MLC
+%state LONGSTRING
+%state LINECOMMENT
+
+
+%%
+
+/* Keywords */
+<YYINITIAL> "break"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "do"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "else"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "elseif"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "end"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "for"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "function"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "if"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "local"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "nil"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "repeat"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "return"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "then"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "until"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "while"					{ addToken(Token.RESERVED_WORD); }
+
+/* Data types. */
+<YYINITIAL> "<number>"				{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "<name>"				{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "<string>"				{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "<eof>"					{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "NULL"					{ addToken(Token.DATA_TYPE); }
+
+/* Functions. */
+<YYINITIAL> "_G"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "_VERSION"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "assert"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "collectgarbage"			{ addToken(Token.FUNCTION); }
+<YYINITIAL> "dofile"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "error"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "getfenv"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "getmetatable"			{ addToken(Token.FUNCTION); }
+<YYINITIAL> "ipairs"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "load"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "loadfile"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "loadstring"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "module"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "next"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "pairs"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "pcall"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "print"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "rawequal"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "rawget"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "rawset"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "require"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "select"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "setfenv"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "setmetatable"			{ addToken(Token.FUNCTION); }
+<YYINITIAL> "tonumber"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "tostring"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "type"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "unpack"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "xpcall"				{ addToken(Token.FUNCTION); }
+
+/* Booleans. */
+<YYINITIAL> {BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+
+<YYINITIAL> {
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{LongStringBegin}				{ start = zzMarkedPos-2; yybegin(LONGSTRING); }
+
+	/* Comment literals. */
+	{MLCBegin}					{ start = zzMarkedPos-4; yybegin(MLC); }
+	{LineCommentBegin}				{ start = zzMarkedPos-2; yybegin(LINECOMMENT); }
+
+	/* Separators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Identifiers - Comes after Operators for "and", "not" and "or". */
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	/* Numbers */
+	{Number}						{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+
+<MLC> {
+	[^\n\]]+					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{LongStringEnd}			{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\]						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+}
+
+
+<LONGSTRING> {
+	[^\n\]]+					{}
+	\n						{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	{LongStringEnd}			{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	\]						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+
+<LINECOMMENT> {
+	[^\n]+					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.java
new file mode 100644
index 0000000..580dfc9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.java
@@ -0,0 +1,967 @@
+/* The following code was generated by JFlex 1.4.1 on 10/16/06 10:31 AM */
+
+/*
+ * 07/14/2006
+ *
+ * LuaTokenMaker.java - Scanner for the Lua programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Lua programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>LuaTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+
+public class LuaTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int YYINITIAL = 0;
+  public static final int LONGSTRING = 2;
+  public static final int LINECOMMENT = 3;
+  public static final int MLC = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\4\1\3\1\0\1\4\23\0\1\4\1\0\1\7\1\27"+
+    "\1\0\1\27\1\0\1\5\2\26\1\27\1\15\1\0\1\12\1\13"+
+    "\1\27\12\2\2\0\1\30\1\32\1\31\2\0\4\1\1\14\1\1"+
+    "\1\54\1\1\1\60\2\1\1\52\1\1\1\50\1\61\2\1\1\56"+
+    "\1\57\1\1\1\51\1\55\4\1\1\10\1\6\1\11\1\27\1\53"+
+    "\1\0\1\23\1\37\1\42\1\35\1\21\1\22\1\47\1\44\1\41"+
+    "\1\1\1\40\1\24\1\46\1\34\1\36\1\43\1\64\1\17\1\25"+
+    "\1\16\1\20\1\62\1\45\1\63\1\65\1\1\1\26\1\0\1\26"+
+    "\1\33\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 =
+    "\4\0\2\1\1\2\1\3\1\4\1\5\1\6\2\7"+
+    "\1\10\1\1\1\10\10\1\2\10\16\1\1\11\1\12"+
+    "\1\11\1\13\2\11\1\14\2\2\1\15\1\5\1\6"+
+    "\1\16\1\17\1\20\1\10\21\1\3\0\3\1\1\21"+
+    "\1\10\1\1\1\21\11\1\1\22\2\1\1\23\1\24"+
+    "\1\15\1\16\1\0\24\1\4\0\13\1\1\25\1\26"+
+    "\11\1\1\21\2\1\1\22\3\1\4\0\6\1\1\27"+
+    "\13\1\1\27\2\0\10\1\2\0\15\1";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[201];
+    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\66\0\154\0\242\0\330\0\u010e\0\u0144\0\330"+
+    "\0\u017a\0\u01b0\0\u01e6\0\u021c\0\330\0\u0252\0\u0288\0\330"+
+    "\0\u02be\0\u02f4\0\u032a\0\u0360\0\u0396\0\u03cc\0\u0402\0\u0438"+
+    "\0\u046e\0\u04a4\0\u04a4\0\u04da\0\u0510\0\u0546\0\u057c\0\u05b2"+
+    "\0\u05e8\0\u061e\0\u0654\0\u068a\0\u06c0\0\u06f6\0\u072c\0\u0762"+
+    "\0\u0798\0\330\0\u07ce\0\330\0\u0804\0\u083a\0\330\0\u0870"+
+    "\0\u08a6\0\330\0\u08dc\0\u0912\0\330\0\330\0\u0948\0\u097e"+
+    "\0\u09b4\0\u09ea\0\u0a20\0\u0a56\0\u0a8c\0\u0ac2\0\u0af8\0\u0b2e"+
+    "\0\u0b64\0\u0b9a\0\u0bd0\0\u0c06\0\u0c3c\0\u0c72\0\u0ca8\0\u0cde"+
+    "\0\u0d14\0\u0d4a\0\u0d80\0\u0db6\0\u0dec\0\u0e22\0\u0e58\0\u0e8e"+
+    "\0\u010e\0\u0ec4\0\u010e\0\u0efa\0\u0f30\0\u0f66\0\u0f9c\0\u0fd2"+
+    "\0\u1008\0\u103e\0\u1074\0\u10aa\0\u010e\0\u10e0\0\u1116\0\330"+
+    "\0\330\0\u01b0\0\u01e6\0\u114c\0\u1182\0\u11b8\0\u11ee\0\u1224"+
+    "\0\u125a\0\u1290\0\u12c6\0\u12fc\0\u1332\0\u1368\0\u139e\0\u13d4"+
+    "\0\u140a\0\u1440\0\u1476\0\u14ac\0\u14e2\0\u1518\0\u154e\0\u1584"+
+    "\0\u15ba\0\u15f0\0\u1626\0\u165c\0\u1692\0\u16c8\0\u16fe\0\u1734"+
+    "\0\u176a\0\u17a0\0\u17d6\0\u180c\0\u1842\0\u1878\0\u18ae\0\330"+
+    "\0\u010e\0\u18e4\0\u191a\0\u1950\0\u1986\0\u19bc\0\u19f2\0\u1a28"+
+    "\0\u1a5e\0\u1a94\0\u1aca\0\u1b00\0\u1b36\0\u1b6c\0\u1ba2\0\u1bd8"+
+    "\0\u1c0e\0\u1c44\0\u1c7a\0\u1cb0\0\u1ce6\0\u1d1c\0\u1d52\0\u1d88"+
+    "\0\u1dbe\0\u1df4\0\u1e2a\0\u010e\0\u1e60\0\u1e96\0\u1ecc\0\u1f02"+
+    "\0\u1f38\0\u1f6e\0\u1fa4\0\u1fda\0\u2010\0\u2046\0\u207c\0\330"+
+    "\0\u20b2\0\u20e8\0\u211e\0\u2154\0\u218a\0\u21c0\0\u21f6\0\u222c"+
+    "\0\u2262\0\u2298\0\u22ce\0\u2304\0\u233a\0\u2370\0\u23a6\0\u23dc"+
+    "\0\u2412\0\u2448\0\u247e\0\u24b4\0\u24ea\0\u2520\0\u2556\0\u258c"+
+    "\0\u25c2";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[201];
+    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\5\1\6\1\7\1\10\1\11\1\12\1\5\1\13"+
+    "\1\14\1\15\1\16\1\17\1\6\1\20\1\21\1\22"+
+    "\1\23\1\24\1\25\1\26\1\27\1\30\1\15\1\20"+
+    "\1\31\1\32\2\33\1\34\1\35\1\36\1\37\1\6"+
+    "\1\40\1\41\1\42\1\6\1\43\1\44\1\45\1\46"+
+    "\2\6\1\47\7\6\1\50\2\6\3\51\1\52\5\51"+
+    "\1\53\57\51\1\54\5\51\1\55\54\51\3\56\1\57"+
+    "\62\56\67\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\32\6\1\0\1\60\1\7\10\0\1\7\1\61\1\0"+
+    "\3\60\1\61\4\60\6\0\32\60\4\0\1\11\61\0"+
+    "\3\12\1\0\1\12\1\62\1\63\57\12\3\13\1\0"+
+    "\2\13\1\64\1\65\56\13\10\0\1\66\67\0\1\67"+
+    "\55\0\1\7\10\0\1\70\53\0\2\6\11\0\1\6"+
+    "\1\0\1\6\1\71\6\6\6\0\2\6\1\72\5\6"+
+    "\1\73\20\6\1\74\1\0\2\6\11\0\1\6\1\0"+
+    "\3\6\1\75\1\6\1\76\2\6\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\10\6\6\0\1\77\31\6"+
+    "\1\0\2\6\11\0\1\6\1\0\1\6\1\100\4\6"+
+    "\1\101\1\6\6\0\1\102\31\6\1\0\2\6\11\0"+
+    "\1\6\1\0\2\6\1\103\2\6\1\104\2\6\6\0"+
+    "\2\6\1\105\27\6\1\0\2\6\11\0\1\6\1\0"+
+    "\7\6\1\106\6\0\1\107\31\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\2\6\1\110\27\6\1\0"+
+    "\2\6\11\0\1\6\1\0\3\6\1\111\4\6\6\0"+
+    "\32\6\21\0\1\112\3\0\1\113\4\0\1\20\1\0"+
+    "\1\114\63\0\1\20\34\0\2\6\11\0\1\6\1\0"+
+    "\3\6\1\115\4\6\6\0\2\6\1\116\2\6\1\117"+
+    "\24\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\2\6\1\120\27\6\1\0\2\6\11\0\1\6\1\0"+
+    "\1\6\1\121\6\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\1\6\1\122\6\6\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\4\6\1\123\3\6\6\0"+
+    "\7\6\1\124\22\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\2\6\1\125\27\6\1\0\2\6\11\0"+
+    "\1\6\1\0\1\6\1\126\3\6\1\127\2\6\6\0"+
+    "\6\6\1\130\23\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\10\6\1\131\21\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\2\6\1\132\27\6\1\0"+
+    "\2\6\11\0\1\6\1\0\3\6\1\133\4\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\15\6\1\134\14\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\20\6\1\135\1\136\10\6\1\0\2\6"+
+    "\11\0\1\6\1\0\10\6\6\0\7\6\1\137\22\6"+
+    "\3\51\1\0\5\51\1\0\54\51\11\0\1\140\65\0"+
+    "\1\141\54\0\3\56\1\0\62\56\1\0\2\60\11\0"+
+    "\1\60\1\0\10\60\6\0\32\60\1\0\2\60\7\0"+
+    "\1\60\1\0\12\60\6\0\32\60\3\12\1\0\1\12"+
+    "\1\142\1\63\57\12\3\13\1\0\2\13\1\64\1\143"+
+    "\56\13\10\0\1\144\70\0\1\20\53\0\2\6\11\0"+
+    "\1\6\1\0\2\6\1\145\5\6\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\7\6\1\146\6\0\1\147"+
+    "\31\6\1\0\2\6\11\0\1\6\1\0\3\6\1\150"+
+    "\4\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\7\6\1\151\22\6\1\0\2\6\11\0"+
+    "\1\6\1\0\1\152\7\6\6\0\7\6\1\153\20\6"+
+    "\1\154\1\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\11\6\1\155\20\6\1\0\2\6\11\0\1\6"+
+    "\1\0\1\156\7\6\6\0\7\6\1\157\22\6\1\0"+
+    "\2\6\11\0\1\6\1\0\1\6\1\160\6\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\7\6\1\161"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\1\6\1\123\30\6\1\0\2\6\11\0\1\6"+
+    "\1\0\10\6\6\0\1\162\31\6\1\0\2\6\11\0"+
+    "\1\6\1\0\6\6\1\163\1\6\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\1\6\1\123\6\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\7\6\1\164"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\1\6\1\121\30\6\1\0\2\6\11\0\1\6"+
+    "\1\0\5\6\1\165\2\6\6\0\6\6\1\166\23\6"+
+    "\1\0\2\6\11\0\1\6\1\0\1\167\5\6\1\170"+
+    "\1\6\6\0\32\6\36\0\1\171\45\0\1\172\67\0"+
+    "\1\173\2\0\1\174\43\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\27\6\1\175\2\6\1\0\2\6\11\0"+
+    "\1\6\1\0\1\121\7\6\6\0\32\6\1\0\2\6"+
+    "\11\0\1\6\1\0\6\6\1\123\1\6\6\0\32\6"+
+    "\1\0\2\6\11\0\1\6\1\0\4\6\1\176\3\6"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\3\6"+
+    "\1\177\4\6\6\0\32\6\1\0\2\6\11\0\1\6"+
+    "\1\0\5\6\1\127\2\6\6\0\32\6\1\0\2\6"+
+    "\11\0\1\6\1\0\6\6\1\200\1\6\6\0\32\6"+
+    "\1\0\2\6\11\0\1\6\1\0\10\6\6\0\5\6"+
+    "\1\201\24\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\5\6\1\202\24\6\1\0\2\6\11\0\1\6"+
+    "\1\0\5\6\1\203\2\6\6\0\32\6\1\0\2\6"+
+    "\11\0\1\6\1\0\10\6\6\0\5\6\1\204\24\6"+
+    "\1\0\2\6\11\0\1\6\1\0\10\6\6\0\1\6"+
+    "\1\205\30\6\1\0\2\6\11\0\1\6\1\0\1\167"+
+    "\7\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\16\6\1\206\13\6\1\0\2\6\11\0"+
+    "\1\207\1\0\10\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\6\6\1\130\23\6\10\0"+
+    "\1\210\56\0\2\6\11\0\1\6\1\0\3\6\1\211"+
+    "\4\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+    "\1\212\7\6\6\0\32\6\1\0\2\6\11\0\1\6"+
+    "\1\0\2\6\1\213\5\6\6\0\32\6\1\0\2\6"+
+    "\11\0\1\6\1\0\10\6\6\0\1\123\31\6\1\0"+
+    "\2\6\11\0\1\6\1\0\3\6\1\135\4\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\2\6\1\214"+
+    "\5\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+    "\3\6\1\215\4\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\2\6\1\216\5\6\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\3\6\1\217\3\6\1\220"+
+    "\6\0\13\6\1\220\16\6\1\0\2\6\11\0\1\6"+
+    "\1\0\10\6\6\0\5\6\1\117\24\6\1\0\2\6"+
+    "\11\0\1\6\1\0\5\6\1\221\2\6\6\0\32\6"+
+    "\1\0\2\6\11\0\1\6\1\0\10\6\6\0\2\6"+
+    "\1\222\27\6\1\0\2\6\11\0\1\6\1\0\3\6"+
+    "\1\223\4\6\6\0\32\6\1\0\2\6\11\0\1\6"+
+    "\1\0\10\6\6\0\6\6\1\224\23\6\1\0\2\6"+
+    "\11\0\1\6\1\0\7\6\1\145\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\3\6\1\225\4\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\1\6\1\226\30\6\1\0\2\6\11\0\1\6\1\0"+
+    "\5\6\1\117\2\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\4\6\1\227\3\6\6\0\12\6\1\230"+
+    "\17\6\1\0\2\6\11\0\1\6\1\0\3\6\1\231"+
+    "\4\6\6\0\32\6\22\0\1\232\62\0\1\233\114\0"+
+    "\1\234\65\0\1\235\20\0\2\6\11\0\1\6\1\0"+
+    "\1\135\7\6\6\0\32\6\1\0\2\6\11\0\1\6"+
+    "\1\0\10\6\6\0\5\6\1\236\24\6\1\0\2\6"+
+    "\11\0\1\6\1\0\5\6\1\237\2\6\6\0\32\6"+
+    "\1\0\2\6\11\0\1\6\1\0\6\6\1\240\1\6"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\1\175\31\6\1\0\2\6\11\0\1\6\1\0"+
+    "\1\6\1\241\6\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\6\6\1\242\1\6\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\6\6\1\243\1\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\2\6\1\236"+
+    "\5\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\16\6\1\244\13\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\22\6\1\245\7\6\1\0"+
+    "\2\6\11\0\1\6\1\0\1\6\1\246\6\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\12\6\1\247\17\6\1\0\2\6\11\0\1\6\1\0"+
+    "\1\6\1\150\6\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\5\6\1\250\2\6\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\10\6\6\0\5\6\1\251"+
+    "\24\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\30\6\1\252\1\6\1\0\2\6\11\0\1\6\1\0"+
+    "\3\6\1\175\4\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\6\6\1\253\23\6\1\0"+
+    "\2\6\11\0\1\6\1\0\1\6\1\135\6\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\5\6\1\254\24\6\1\0\2\6\11\0\1\6\1\0"+
+    "\1\255\7\6\6\0\32\6\1\0\2\6\11\0\1\6"+
+    "\1\0\1\6\1\175\6\6\6\0\32\6\1\0\2\6"+
+    "\11\0\1\6\1\0\4\6\1\176\2\6\1\146\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\3\6\1\256"+
+    "\4\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+    "\3\6\1\257\4\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\6\6\1\175\23\6\31\0"+
+    "\1\260\75\0\1\261\63\0\1\262\47\0\1\232\45\0"+
+    "\2\6\11\0\1\6\1\0\6\6\1\151\1\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\4\6\1\123\25\6\1\0\2\6\11\0\1\6\1\0"+
+    "\3\6\1\263\4\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\7\6\1\135\6\0\32\6\1\0\2\6"+
+    "\11\0\1\6\1\0\6\6\1\135\1\6\6\0\32\6"+
+    "\1\0\2\6\11\0\1\6\1\0\3\6\1\123\4\6"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\23\6\1\264\6\6\1\0\2\6\11\0\1\6"+
+    "\1\0\10\6\6\0\5\6\1\265\24\6\1\0\2\6"+
+    "\11\0\1\6\1\0\10\6\6\0\3\6\1\266\26\6"+
+    "\1\0\2\6\11\0\1\6\1\0\1\123\7\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\1\6\1\151"+
+    "\6\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+    "\2\6\1\267\5\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\4\6\1\135\25\6\1\0"+
+    "\2\6\11\0\1\6\1\0\4\6\1\123\3\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\5\6\1\270\24\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\1\271\31\6\1\0\2\6\11\0\1\6"+
+    "\1\0\1\272\7\6\6\0\32\6\34\0\1\273\52\0"+
+    "\1\274\45\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\6\6\1\275\23\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\24\6\1\276\5\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\1\277\31\6\1\0\2\6"+
+    "\11\0\1\6\1\0\3\6\1\222\4\6\6\0\32\6"+
+    "\1\0\2\6\11\0\1\6\1\0\5\6\1\242\2\6"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\2\6\1\150\27\6\1\0\2\6\11\0\1\6"+
+    "\1\0\10\6\6\0\26\6\1\135\3\6\1\0\2\6"+
+    "\11\0\1\6\1\0\5\6\1\300\2\6\6\0\32\6"+
+    "\47\0\1\232\35\0\1\232\47\0\2\6\11\0\1\6"+
+    "\1\0\1\301\7\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\25\6\1\302\4\6\1\0"+
+    "\2\6\11\0\1\6\1\0\10\6\6\0\13\6\1\135"+
+    "\16\6\1\0\2\6\11\0\1\6\1\0\1\303\7\6"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\13\6\1\304\16\6\1\0\2\6\11\0\1\6"+
+    "\1\0\10\6\6\0\14\6\1\135\15\6\1\0\2\6"+
+    "\11\0\1\6\1\0\5\6\1\305\2\6\6\0\32\6"+
+    "\1\0\2\6\11\0\1\6\1\0\5\6\1\306\2\6"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\3\6\1\236\26\6\1\0\2\6\11\0\1\6"+
+    "\1\0\1\6\1\307\6\6\6\0\32\6\1\0\2\6"+
+    "\11\0\1\6\1\0\10\6\6\0\3\6\1\310\26\6"+
+    "\1\0\2\6\11\0\1\6\1\0\5\6\1\311\2\6"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\13\6\1\151\16\6";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[9720];
+    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 =
+    "\4\0\1\11\2\1\1\11\4\1\1\11\2\1\1\11"+
+    "\31\1\1\11\1\1\1\11\2\1\1\11\2\1\1\11"+
+    "\2\1\2\11\23\1\3\0\23\1\2\11\2\1\1\0"+
+    "\24\1\4\0\13\1\1\11\21\1\4\0\22\1\1\11"+
+    "\2\0\10\1\2\0\15\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[201];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public LuaTokenMaker() {
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = LONGSTRING;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+		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 LuaTokenMaker(java.io.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 LuaTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 164) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 24: break;
+        case 13: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 25: break;
+        case 15: 
+          { start = zzMarkedPos-2; yybegin(LONGSTRING);
+          }
+        case 26: break;
+        case 19: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 27: break;
+        case 4: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 28: break;
+        case 2: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 29: break;
+        case 17: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 30: break;
+        case 21: 
+          { start = zzMarkedPos-4; yybegin(MLC);
+          }
+        case 31: break;
+        case 7: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 32: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 33: break;
+        case 18: 
+          { addToken(Token.FUNCTION);
+          }
+        case 34: break;
+        case 5: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 35: break;
+        case 6: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 36: break;
+        case 23: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 37: break;
+        case 22: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 38: break;
+        case 20: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 39: break;
+        case 14: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 40: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 41: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); return firstToken;
+          }
+        case 42: break;
+        case 8: 
+          { addToken(Token.OPERATOR);
+          }
+        case 43: break;
+        case 16: 
+          { start = zzMarkedPos-2; yybegin(LINECOMMENT);
+          }
+        case 44: break;
+        case 9: 
+          { 
+          }
+        case 45: break;
+        case 10: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 46: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 202: break;
+            case LONGSTRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 203: break;
+            case LINECOMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); return firstToken;
+            }
+            case 204: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 205: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.flex
new file mode 100644
index 0000000..5f7ecd3
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.flex
@@ -0,0 +1,336 @@
+/*
+ * 09/20/2008
+ *
+ * MakefileTokenMaker.java - Scanner for makefiles.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import java.util.Stack;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for makefiles.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated MakefileTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class MakefileTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	private Stack varDepths;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public MakefileTokenMaker() {
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * 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;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(Token.NULL);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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]
+Digit					= [0-9]
+IdentifierStart			= ({Letter}|[_\.])
+IdentifierPart			= ({IdentifierStart}|{Digit})
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+Label					= ({Identifier}":")
+
+CurlyVarStart			= ("${")
+ParenVarStart			= ("$(")
+
+LineTerminator			= (\n)
+WhiteSpace				= ([ \t\f])
+
+UnclosedCharLiteral		= ([\']([^\'\n]|"\\'")*)
+CharLiteral				= ({UnclosedCharLiteral}"'")
+UnclosedStringLiteral	= ([\"]([^\"\n]|"\\\"")*)
+StringLiteral			= ({UnclosedStringLiteral}[\"])
+UnclosedBacktickLiteral	= ([\`]([^\`\n]|"\\`")*)
+BacktickLiteral			= ({UnclosedBacktickLiteral}"`")
+
+LineCommentBegin		= "#"
+
+IntegerLiteral			= ({Digit}+)
+
+Operator				= ([\:\+\?]?"=")
+
+
+%state VAR
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"addprefix" |
+	"addsuffix" |
+	"basename" |
+	"dir" |
+	"filter" |
+	"filter-out" |
+	"findstring" |
+	"firstword" |
+	"foreach" |
+	"join" |
+	"notdir" |
+	"origin" |
+	"pathsubst" |
+	"shell" |
+	"sort" |
+	"strip" |
+	"suffix" |
+	"wildcard" |
+	"word" |
+	"words" |
+	"ifeq" |
+	"ifneq" |
+	"else" |
+	"endif" |
+	"define" |
+	"endef" |
+	"ifdef" |
+	"ifndef"					{ addToken(Token.RESERVED_WORD); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Label}							{ addToken(Token.PREPROCESSOR); }
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{StringLiteral}					{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{BacktickLiteral}				{ addToken(Token.LITERAL_BACKQUOTE); }
+	{BacktickLiteral}				{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+
+	/* Variables. */
+	{CurlyVarStart}					{ if (varDepths==null) { varDepths = new Stack(); } else { varDepths.clear(); } varDepths.push(Boolean.TRUE); start = zzMarkedPos-2; yybegin(VAR); }
+	{ParenVarStart}					{ if (varDepths==null) { varDepths = new Stack(); } else { varDepths.clear(); } varDepths.push(Boolean.FALSE); start = zzMarkedPos-2; yybegin(VAR); }
+
+	/* Comment literals. */
+	{LineCommentBegin}.*			{ addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch-all for anything else. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+<VAR> {
+	[^\}\)\$\#]+		{}
+	"}"					{
+							if (!varDepths.empty() && varDepths.peek()==Boolean.TRUE) {
+								varDepths.pop();
+								if (varDepths.empty()) {
+									addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL);
+								}
+							}
+						}
+	")"					{
+							if (!varDepths.empty() && varDepths.peek()==Boolean.FALSE) {
+								varDepths.pop();
+								if (varDepths.empty()) {
+									addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL);
+								}
+							}
+						}
+	"${"				{ varDepths.push(Boolean.TRUE); }
+	"$("				{ varDepths.push(Boolean.FALSE); }
+	"$"					{}
+	"#".*				{ int temp1 = zzStartRead; int temp2 = zzMarkedPos; addToken(start,zzStartRead-1, Token.VARIABLE); addToken(temp1, temp2-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.VARIABLE); addNullToken(); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java
new file mode 100644
index 0000000..1aa26f8
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java
@@ -0,0 +1,863 @@
+/* The following code was generated by JFlex 1.4.1 on 1/20/09 10:04 AM */
+
+/*
+ * 09/20/2008
+ *
+ * MakefileTokenMaker.java - Scanner for makefiles.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import java.util.Stack;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for makefiles.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated MakefileTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class MakefileTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int VAR = 1;
+  public static final int YYINITIAL = 0;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\10\1\7\1\0\1\10\23\0\1\10\1\0\1\13\1\15"+
+    "\1\4\2\0\1\11\1\6\1\47\1\0\1\16\1\0\1\37\1\1"+
+    "\1\0\12\2\1\3\2\0\1\17\1\0\1\16\1\0\32\1\1\0"+
+    "\1\12\2\0\1\1\1\14\1\20\1\32\1\43\1\21\1\24\1\25"+
+    "\1\41\1\44\1\26\1\45\1\1\1\35\1\34\1\33\1\40\1\22"+
+    "\1\46\1\23\1\30\1\36\1\31\1\1\1\42\1\27\2\1\1\5"+
+    "\1\0\1\50\uff82\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\1\2\2\1\1\3\1\4\1\5\1\6"+
+    "\1\1\1\7\1\10\14\1\2\11\1\12\1\13\1\14"+
+    "\1\15\1\16\1\17\1\20\1\5\1\6\1\21\2\0"+
+    "\1\22\23\1\1\23\1\24\1\20\1\21\1\22\2\1"+
+    "\1\25\43\1\1\25\14\1\1\25\5\1\1\0\2\1"+
+    "\1\0\1\1\1\0\1\25";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[129];
+    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\51\0\122\0\173\0\244\0\315\0\366\0\122"+
+    "\0\u011f\0\u0148\0\u0171\0\u019a\0\u01c3\0\122\0\u01ec\0\u0215"+
+    "\0\u023e\0\u0267\0\u0290\0\u02b9\0\u02e2\0\u030b\0\u0334\0\u035d"+
+    "\0\u0386\0\u03af\0\u03d8\0\u0401\0\u042a\0\122\0\122\0\122"+
+    "\0\122\0\122\0\122\0\u0453\0\u047c\0\122\0\u019a\0\u04a5"+
+    "\0\122\0\u04ce\0\u04f7\0\u0520\0\u0549\0\u0572\0\u059b\0\u05c4"+
+    "\0\u05ed\0\u0616\0\u063f\0\u0668\0\u0691\0\u06ba\0\u06e3\0\u070c"+
+    "\0\u0735\0\u075e\0\u0787\0\u07b0\0\122\0\122\0\u0148\0\u0171"+
+    "\0\u019a\0\u07d9\0\u0802\0\173\0\u082b\0\u0854\0\u087d\0\u08a6"+
+    "\0\u08cf\0\u08f8\0\u0921\0\u094a\0\u0973\0\u099c\0\u09c5\0\u09ee"+
+    "\0\u0a17\0\u0a40\0\u0a69\0\u0a92\0\u0abb\0\u0ae4\0\u0b0d\0\u0b36"+
+    "\0\u0b5f\0\u0b88\0\u0bb1\0\u0bda\0\u0c03\0\u0c2c\0\u0c55\0\u0c7e"+
+    "\0\u0ca7\0\u0cd0\0\u0cf9\0\u0d22\0\u0d4b\0\u0d74\0\u0d9d\0\u0dc6"+
+    "\0\u0def\0\u0e18\0\u0e41\0\u0e6a\0\u0e93\0\u0ebc\0\u0ee5\0\u0f0e"+
+    "\0\u0f37\0\u0f60\0\u0f89\0\u0fb2\0\u0fdb\0\u1004\0\u102d\0\u1056"+
+    "\0\u107f\0\u10a8\0\u10d1\0\u10fa\0\u1123\0\u114c\0\u1175\0\u119e"+
+    "\0\122";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[129];
+    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\1\4\1\5\1\6\1\7\2\3\1\10\1\11"+
+    "\1\12\1\3\1\13\1\14\1\15\1\6\1\16\1\17"+
+    "\1\20\1\21\1\4\1\22\1\23\1\24\1\4\1\25"+
+    "\1\4\1\26\1\27\3\4\1\3\1\30\1\4\1\31"+
+    "\2\4\1\32\1\4\2\3\4\33\1\34\10\33\1\35"+
+    "\31\33\1\36\1\37\52\0\2\4\1\40\14\0\17\4"+
+    "\1\0\7\4\4\0\1\5\65\0\1\16\36\0\1\41"+
+    "\1\42\52\0\1\11\40\0\7\12\1\0\1\12\1\43"+
+    "\1\44\36\12\7\13\1\0\2\13\1\45\1\46\35\13"+
+    "\7\47\1\0\2\47\1\50\1\47\1\51\34\47\7\15"+
+    "\1\0\41\15\1\0\2\4\1\40\14\0\1\4\1\52"+
+    "\15\4\1\0\7\4\3\0\2\4\1\40\14\0\4\4"+
+    "\1\53\1\4\1\54\10\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\1\55\16\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\13\4\1\56\1\4\1\57\1\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\6\4\1\60\10\4"+
+    "\1\0\1\61\6\4\3\0\2\4\1\40\14\0\5\4"+
+    "\1\62\11\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+    "\11\4\1\63\4\4\1\64\1\0\1\65\3\4\1\66"+
+    "\2\4\3\0\2\4\1\40\14\0\1\67\16\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\17\4\1\0\1\70"+
+    "\6\4\3\0\2\4\1\40\14\0\3\4\1\71\13\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\6\4\1\72"+
+    "\10\4\1\0\1\73\6\4\3\0\2\4\1\40\14\0"+
+    "\17\4\1\0\1\74\6\4\2\0\4\33\1\0\10\33"+
+    "\1\0\31\33\7\0\1\75\1\76\42\0\7\35\1\0"+
+    "\41\35\7\12\1\0\1\12\1\77\1\44\36\12\7\13"+
+    "\1\0\2\13\1\45\1\100\35\13\7\47\1\0\2\47"+
+    "\1\50\1\47\1\101\34\47\1\0\2\4\1\40\14\0"+
+    "\1\4\1\102\15\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\5\4\1\103\11\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\3\4\1\104\13\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\16\4\1\105\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\1\4\1\106\15\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\10\4\1\107\6\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\3\4\1\110\7\4"+
+    "\1\111\1\4\1\112\1\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\3\4\1\113\13\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\1\4\1\114\2\4\1\115\6\4"+
+    "\1\116\3\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+    "\5\4\1\117\11\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\3\4\1\120\13\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\3\4\1\121\13\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\4\4\1\122\12\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\10\4\1\123\6\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\16\4\1\124\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\6\4\1\125\10\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\15\4\1\126"+
+    "\1\4\1\0\7\4\3\0\2\4\1\40\14\0\3\4"+
+    "\1\127\13\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+    "\6\4\1\130\10\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\2\4\1\131\5\4\1\132\6\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\6\4\1\133\10\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\17\4\1\0\4\4"+
+    "\1\134\2\4\3\0\2\4\1\40\14\0\4\4\1\135"+
+    "\1\4\1\135\10\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\4\4\1\104\12\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\10\4\1\136\6\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\1\4\1\137\15\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\16\4\1\140\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\4\4\1\141\12\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\4\4\1\135\12\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\17\4\1\0"+
+    "\6\4\1\104\3\0\2\4\1\40\14\0\1\4\1\114"+
+    "\2\4\1\115\12\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\5\4\1\142\11\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\6\4\1\143\10\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\16\4\1\104\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\15\4\1\144\1\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\4\4\1\145\12\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\1\4\1\146\15\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\17\4\1\0"+
+    "\1\4\1\74\5\4\3\0\2\4\1\40\14\0\1\4"+
+    "\1\147\15\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+    "\1\4\1\150\15\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\13\4\1\104\3\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\3\4\1\151\13\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\11\4\1\63\5\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\13\4\1\107\3\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\10\4\1\152\6\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\5\4\1\104"+
+    "\11\4\1\0\7\4\3\0\2\4\1\40\14\0\16\4"+
+    "\1\153\1\0\7\4\3\0\2\4\1\40\14\0\10\4"+
+    "\1\154\6\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+    "\4\4\1\155\12\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\1\156\16\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\6\4\1\157\10\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\2\4\1\104\14\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\15\4\1\104\1\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\13\4\1\160\3\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\6\4\1\54\10\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\17\4\1\0"+
+    "\3\4\1\161\3\4\3\0\2\4\1\40\14\0\10\4"+
+    "\1\104\6\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+    "\4\4\1\117\12\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\11\4\1\162\5\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\17\4\1\0\2\4\1\163\4\4\3\0"+
+    "\2\4\1\40\14\0\16\4\1\164\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\3\4\1\165\13\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\17\4\1\0\3\4\1\166"+
+    "\3\4\3\0\2\4\1\40\14\0\7\4\1\104\7\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\1\167\16\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\1\170\16\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\12\4\1\171"+
+    "\4\4\1\0\7\4\3\0\2\4\1\40\14\0\17\4"+
+    "\1\0\1\170\6\4\3\0\2\4\1\40\14\0\3\4"+
+    "\1\172\13\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+    "\17\4\1\173\7\4\3\0\2\4\1\40\14\0\17\4"+
+    "\1\0\4\4\1\104\2\4\3\0\2\4\1\40\14\0"+
+    "\14\4\1\107\2\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\3\4\1\174\13\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\10\4\1\121\6\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\6\4\1\175\10\4\1\0\7\4"+
+    "\42\0\1\176\11\0\2\4\1\40\14\0\1\4\1\104"+
+    "\15\4\1\0\7\4\3\0\2\4\1\40\14\0\13\4"+
+    "\1\177\3\4\1\0\7\4\33\0\1\200\20\0\2\4"+
+    "\1\40\14\0\17\4\1\0\1\4\1\104\5\4\40\0"+
+    "\1\201\12\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[4551];
+    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\5\1\1\11\17\1\6\11"+
+    "\2\1\1\11\2\0\1\11\23\1\2\11\74\1\1\0"+
+    "\2\1\1\0\1\1\1\0\1\11";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[129];
+    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;
+
+  /* user code: */
+
+	private Stack varDepths;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public MakefileTokenMaker() {
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * 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;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(Token.NULL);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+		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 MakefileTokenMaker(java.io.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 MakefileTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 126) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 13: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 22: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 23: break;
+        case 16: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 24: break;
+        case 15: 
+          { if (varDepths==null) { varDepths = new Stack(); } else { varDepths.clear(); } varDepths.push(Boolean.FALSE); start = zzMarkedPos-2; yybegin(VAR);
+          }
+        case 25: break;
+        case 12: 
+          { if (!varDepths.empty() && varDepths.peek()==Boolean.TRUE) {
+								varDepths.pop();
+								if (varDepths.empty()) {
+									addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL);
+								}
+							}
+          }
+        case 26: break;
+        case 11: 
+          { if (!varDepths.empty() && varDepths.peek()==Boolean.FALSE) {
+								varDepths.pop();
+								if (varDepths.empty()) {
+									addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL);
+								}
+							}
+          }
+        case 27: break;
+        case 4: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 28: break;
+        case 21: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 29: break;
+        case 20: 
+          { varDepths.push(Boolean.FALSE);
+          }
+        case 30: break;
+        case 18: 
+          { addToken(Token.LITERAL_BACKQUOTE);
+          }
+        case 31: break;
+        case 19: 
+          { varDepths.push(Boolean.TRUE);
+          }
+        case 32: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 33: break;
+        case 5: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 34: break;
+        case 6: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 35: break;
+        case 10: 
+          { int temp1 = zzStartRead; int temp2 = zzMarkedPos; addToken(start,zzStartRead-1, Token.VARIABLE); addToken(temp1, temp2-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 36: break;
+        case 17: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 37: break;
+        case 14: 
+          { if (varDepths==null) { varDepths = new Stack(); } else { varDepths.clear(); } varDepths.push(Boolean.TRUE); start = zzMarkedPos-2; yybegin(VAR);
+          }
+        case 38: break;
+        case 7: 
+          { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 39: break;
+        case 2: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 40: break;
+        case 8: 
+          { addToken(Token.OPERATOR);
+          }
+        case 41: break;
+        case 9: 
+          { 
+          }
+        case 42: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case VAR: {
+              addToken(start,zzStartRead-1, Token.VARIABLE); addNullToken(); return firstToken;
+            }
+            case 130: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 131: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.flex
new file mode 100644
index 0000000..a6b6265
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.flex
@@ -0,0 +1,809 @@
+/*
+ * 01/21/2011
+ *
+ * MxmlTokenMaker.java - Generates tokens for MXML syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for MXML.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>MXMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class MxmlTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line with an unclosed XML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG						= -3;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line with an unclosed Script tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG_SCRIPT				= -4;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in the middle of a double-quoted attribute in a Script
+	 * tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT	= -5;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in the middle of a single-quoted attribute in a Script
+	 * tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT	= -6;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in an ActionScript code block (text content inside a
+	 * Script tag).
+	 */
+	public static final int INTERNAL_IN_AS						= -7;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in an MLC in an ActionScript code block (text content
+	 * inside a Script tag).
+	 */
+	public static final int INTERNAL_IN_AS_MLC					= -8;
+
+	/**
+	 * Whether closing markup tags are automatically completed for HTML.
+	 */
+	private static boolean completeCloseTags;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public MxmlTokenMaker() {
+	}
+
+
+	static {
+		completeCloseTags = true;
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns whether markup close tags should be completed.  For XML, the
+	 * default value is <code>true</code>.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Static version of {@link #getCompleteCloseTags()}.  This hack is
+	 * unfortunately needed for applications to be able to query this value
+	 * without instantiating this class.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public static boolean getCompleteCloseMarkupTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Always returns <tt>false</tt>, as you never want "mark occurrences"
+	 * working in XML files.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	/**
+	 * 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) {
+			case Token.MARKUP_COMMENT:
+				state = COMMENT;
+				start = text.offset;
+				break;
+			case Token.MARKUP_DTD:
+				state = DTD;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				start = text.offset;
+				break;
+			case Token.MARKUP_PROCESSING_INSTRUCTION:
+				state = PI;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_AS:
+				state = AS;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_AS_MLC:
+				state = AS_MLC;
+				start = text.offset;
+				break;
+			case Token.MARKUP_CDATA:
+				state = CDATA;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * 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(java.io.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;
+	}
+
+
+%}
+
+/* XML macros (and some building-block macros used by AS macros). */
+Letter				= [A-Za-z]
+NonzeroDigit		= [1-9]
+Digit				= ("0"|{NonzeroDigit})
+LetterOrUnderscore	= ({Letter}|"_")
+NameStartChar		= ({Letter}|[\:])
+NameChar			= ({NameStartChar}|[\-\.]|{Digit})
+TagName				= ({NameStartChar}{NameChar}*)
+Whitespace			= ([ \t\f])
+LineTerminator			= ([\n])
+Identifier			= ([^ \t\n<&]+)
+EntityReference				= ([&][^; \t]*[;]?)
+InTagIdentifier		= ([^ \t\n\"\'=\/>]+)
+CDataBegin			= ("<![CDATA[")
+CDataEnd				= ("]]>")
+
+
+/* ActionScript macros. */
+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}))
+
+AS_CharLiteral				= ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})*[\'])
+AS_UnclosedCharLiteral		= ([\']([\\].|[^\\\'])*[^\']?)
+AS_ErrorCharLiteral			= ({AS_UnclosedCharLiteral}[\'])
+AS_StringLiteral			= ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
+AS_UnclosedStringLiteral	= ([\"]([\\].|[^\\\"])*[^\"]?)
+AS_ErrorStringLiteral		= ({AS_UnclosedStringLiteral}[\"])
+
+AS_MLCBegin					= ("/*")
+AS_MLCEnd					= ("*/")
+AS_LineCommentBegin			= ("//")
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+AS_IntegerLiteral			= ({IntegerHelper1}[lL]?)
+AS_HexLiteral				= ({IntegerHelper2}[lL]?)
+FloatHelper1				= ([fFdD]?)
+FloatHelper2				= ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1				= ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2				= ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3				= ({Digit}+{FloatHelper2})
+AS_FloatLiteral				= ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+AS_ErrorNumberFormat		= (({AS_IntegerLiteral}|{AS_HexLiteral}|{AS_FloatLiteral}){NonSeparator}+)
+AS_BooleanLiteral			= ("true"|"false")
+
+AS_Separator				= ([\(\)\{\}\[\]])
+AS_Separator2				= ([\;,.])
+
+NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator			= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+AS_Operator					= ({NonAssignmentOperator}|{AssignmentOperator})
+
+AS_Identifier				= ({IdentifierStart}{IdentifierPart}*)
+AS_ErrorIdentifier			= ({NonSeparator}+)
+AS_EndScriptTag				= ("</"({NameStartChar}{NameChar}*":")?"Script"{Whitespace}*">")
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state COMMENT
+%state PI
+%state DTD
+%state INTAG
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state INTAG_SCRIPT
+%state INATTR_DOUBLE_SCRIPT
+%state INATTR_SINGLE_SCRIPT
+%state CDATA
+
+%state AS
+%state AS_MLC
+%state AS_EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+	"<!--"						{ start = zzMarkedPos-4; yybegin(COMMENT); }
+	{CDataBegin}					{ addToken(Token.MARKUP_CDATA_DELIMITER); start = zzMarkedPos; yybegin(CDATA); }
+	"<!"							{ start = zzMarkedPos-2; yybegin(DTD); }
+	"<?"							{ start = zzMarkedPos-2; yybegin(PI); }
+	"<"{TagName}				{
+									int count = yylength();
+									String tag = yytext(); // Get before addToken calls
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									if (tag.endsWith(":Script") || tag.equals("<Script")) {
+										yybegin(INTAG_SCRIPT);
+									}
+									else {
+										yybegin(INTAG);
+									}
+								}
+	"</"{TagName}				{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(INTAG);
+								}
+	"<"							{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	"</"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	{EntityReference}					{ addToken(Token.MARKUP_ENTITY_REFERENCE); }
+	{Whitespace}+					{ addToken(Token.WHITESPACE); }
+	<<EOF>>						{ addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+	[^\n\-]+						{}
+	{LineTerminator}				{ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken; }
+	"-->"						{ yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); }
+	"-"							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken; }
+}
+
+<PI> {
+	[^\n\?]+						{}
+	{LineTerminator}				{ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+	"?>"							{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION); }
+	"?"							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+}
+
+<DTD> {
+	[^\n>]+					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken; }
+	">"						{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken; }
+}
+
+<INTAG> {
+	{InTagIdentifier}				{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}+					{ addToken(Token.WHITESPACE); }
+	"="							{ addToken(Token.OPERATOR); }
+	"/"							{ addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */ }
+	"/>"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	">"							{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+	[^\"]*						{}
+	[\"]						{ yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+	[^\']*						{}
+	[\']						{ yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<INTAG_SCRIPT> {
+	{InTagIdentifier}				{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}+					{ addToken(Token.WHITESPACE); }
+	"="							{ addToken(Token.OPERATOR); }
+	"/"							{ addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */ }
+	"/>"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	">"							{ yybegin(AS); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, INTERNAL_INTAG_SCRIPT); return firstToken; }
+}
+
+<INATTR_DOUBLE_SCRIPT> {
+	[^\"]*						{}
+	[\"]						{ yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INATTR_SINGLE_SCRIPT> {
+	[^\']*						{}
+	[\']						{ yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<CDATA> {
+	[^\]]+						{}
+	{CDataEnd}					{ int temp=zzStartRead; yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.MARKUP_CDATA_DELIMITER); }
+	"]"							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_CDATA); return firstToken; }
+}
+
+<AS> {
+
+	{AS_EndScriptTag}			{
+								  int origStart = zzStartRead;
+								  String text = yytext();
+								  int tagNameEnd = text.length() - 2; // "-1" is '>'
+								  while (Character.isWhitespace(text.charAt(tagNameEnd))) {
+								      tagNameEnd--;
+								  }
+								  int tagNameLen = tagNameEnd - 1;
+								  yybegin(YYINITIAL);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(origStart+2,origStart+2+tagNameLen-1, Token.MARKUP_TAG_NAME);
+								  if (tagNameEnd<text.length()-2) {
+								      addToken(origStart+tagNameEnd+1, zzMarkedPos-2, Token.WHITESPACE);
+								  }
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+								}
+
+	/* ActionScript snippets are usually wrapped in CDATA. */
+	{CDataBegin} |
+	{CDataEnd}					{ addToken(Token.MARKUP_CDATA_DELIMITER); }
+	
+	/* Keywords */
+	"add" |
+	"and" |
+	"break" |
+	"case" |
+	"catch" |
+	"class" |
+	"const" |
+	"continue" |
+	"default" |
+	"delete" |
+	"do" |
+	"dynamic" |
+	"else" |
+	"eq" |
+	"extends" |
+	"final" |
+	"finally" |
+	"for" |
+	"for each" |
+	"function" |
+	"ge" |
+	"get" |
+	"gt" |
+	"if" |
+	"ifFrameLoaded" |
+	"implements" |
+	"import" |
+	"in" |
+	"include" |
+	"interface" |
+	"internal" |
+	"label" |
+	"le" |
+	"lt" |
+	"namespace" |
+	"native" |
+	"ne" |
+	"new" |
+	"not" |
+	"on" |
+	"onClipEvent" |
+	"or" |
+	"override" |
+	"package" |
+	"private" |
+	"protected" |
+	"public" |
+	"return" |
+	"set" |
+	"static" |
+	"super" |
+	"switch" |
+	"tellTarget" |
+	"this" |
+	"throw" |
+	"try" |
+	"typeof" |
+	"use" |
+	"var" |
+	"void" |
+	"while" |
+	"with" |
+
+	"null" |
+	"undefined"				{ addToken(Token.RESERVED_WORD); }
+
+	/* Built-in objects (good idea not to use these names!) */
+	"Array" |
+	"Boolean" |
+	"Color" |
+	"Date" |
+	"Function" |
+	"int" |
+	"Key" |
+	"MovieClip" |
+	"Math" |
+	"Mouse" |
+	"Null" |
+	"Number" |
+	"Object" |
+	"Selection" |
+	"Sound" |
+	"String" |
+	"uint" |
+	"Vector" |
+	"void" |
+	"XML" |
+	"XMLNode" |
+	"XMLSocket"			{ addToken(Token.DATA_TYPE); }
+
+	/* Global functions */
+	"call" |
+	"escape" |
+	"eval" |
+	"fscommand" |
+	"getProperty" |
+	"getTimer" |
+	"getURL" |
+	"getVersion" |
+	"gotoAndPlay" |
+	"gotoAndStop" |
+	"#include" |
+	"int" |
+	"isFinite" |
+	"isNaN" |
+	"loadMovie" |
+	"loadMovieNum" |
+	"loadVariables" |
+	"loadVariablesNum" |
+	"maxscroll" |
+	"newline" |
+	"nextFrame" |
+	"nextScene" |
+	"Number" |
+	"parseFloat" |
+	"parseInt" |
+	"play" |
+	"prevFrame" |
+	"prevScene" |
+	"print" |
+	"printAsBitmap" |
+	"printAsBitmapNum" |
+	"printNum" |
+	"random" |
+	"removeMovieClip" |
+	"scroll" |
+	"setProperty" |
+	"startDrag" |
+	"stop" |
+	"stopAllSounds" |
+	"stopDrag" |
+	"String" |
+	"targetPath" |
+	"tellTarget" |
+	"toggleHighQuality" |
+	"trace" |
+	"unescape" |
+	"unloadMovie" |
+	"unloadMovieNum" |
+	"updateAfterEvent"			{ addToken(Token.FUNCTION); }
+
+	/* Booleans. */
+	{AS_BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+	{LineTerminator}				{ addEndToken(INTERNAL_IN_AS); return firstToken; }
+
+	{AS_Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{Whitespace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	{AS_CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{AS_UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{AS_ErrorCharLiteral}				{ addToken(Token.ERROR_CHAR); }
+	{AS_StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{AS_UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{AS_ErrorStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{AS_MLCBegin}					{ start = zzMarkedPos-2; yybegin(AS_MLC); }
+	{AS_LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(AS_EOL_COMMENT); }
+
+	/* Separators. */
+	{AS_Separator}					{ addToken(Token.SEPARATOR); }
+	{AS_Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{AS_Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{AS_IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{AS_HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{AS_FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{AS_ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{AS_ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addEndToken(INTERNAL_IN_AS); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<AS_MLC> {
+
+	[^hwf\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_AS_MLC); return firstToken; }
+	{AS_MLCEnd}				{ yybegin(AS); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_AS_MLC); return firstToken; }
+
+}
+
+
+<AS_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 |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_AS); return firstToken; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.java
new file mode 100644
index 0000000..a398f3b
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.java
@@ -0,0 +1,2704 @@
+/* The following code was generated by JFlex 1.4.1 on 3/22/13 7:36 PM */
+
+/*
+ * 01/21/2011
+ *
+ * MxmlTokenMaker.java - Generates tokens for MXML syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for MXML.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>MXMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class MxmlTokenMaker extends AbstractMarkupTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int AS_EOL_COMMENT = 13;
+  public static final int AS_MLC = 12;
+  public static final int INTAG_SCRIPT = 7;
+  public static final int INATTR_DOUBLE_SCRIPT = 8;
+  public static final int CDATA = 10;
+  public static final int INATTR_SINGLE_SCRIPT = 9;
+  public static final int DTD = 3;
+  public static final int INATTR_SINGLE = 6;
+  public static final int INATTR_DOUBLE = 5;
+  public static final int YYINITIAL = 0;
+  public static final int AS = 11;
+  public static final int INTAG = 4;
+  public static final int COMMENT = 1;
+  public static final int PI = 2;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\12\1\10\1\0\1\7\1\36\22\0\1\105\1\16\1\32"+
+    "\1\37\1\40\1\63\1\13\1\31\2\73\1\42\1\51\1\61\1\50"+
+    "\1\6\1\41\1\3\3\27\4\27\2\2\1\5\1\14\1\11\1\15"+
+    "\1\25\1\64\1\72\1\22\1\26\1\20\1\21\1\47\1\45\1\1"+
+    "\1\122\1\121\1\1\1\110\1\44\1\111\1\112\1\113\1\116\1\123"+
+    "\1\120\1\66\1\23\1\117\1\115\1\1\1\43\2\1\1\17\1\30"+
+    "\1\24\1\62\1\4\1\0\1\55\1\35\1\67\1\76\1\54\1\46"+
+    "\1\106\1\74\1\70\1\114\1\77\1\56\1\102\1\34\1\100\1\71"+
+    "\1\103\1\53\1\57\1\52\1\33\1\107\1\75\1\104\1\101\1\1"+
+    "\1\60\1\62\1\60\1\65\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 =
+    "\5\0\2\1\1\0\2\1\4\0\2\2\1\3\1\4"+
+    "\1\5\1\6\1\1\1\7\2\1\1\10\2\1\1\11"+
+    "\1\12\2\13\1\14\1\15\1\16\1\17\1\20\1\1"+
+    "\1\21\1\1\1\22\1\23\1\24\1\25\2\1\1\26"+
+    "\1\2\2\27\1\2\1\30\2\14\1\2\1\14\1\31"+
+    "\3\2\1\31\1\14\1\2\1\32\1\33\3\2\2\26"+
+    "\1\14\3\2\2\14\25\2\1\1\1\34\5\1\1\35"+
+    "\3\1\1\36\1\37\1\4\1\40\1\6\1\0\1\41"+
+    "\1\0\1\26\1\42\2\43\1\27\2\42\1\44\1\42"+
+    "\3\0\3\2\1\0\1\14\1\2\1\32\1\45\2\33"+
+    "\1\46\5\2\1\47\3\2\1\26\1\50\1\51\21\2"+
+    "\1\47\20\2\2\47\12\2\1\47\2\2\1\47\11\2"+
+    "\1\52\12\0\1\53\1\54\1\55\1\26\1\43\1\0"+
+    "\2\44\3\0\3\2\1\56\1\2\2\32\1\33\1\57"+
+    "\1\33\6\2\1\47\4\2\1\26\1\0\1\60\5\2"+
+    "\1\47\23\2\1\47\10\2\1\60\24\2\1\47\1\2"+
+    "\1\60\7\2\11\0\1\61\1\26\3\0\2\2\1\32"+
+    "\1\62\1\32\1\33\10\2\1\26\1\63\6\2\1\0"+
+    "\1\64\13\2\1\65\3\2\1\65\36\2\2\0\1\66"+
+    "\2\0\1\67\1\0\1\26\2\0\1\2\1\32\1\33"+
+    "\7\2\1\26\5\2\1\47\1\0\26\2\1\65\13\2"+
+    "\5\0\1\26\2\0\1\2\1\32\1\33\6\2\1\26"+
+    "\5\2\1\0\30\2\3\0\4\2\1\26\2\2\1\0"+
+    "\23\2\3\0\1\2\1\65\1\2\1\47\21\2\1\70"+
+    "\1\0\1\71\4\2\1\65\40\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[608];
+    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\124\0\250\0\374\0\u0150\0\u01a4\0\u01f8\0\u024c"+
+    "\0\u02a0\0\u02f4\0\u0348\0\u039c\0\u03f0\0\u0444\0\u0498\0\u04ec"+
+    "\0\u0540\0\u0594\0\u05e8\0\u063c\0\u0690\0\u0540\0\u06e4\0\u0738"+
+    "\0\u0540\0\u078c\0\u07e0\0\u0540\0\u0540\0\u0834\0\u0888\0\u0540"+
+    "\0\u0540\0\u0540\0\u0540\0\u08dc\0\u0930\0\u0540\0\u0984\0\u0540"+
+    "\0\u0540\0\u0540\0\u0540\0\u09d8\0\u0a2c\0\u0a80\0\u0ad4\0\u0b28"+
+    "\0\u0b7c\0\u0bd0\0\u0540\0\u0c24\0\u0c78\0\u0540\0\u0ccc\0\u0540"+
+    "\0\u0d20\0\u0d74\0\u0dc8\0\u0e1c\0\u0e70\0\u0ec4\0\u0f18\0\u0f6c"+
+    "\0\u0fc0\0\u1014\0\u1068\0\u0540\0\u10bc\0\u1110\0\u1164\0\u11b8"+
+    "\0\u120c\0\u1260\0\u12b4\0\u1308\0\u135c\0\u13b0\0\u1404\0\u1458"+
+    "\0\u14ac\0\u1500\0\u1554\0\u15a8\0\u15fc\0\u1650\0\u16a4\0\u16f8"+
+    "\0\u174c\0\u17a0\0\u17f4\0\u1848\0\u189c\0\u18f0\0\u1944\0\u1998"+
+    "\0\u19ec\0\u0540\0\u1a40\0\u1a94\0\u1ae8\0\u1b3c\0\u1b90\0\u0540"+
+    "\0\u1be4\0\u1c38\0\u1c8c\0\u1ce0\0\u1d34\0\u1d88\0\u0540\0\u0540"+
+    "\0\u1ddc\0\u0540\0\u1e30\0\u1e84\0\u1ed8\0\u1f2c\0\u1ed8\0\u1ed8"+
+    "\0\u1f80\0\u1fd4\0\u2028\0\u207c\0\u0ccc\0\u20d0\0\u2124\0\u2178"+
+    "\0\u21cc\0\u2220\0\u2274\0\u22c8\0\u231c\0\u2370\0\u0540\0\u23c4"+
+    "\0\u2418\0\u0540\0\u246c\0\u24c0\0\u2514\0\u2568\0\u25bc\0\u2610"+
+    "\0\u2664\0\u26b8\0\u270c\0\u2760\0\u0540\0\u27b4\0\u2808\0\u285c"+
+    "\0\u28b0\0\u2904\0\u2958\0\u29ac\0\u2a00\0\u2a54\0\u2aa8\0\u2afc"+
+    "\0\u2b50\0\u2ba4\0\u2bf8\0\u2c4c\0\u2ca0\0\u2cf4\0\u2d48\0\u0ad4"+
+    "\0\u2d9c\0\u2df0\0\u2e44\0\u2e98\0\u2eec\0\u2f40\0\u2f94\0\u2fe8"+
+    "\0\u303c\0\u3090\0\u30e4\0\u3138\0\u318c\0\u31e0\0\u3234\0\u3288"+
+    "\0\u32dc\0\u3330\0\u3384\0\u33d8\0\u342c\0\u3480\0\u34d4\0\u3528"+
+    "\0\u357c\0\u35d0\0\u3624\0\u3678\0\u36cc\0\u3720\0\u3774\0\u37c8"+
+    "\0\u381c\0\u3870\0\u38c4\0\u3918\0\u396c\0\u39c0\0\u3a14\0\u3a68"+
+    "\0\u3abc\0\u0540\0\u3b10\0\u3b64\0\u3bb8\0\u3c0c\0\u3c60\0\u3cb4"+
+    "\0\u3d08\0\u3d5c\0\u3db0\0\u3e04\0\u3e58\0\u0540\0\u0540\0\u3eac"+
+    "\0\u3f00\0\u3f54\0\u1ed8\0\u3fa8\0\u3ffc\0\u4050\0\u40a4\0\u40f8"+
+    "\0\u414c\0\u41a0\0\u0540\0\u41f4\0\u4248\0\u429c\0\u42f0\0\u0540"+
+    "\0\u4344\0\u4398\0\u43ec\0\u4440\0\u4494\0\u44e8\0\u453c\0\u4590"+
+    "\0\u45e4\0\u4638\0\u468c\0\u46e0\0\u4734\0\u4788\0\u47dc\0\u4830"+
+    "\0\u4884\0\u48d8\0\u492c\0\u4980\0\u49d4\0\u4a28\0\u4a7c\0\u4ad0"+
+    "\0\u4b24\0\u4b78\0\u4bcc\0\u4c20\0\u4c74\0\u4cc8\0\u4d1c\0\u4d70"+
+    "\0\u4dc4\0\u4e18\0\u4e6c\0\u4ec0\0\u4f14\0\u4f68\0\u4fbc\0\u5010"+
+    "\0\u5064\0\u50b8\0\u510c\0\u5160\0\u51b4\0\u5208\0\u525c\0\u52b0"+
+    "\0\u5304\0\u5358\0\u53ac\0\u5400\0\u5454\0\u54a8\0\u54fc\0\u5550"+
+    "\0\u55a4\0\u55f8\0\u564c\0\u56a0\0\u56f4\0\u5748\0\u579c\0\u57f0"+
+    "\0\u5844\0\u5898\0\u58ec\0\u5940\0\u5994\0\u59e8\0\u5a3c\0\u5a90"+
+    "\0\u0ad4\0\u5ae4\0\u5b38\0\u5b8c\0\u5be0\0\u5c34\0\u5c88\0\u5cdc"+
+    "\0\u5d30\0\u5d84\0\u5dd8\0\u5e2c\0\u5e80\0\u5ed4\0\u5f28\0\u5f7c"+
+    "\0\u5fd0\0\u0540\0\u6024\0\u6078\0\u60cc\0\u6120\0\u6174\0\u61c8"+
+    "\0\u621c\0\u0540\0\u6270\0\u62c4\0\u6318\0\u636c\0\u63c0\0\u6414"+
+    "\0\u6468\0\u64bc\0\u6510\0\u6564\0\u65b8\0\u0540\0\u660c\0\u6660"+
+    "\0\u66b4\0\u6708\0\u675c\0\u67b0\0\u6804\0\u0ad4\0\u6858\0\u68ac"+
+    "\0\u6900\0\u6954\0\u69a8\0\u69fc\0\u6a50\0\u6aa4\0\u6af8\0\u6b4c"+
+    "\0\u6ba0\0\u0ad4\0\u6bf4\0\u6c48\0\u6c9c\0\u6cf0\0\u6d44\0\u6d98"+
+    "\0\u6dec\0\u6e40\0\u6e94\0\u6ee8\0\u6f3c\0\u6f90\0\u6fe4\0\u7038"+
+    "\0\u708c\0\u70e0\0\u7134\0\u7188\0\u71dc\0\u7230\0\u7284\0\u72d8"+
+    "\0\u732c\0\u7380\0\u73d4\0\u7428\0\u747c\0\u74d0\0\u7524\0\u7578"+
+    "\0\u75cc\0\u7620\0\u7674\0\u76c8\0\u771c\0\u7770\0\u77c4\0\u7818"+
+    "\0\u786c\0\u78c0\0\u7914\0\u7968\0\u79bc\0\u7a10\0\u7a64\0\u7ab8"+
+    "\0\u7b0c\0\u7b60\0\u7bb4\0\u7c08\0\u7c5c\0\u7cb0\0\u7d04\0\u7d58"+
+    "\0\u7dac\0\u7e00\0\u7e54\0\u7ea8\0\u7efc\0\u7f50\0\u7fa4\0\u7ff8"+
+    "\0\u804c\0\u80a0\0\u80f4\0\u8148\0\u819c\0\u81f0\0\u8244\0\u8298"+
+    "\0\u82ec\0\u8340\0\u8394\0\u83e8\0\u843c\0\u8490\0\u84e4\0\u8538"+
+    "\0\u858c\0\u85e0\0\u8634\0\u8688\0\u86dc\0\u8730\0\u8784\0\u87d8"+
+    "\0\u882c\0\u8880\0\u88d4\0\u8928\0\u897c\0\u89d0\0\u8a24\0\u8a78"+
+    "\0\u8acc\0\u8b20\0\u8b74\0\u77c4\0\u8bc8\0\u78c0\0\u8c1c\0\u8c70"+
+    "\0\u8cc4\0\u8d18\0\u8d6c\0\u8dc0\0\u8e14\0\u8e68\0\u8ebc\0\u8f10"+
+    "\0\u8f64\0\u8fb8\0\u900c\0\u9060\0\u90b4\0\u9108\0\u915c\0\u91b0"+
+    "\0\u9204\0\u9258\0\u92ac\0\u9300\0\u9354\0\u93a8\0\u93fc\0\u9450"+
+    "\0\u94a4\0\u94f8\0\u954c\0\u95a0\0\u95f4\0\u9648\0\u969c\0\u96f0"+
+    "\0\u9744\0\u9798\0\u97ec\0\u9840\0\u9894\0\u98e8\0\u993c\0\u9990"+
+    "\0\u99e4\0\u9a38\0\u9a8c\0\u9ae0\0\u9b34\0\u9b88\0\u9bdc\0\u9c30"+
+    "\0\u9c84\0\u9cd8\0\u9d2c\0\u9d80\0\u9dd4\0\u9e28\0\u9e7c\0\u9ed0"+
+    "\0\u9f24\0\u9f78\0\u9fcc\0\ua020\0\ua074\0\ua0c8\0\ua11c\0\ua170"+
+    "\0\ua1c4\0\ua218\0\ua26c\0\ua2c0\0\ua314\0\ua368\0\ua3bc\0\ua410"+
+    "\0\ua464\0\ua4b8\0\ua50c\0\ua560\0\u0a80\0\ua5b4\0\u0540\0\ua608"+
+    "\0\ua65c\0\ua6b0\0\ua704\0\ua758\0\ua7ac\0\ua800\0\ua854\0\ua8a8"+
+    "\0\ua8fc\0\ua950\0\ua9a4\0\ua9f8\0\uaa4c\0\uaaa0\0\uaaf4\0\uab48"+
+    "\0\u0540\0\uab9c\0\u0540\0\uabf0\0\uac44\0\uac98\0\uacec\0\uad40"+
+    "\0\uad94\0\uade8\0\uae3c\0\uae90\0\uaee4\0\uaf38\0\uaf8c\0\uafe0"+
+    "\0\ub034\0\ub088\0\ub0dc\0\ub130\0\ub184\0\ub1d8\0\ub22c\0\ub280"+
+    "\0\ub2d4\0\ub328\0\ub37c\0\ub3d0\0\ub424\0\ub478\0\ub4cc\0\ub520"+
+    "\0\ub574\0\ub5c8\0\ub61c\0\ub670\0\ub6c4\0\ub718\0\ub76c\0\ub7c0";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[608];
+    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 =
+    "\7\17\1\20\1\21\1\22\1\23\1\24\71\17\1\23"+
+    "\16\17\10\25\1\26\37\25\1\27\53\25\10\30\1\31"+
+    "\53\30\1\32\37\30\10\33\1\34\14\33\1\35\76\33"+
+    "\7\36\1\37\1\0\1\36\1\23\2\36\1\40\7\36"+
+    "\1\41\3\36\1\42\1\43\6\36\1\44\43\36\1\23"+
+    "\16\36\32\45\1\46\71\45\31\47\1\46\72\47\7\36"+
+    "\1\37\1\0\1\36\1\23\2\36\1\40\7\36\1\50"+
+    "\3\36\1\51\1\52\6\36\1\44\43\36\1\23\16\36"+
+    "\32\45\1\53\71\45\31\47\1\53\72\47\24\54\1\55"+
+    "\77\54\1\56\1\57\1\60\1\61\1\57\1\40\1\62"+
+    "\1\23\1\63\1\64\1\23\1\65\1\66\2\67\1\70"+
+    "\1\71\1\72\1\73\1\57\1\74\1\75\1\76\1\60"+
+    "\1\56\1\77\1\100\1\101\1\102\1\103\1\104\1\105"+
+    "\1\57\1\106\1\67\1\107\1\57\1\110\1\111\1\57"+
+    "\1\112\1\113\1\114\1\115\1\116\1\117\1\120\1\121"+
+    "\1\70\1\66\2\67\2\40\1\122\1\123\1\124\1\125"+
+    "\1\56\1\70\1\57\1\126\1\127\1\57\1\130\1\57"+
+    "\1\131\2\57\1\23\1\132\1\133\1\134\1\135\1\136"+
+    "\1\137\1\57\1\140\6\57\10\141\1\142\31\141\1\143"+
+    "\3\141\1\144\25\141\1\145\1\146\26\141\10\147\1\150"+
+    "\35\147\1\151\25\147\1\152\1\153\26\147\10\17\4\0"+
+    "\71\17\1\0\25\17\1\20\2\0\1\23\1\0\71\17"+
+    "\1\23\16\17\125\0\1\154\3\0\1\154\10\0\1\155"+
+    "\1\0\4\154\2\0\1\154\4\0\3\154\3\0\1\156"+
+    "\1\0\5\154\2\0\6\154\4\0\1\157\1\0\4\154"+
+    "\2\0\11\154\1\0\16\154\7\0\1\23\2\0\1\23"+
+    "\72\0\1\23\16\0\12\24\1\0\1\24\1\160\70\24"+
+    "\1\0\16\24\10\25\1\0\37\25\1\0\53\25\50\0"+
+    "\1\161\53\0\10\30\1\0\53\30\1\0\37\30\25\0"+
+    "\1\162\76\0\10\33\1\0\14\33\1\0\76\33\10\36"+
+    "\1\0\1\36\1\0\2\36\1\0\7\36\1\0\3\36"+
+    "\2\0\6\36\1\0\43\36\1\0\25\36\1\37\1\0"+
+    "\1\36\1\23\2\36\1\0\7\36\1\0\3\36\2\0"+
+    "\6\36\1\0\43\36\1\23\16\36\25\0\1\41\76\0"+
+    "\32\45\1\0\71\45\31\47\1\0\72\47\24\54\1\0"+
+    "\77\54\24\0\1\163\77\0\5\56\13\0\4\56\2\0"+
+    "\3\56\2\0\3\56\1\0\2\56\2\0\5\56\2\0"+
+    "\6\56\6\0\5\56\1\0\11\56\1\0\17\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\2\165\2\60\1\165"+
+    "\1\0\1\166\11\0\1\165\1\167\2\165\2\0\1\165"+
+    "\1\60\1\165\2\0\3\165\1\0\2\165\2\0\1\165"+
+    "\1\170\2\167\1\171\2\0\2\165\1\171\1\165\1\170"+
+    "\1\165\6\0\5\165\1\0\2\165\1\167\6\165\1\0"+
+    "\20\165\1\172\1\173\1\165\1\0\1\166\11\0\1\165"+
+    "\1\167\2\165\2\0\1\165\1\173\1\165\2\0\3\165"+
+    "\1\0\2\165\2\0\1\174\1\170\2\167\1\171\2\0"+
+    "\2\165\1\171\1\165\1\170\1\165\6\0\5\165\1\0"+
+    "\2\165\1\167\5\165\1\174\1\0\16\165\2\0\2\166"+
+    "\23\0\1\166\105\0\1\175\3\0\1\40\1\176\22\0"+
+    "\1\177\75\0\1\40\1\0\1\40\123\0\1\40\106\0"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\4\57\1\200\4\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\3\57\1\201\2\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\57\1\202\4\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\24\0\1\203\114\0\1\40\7\0"+
+    "\1\204\76\0\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\4\57\1\205"+
+    "\4\57\1\0\16\57\30\77\1\206\1\207\72\77\10\100"+
+    "\1\210\17\100\1\211\1\100\1\212\71\100\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\1\57\1\213"+
+    "\1\57\1\0\1\56\1\57\2\0\5\57\2\0\5\57"+
+    "\1\214\6\0\2\57\1\215\1\216\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\217\2\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\220\1\221\2\57\6\0\4\57"+
+    "\1\56\1\0\4\57\1\222\4\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\223"+
+    "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\5\56\13\0\4\56\2\0\3\56\2\0\3\56\1\0"+
+    "\2\56\2\0\5\56\2\0\6\56\6\0\2\56\1\224"+
+    "\2\56\1\0\11\56\1\0\16\56\15\0\1\40\23\0"+
+    "\1\225\1\226\61\0\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\3\57\1\227\12\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\1\230\2\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\1\231\2\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\232\1\57\1\233"+
+    "\6\0\2\57\1\234\1\57\1\56\1\0\4\57\1\235"+
+    "\4\57\1\0\16\57\15\0\1\40\32\0\1\40\70\0"+
+    "\1\40\33\0\1\40\52\0\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\57\1\236\1\237\1\240\2\57"+
+    "\6\0\4\57\1\56\1\0\1\241\3\57\1\242\1\243"+
+    "\3\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\244\1\245\2\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\4\57\1\246\1\247\6\0"+
+    "\4\57\1\56\1\0\7\57\1\250\1\251\1\0\1\57"+
+    "\1\252\14\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\57\1\253\1\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\2\57\1\253\6\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\250\1\57\1\250\1\254"+
+    "\2\57\6\0\4\57\1\56\1\0\4\57\1\255\4\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\256\2\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\1\257\1\57\1\260\3\57\6\0\1\57"+
+    "\1\261\2\57\1\56\1\0\1\57\1\262\7\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\263\1\57\1\264\3\57\6\0\4\57\1\56\1\0"+
+    "\4\57\1\265\4\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\266\1\267\1\57"+
+    "\6\0\4\57\1\56\1\0\4\57\1\270\4\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\1\57\1\271\1\57\1\0\1\56\1\57\2\0"+
+    "\3\57\1\272\1\57\2\0\5\57\1\273\6\0\4\57"+
+    "\1\56\1\0\6\57\1\274\2\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\275"+
+    "\2\57\1\0\1\56\1\57\2\0\5\57\2\0\1\57"+
+    "\1\276\1\57\1\277\1\300\1\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\2\57\1\301\1\57"+
+    "\1\56\1\0\1\302\10\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\2\57\1\303\3\57"+
+    "\6\0\4\57\1\56\1\0\4\57\1\250\1\304\3\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\57\1\305\1\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\57\1\250\4\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\1\57\1\306\14\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\3\57\1\307"+
+    "\2\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\250"+
+    "\1\57\1\310\3\57\6\0\4\57\1\56\1\0\4\57"+
+    "\1\311\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\3\57\1\312\2\57\6\0\4\57"+
+    "\1\56\1\0\4\57\1\313\4\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\2\57\1\314"+
+    "\3\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\3\57"+
+    "\1\315\2\57\6\0\4\57\1\56\1\0\4\57\1\316"+
+    "\4\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\1\317\2\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\2\57\1\320\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\321\3\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\10\141\1\0\31\141\1\0"+
+    "\3\141\1\0\25\141\2\0\26\141\41\0\1\322\134\0"+
+    "\1\323\15\0\1\324\105\0\1\325\146\0\1\326\26\0"+
+    "\10\147\1\0\35\147\1\0\25\147\2\0\26\147\52\0"+
+    "\1\327\15\0\1\330\105\0\1\331\146\0\1\332\27\0"+
+    "\3\154\1\0\2\154\11\0\4\154\2\0\2\154\3\0"+
+    "\3\154\5\0\6\154\1\0\6\154\6\0\4\154\2\0"+
+    "\11\154\1\0\16\154\17\0\1\333\30\0\1\334\54\0"+
+    "\1\335\3\0\1\335\12\0\4\335\2\0\1\335\4\0"+
+    "\3\335\5\0\5\335\2\0\6\335\6\0\4\335\2\0"+
+    "\11\335\1\0\16\335\25\0\1\336\123\0\1\337\76\0"+
+    "\5\56\13\0\4\56\2\0\3\56\2\0\1\340\2\56"+
+    "\1\0\2\56\2\0\5\56\2\0\6\56\6\0\5\56"+
+    "\1\0\11\56\1\0\16\56\5\165\13\0\4\165\2\0"+
+    "\3\165\2\0\3\165\1\0\2\165\2\0\5\165\2\0"+
+    "\6\165\6\0\5\165\1\0\11\165\1\0\20\165\2\166"+
+    "\1\165\13\0\1\165\1\167\2\165\2\0\1\165\1\166"+
+    "\1\165\2\0\3\165\1\0\2\165\2\0\2\165\2\167"+
+    "\1\171\2\0\2\165\1\171\3\165\6\0\5\165\1\0"+
+    "\2\165\1\167\6\165\1\0\20\165\2\341\1\165\13\0"+
+    "\4\165\2\0\1\165\1\341\1\165\2\0\3\165\1\0"+
+    "\2\165\2\0\5\165\2\342\6\165\6\0\5\165\1\0"+
+    "\11\165\1\0\20\165\2\172\1\165\1\0\1\166\11\0"+
+    "\1\165\1\167\2\165\2\0\1\165\1\172\1\165\2\0"+
+    "\3\165\1\0\2\165\2\0\2\165\2\167\1\171\2\0"+
+    "\2\165\1\171\3\165\6\0\5\165\1\0\2\165\1\167"+
+    "\6\165\1\0\20\165\1\172\1\173\1\165\1\0\1\166"+
+    "\11\0\1\165\1\167\2\165\2\0\1\165\1\173\1\165"+
+    "\2\0\3\165\1\0\2\165\2\0\1\165\1\343\2\167"+
+    "\1\171\2\0\2\165\1\171\1\165\1\343\1\165\6\0"+
+    "\5\165\1\0\2\165\1\167\6\165\1\0\20\165\2\344"+
+    "\1\165\13\0\3\344\1\165\2\0\2\344\1\165\2\0"+
+    "\2\165\1\344\1\0\2\165\2\0\2\165\3\344\2\0"+
+    "\2\165\2\344\2\165\6\0\1\165\1\344\3\165\1\0"+
+    "\2\165\1\344\6\165\1\0\16\165\17\0\1\345\105\0"+
+    "\1\346\3\0\1\346\12\0\4\346\2\0\1\346\4\0"+
+    "\3\346\5\0\5\346\2\0\6\346\6\0\1\347\3\346"+
+    "\2\0\11\346\1\0\16\346\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\4\57\1\350\1\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\351\5\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\57\1\352\4\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\25\0\1\353"+
+    "\113\0\1\40\7\0\1\67\76\0\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\4\57\1\354\4\57\1\0\16\57\3\355\1\77"+
+    "\4\355\1\0\16\355\4\77\1\356\2\77\10\355\1\77"+
+    "\3\355\2\77\50\355\30\210\1\357\1\210\1\360\74\210"+
+    "\1\100\4\210\1\0\16\210\4\100\1\361\2\100\10\210"+
+    "\1\100\3\210\2\100\50\210\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\362\1\57\1\363\1\57"+
+    "\6\0\4\57\1\56\1\0\2\57\1\364\6\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\250\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\57\1\365\1\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\2\57"+
+    "\1\366\6\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\4\57\1\367\1\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\1\57\1\370\6\57\1\371\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\372\5\57"+
+    "\6\0\4\57\1\56\1\0\6\57\1\373\2\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\250\5\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\374\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\5\56\13\0\4\56\2\0\3\56\2\0"+
+    "\1\56\1\375\1\56\1\0\2\56\2\0\5\56\2\0"+
+    "\6\56\6\0\5\56\1\0\11\56\1\0\16\56\42\0"+
+    "\1\376\61\0\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\1\57"+
+    "\1\377\3\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\1\57\1\u0100\1\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\1\57\1\u0101\1\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\4\57\1\u0102\1\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\1\57"+
+    "\1\u0103\2\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\57"+
+    "\1\u0104\1\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\57"+
+    "\1\u0105\4\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\1\u0106\2\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u0107\2\57\6\0\4\57\1\56\1\0"+
+    "\5\57\1\250\3\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\4\57\1\u0108\1\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\1\57\1\u0109\4\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u010a"+
+    "\4\57\6\0\2\57\1\u010b\1\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\1\u010c\15\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\3\57\1\u010d\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\u010e\5\57\6\0\4\57\1\56\1\0\6\57"+
+    "\1\u010f\2\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\1\57\1\u0110\1\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\5\57\1\214\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\1\57\1\u0111"+
+    "\2\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\1\u0112\5\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\3\57\1\u0113\2\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\2\57\1\250\6\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\2\57\1\u0114\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\3\57"+
+    "\1\u0115\2\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\3\57\1\u0116\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\3\57\1\u0117\2\57\6\0\4\57\1\56\1\0\4\57"+
+    "\1\u0118\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\u0119\5\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\57\1\u011a\4\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\2\57\1\u011b"+
+    "\1\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\1\57\1\u011c\4\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\4\57\1\u011d"+
+    "\1\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\1\u011e\2\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\u011f"+
+    "\3\57\1\u0113\1\214\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u0120\2\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\1\57\1\u0121\1\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\u0122\5\57\6\0\1\57\1\u0123"+
+    "\2\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\2\57\1\u0124\2\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\2\57\1\u0125\2\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\4\57"+
+    "\1\u0126\11\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\3\57\1\u0127\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\2\57\1\u0128\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\2\57\1\u0129\3\57\6\0\2\57\1\u012a\1\57"+
+    "\1\56\1\0\4\57\1\u012b\4\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u012c"+
+    "\4\57\6\0\1\57\1\u012d\2\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u012e\2\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\1\u012f\5\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\2\57\1\u0130\1\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\3\57\1\u0131\1\57\2\0\4\57\1\u0132\1\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\57"+
+    "\1\u0133\1\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\1\u0134\3\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u0135\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\10\57\1\u0136\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\u0137\5\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\u0138\5\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\57\1\250\4\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\2\57\1\253\1\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\5\57"+
+    "\1\u0139\3\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\u013a\5\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\1\u013b\2\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\1\57\1\u013c\14\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\4\57\1\u013d\1\57"+
+    "\6\0\4\57\1\56\1\0\6\57\1\u013e\2\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\6\57"+
+    "\1\u013f\7\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\1\57\1\u0140\2\57\1\56\1\0"+
+    "\11\57\1\0\16\57\71\0\1\u0141\110\0\1\u0142\117\0"+
+    "\1\u0143\146\0\1\u0144\117\0\1\u0145\110\0\1\u0146\117\0"+
+    "\1\u0147\146\0\1\u0148\46\0\1\u0149\153\0\1\u014a\54\0"+
+    "\3\335\1\0\2\335\11\0\4\335\2\0\2\335\3\0"+
+    "\3\335\5\0\6\335\1\0\6\335\6\0\4\335\2\0"+
+    "\11\335\1\0\16\335\2\56\2\u014b\1\56\13\0\3\u014b"+
+    "\1\56\2\0\2\u014b\1\56\2\0\2\56\1\u014b\1\0"+
+    "\2\56\2\0\2\56\3\u014b\2\0\2\56\2\u014b\2\56"+
+    "\6\0\1\56\1\u014b\3\56\1\0\2\56\1\u014b\6\56"+
+    "\1\0\16\56\2\165\2\341\1\165\13\0\1\165\1\167"+
+    "\2\165\2\0\1\165\1\341\1\165\2\0\3\165\1\0"+
+    "\2\165\2\0\2\165\2\167\1\165\2\0\6\165\6\0"+
+    "\5\165\1\0\2\165\1\167\6\165\1\0\16\165\2\0"+
+    "\2\341\23\0\1\341\74\0\2\165\2\344\1\165\13\0"+
+    "\3\344\1\165\2\0\2\344\1\165\2\0\2\165\1\344"+
+    "\1\0\2\165\2\0\1\165\1\343\3\344\2\0\2\165"+
+    "\2\344\1\343\1\165\6\0\1\165\1\344\3\165\1\0"+
+    "\2\165\1\344\6\165\1\0\16\165\20\0\1\u014c\104\0"+
+    "\3\346\1\0\1\u014d\1\346\11\0\4\346\2\0\2\346"+
+    "\3\0\3\346\5\0\6\346\1\0\6\346\6\0\4\346"+
+    "\2\0\11\346\1\0\16\346\1\0\3\346\1\0\1\u014d"+
+    "\1\346\11\0\4\346\2\0\2\346\3\0\3\346\5\0"+
+    "\6\346\1\0\6\346\6\0\1\346\1\u014e\2\346\2\0"+
+    "\11\346\1\0\16\346\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\4\57"+
+    "\1\u014f\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u0139\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\314\2\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\4\57\1\u0150\1\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\30\355"+
+    "\1\u0151\1\u0152\74\355\2\u0153\14\355\3\u0153\3\355\2\u0153"+
+    "\1\u0151\1\u0152\3\355\1\u0153\7\355\3\u0153\4\355\2\u0153"+
+    "\11\355\1\u0153\6\355\1\u0153\25\355\10\210\1\0\115\210"+
+    "\2\u0154\14\210\3\u0154\3\210\2\u0154\1\357\1\210\1\360"+
+    "\2\210\1\u0154\7\210\3\u0154\4\210\2\u0154\11\210\1\u0154"+
+    "\6\210\1\u0154\25\210\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\5\57\1\247\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\4\57"+
+    "\1\u0155\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u0156\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\u0139\5\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\u0157\2\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\4\57\1\250\1\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\4\57\1\u0158"+
+    "\1\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\u0159"+
+    "\5\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\2\57\1\u015a\1\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\u015b\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u015c\2\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\5\56\13\0\4\56\2\0\3\56"+
+    "\2\0\3\56\1\0\2\56\2\0\5\56\2\0\6\56"+
+    "\6\0\1\56\1\u015d\3\56\1\0\11\56\1\0\16\56"+
+    "\41\0\1\u015e\62\0\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\1\u015f\3\57\1\56\1\0"+
+    "\11\57\1\0\4\57\1\u0160\11\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\1\57\1\u0161"+
+    "\2\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\1\57"+
+    "\1\u0162\2\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\5\57\1\u0106"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\4\57\1\u0163\4\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\3\57"+
+    "\1\u0164\2\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\u0165\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u0166\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\1\57\1\u0167\2\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\4\57\1\u0168\1\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\1\u0169\15\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\4\57"+
+    "\1\u016a\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\5\57\1\250\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\1\u016b\15\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u016c\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\1\u016d\2\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\4\57\1\u016e\4\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\2\57\1\u016f\6\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\3\57\1\u0170"+
+    "\2\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u0171\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\4\57\1\u0172\1\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\2\57\1\367\3\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\2\57"+
+    "\1\u0173\6\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\312\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\u0174\1\u0175\4\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\3\57"+
+    "\1\u0176\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\10\57\1\u0177\5\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\4\57\1\u0178\4\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\u011f"+
+    "\5\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\2\57\1\u0179\1\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\u0100\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\57\1\u017a\1\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\1\57\1\u012f\2\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\5\57\1\u010b\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\u017b\4\57\1\222\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\2\57\1\u017c\3\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\4\57\1\u017d\1\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u017e"+
+    "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\2\57\1\u017f\1\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\3\57\1\u0180\2\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\4\57\1\u0181\1\57\6\0\4\57\1\56\1\0"+
+    "\4\57\1\u0182\4\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\4\57\1\u0174\1\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\1\57\1\u0159\14\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\57"+
+    "\1\u0183\1\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\1\57"+
+    "\1\u0184\14\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\u0185\5\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\5\57\1\u0186\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\3\57\1\u0187"+
+    "\5\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\5\57"+
+    "\1\u0172\3\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\1\250\10\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\4\57\1\214\1\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\u0188\2\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\2\57\1\u0189\3\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\3\57\1\u018a"+
+    "\2\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\4\57"+
+    "\1\u018b\1\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\57\1\u018c\4\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\5\57\1\u018d\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\3\57\1\u018e\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\7\57\1\u018f\1\u0177\1\u0190\4\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\4\57\1\u0191\4\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\1\u0139\10\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\5\57\1\351"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\2\57\1\u0192\1\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\4\57"+
+    "\1\u0139\1\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\2\57\1\u0193\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\u0194\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\350\5\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\5\0\1\u0195\172\0\1\u0141\140\0\1\u0196"+
+    "\40\0\1\u0197\122\0\1\u0198\172\0\1\u0145\140\0\1\u0199"+
+    "\40\0\1\u019a\136\0\1\u019b\102\0\2\56\2\u019c\1\56"+
+    "\13\0\3\u019c\1\56\2\0\2\u019c\1\56\2\0\2\56"+
+    "\1\u019c\1\0\2\56\2\0\2\56\3\u019c\2\0\2\56"+
+    "\2\u019c\2\56\6\0\1\56\1\u019c\3\56\1\0\2\56"+
+    "\1\u019c\6\56\1\0\16\56\21\0\1\u019d\103\0\3\346"+
+    "\1\0\1\u014d\1\346\11\0\4\346\2\0\2\346\3\0"+
+    "\3\346\5\0\6\346\1\0\6\346\6\0\1\347\3\346"+
+    "\2\0\11\346\1\0\16\346\1\0\3\346\1\0\1\u014d"+
+    "\1\346\11\0\4\346\2\0\2\346\3\0\3\346\5\0"+
+    "\6\346\1\0\1\346\1\u019e\4\346\6\0\4\346\2\0"+
+    "\11\346\1\0\16\346\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\1\57\1\u0139\4\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u019f\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\10\355\1\0\115\355"+
+    "\2\u01a0\14\355\3\u01a0\3\355\2\u01a0\1\u0151\1\u0152\3\355"+
+    "\1\u01a0\7\355\3\u01a0\4\355\2\u01a0\11\355\1\u01a0\6\355"+
+    "\1\u01a0\25\355\2\210\2\u01a1\14\210\3\u01a1\3\210\2\u01a1"+
+    "\1\357\1\210\1\360\2\210\1\u01a1\7\210\3\u01a1\4\210"+
+    "\2\u01a1\11\210\1\u01a1\6\210\1\u01a1\25\210\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\3\57\1\u01a2\2\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\3\57\1\u01a3\1\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\u01a4"+
+    "\5\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\2\57\1\u01a5\1\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\2\57\1\u01a6"+
+    "\2\57\2\0\6\57\6\0\1\u01a7\3\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\1\57\1\214\14\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\5\57\1\u01a8\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\3\57\1\250\5\57\1\0\16\57\5\56\13\0\4\56"+
+    "\2\0\3\56\2\0\3\56\1\0\2\56\2\0\5\56"+
+    "\2\0\4\56\1\u01a9\1\56\6\0\5\56\1\0\11\56"+
+    "\1\0\17\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\4\57\1\u01aa\4\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\4\57\1\u01ab"+
+    "\4\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\1\u01ac\5\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\1\u01ad\5\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\6\57"+
+    "\1\u01ae\2\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\4\57\1\u01af\1\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\54\0\1\u01b0\47\0"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u0172\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\3\57\1\u01b1\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\u01b2\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\1\57\1\250"+
+    "\7\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\4\57\1\u01b3\1\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\4\57\1\u01b4\4\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\57\1\u01b5\4\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\1\57\1\u01b6\14\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\4\57\1\u01b7\4\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\3\57\1\u0167\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\1\57\1\u01b8\1\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\3\57"+
+    "\1\u01b9\3\57\1\u01ba\6\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\2\57\1\u01bb\1\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\u01bc\5\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\1\57\1\u01bd\1\u01be\1\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u01bf"+
+    "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\4\57"+
+    "\1\u0113\1\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\1\57\1\u01c0\1\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\2\57\1\u0139"+
+    "\6\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\2\57\1\u01c1\1\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\57\1\u01c2\4\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\1\u01c3\2\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\u01c4\2\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\1\57\1\u01c5"+
+    "\1\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\4\57\1\u0172\11\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u01c6\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\57\1\222\4\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\u01c7\5\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u0189\2\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\u01c8\3\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u01c9\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\u01ca\2\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\1\u01cb\2\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\1\214\5\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\6\57\1\u0174\2\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\2\57\1\u01cc\1\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\57"+
+    "\1\u01cd\4\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\1\57\1\261\2\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\2\57\1\u01ce\1\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\u01cf\3\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\12\57\1\u01d0\3\57\1\56\4\57\13\0"+
+    "\2\57\1\u01d1\1\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\2\57\1\u01d2\3\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\2\57\1\u014f"+
+    "\3\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\1\57\1\365\2\57\1\56\1\0\11\57\1\0"+
+    "\16\57\41\0\1\u01d3\67\0\1\u0195\51\0\1\u0141\45\0"+
+    "\3\u0197\3\u01d4\4\0\5\u01d4\4\u0197\1\u01d4\1\0\2\u0197"+
+    "\1\0\1\u01d4\1\0\3\u0197\1\0\1\u01d4\2\u0197\1\u01d4"+
+    "\5\u0197\2\u01d4\6\u0197\1\0\1\u01d4\1\0\3\u01d4\4\u0197"+
+    "\2\u01d4\11\u0197\1\0\16\u0197\41\0\1\u01d5\67\0\1\u0198"+
+    "\51\0\1\u0145\45\0\3\u019a\3\u01d6\4\0\5\u01d6\4\u019a"+
+    "\1\u01d6\1\0\2\u019a\1\0\1\u01d6\1\0\3\u019a\1\0"+
+    "\1\u01d6\2\u019a\1\u01d6\5\u019a\2\u01d6\6\u019a\1\0\1\u01d6"+
+    "\1\0\3\u01d6\4\u019a\2\u01d6\11\u019a\1\0\16\u019a\22\0"+
+    "\1\u01d7\101\0\2\56\2\u01d8\1\56\13\0\3\u01d8\1\56"+
+    "\2\0\2\u01d8\1\56\2\0\2\56\1\u01d8\1\0\2\56"+
+    "\2\0\2\56\3\u01d8\2\0\2\56\2\u01d8\2\56\6\0"+
+    "\1\56\1\u01d8\3\56\1\0\2\56\1\u01d8\6\56\1\0"+
+    "\16\56\22\0\1\u01d9\102\0\3\346\1\0\1\u014d\1\346"+
+    "\11\0\4\346\2\0\2\346\3\0\3\346\5\0\6\346"+
+    "\1\0\6\346\6\0\2\346\1\u01da\1\346\2\0\11\346"+
+    "\1\0\16\346\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u01db\2\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\2\355\2\u01dc\14\355\3\u01dc\3\355"+
+    "\2\u01dc\1\u0151\1\u0152\3\355\1\u01dc\7\355\3\u01dc\4\355"+
+    "\2\u01dc\11\355\1\u01dc\6\355\1\u01dc\25\355\2\210\2\u01dd"+
+    "\14\210\3\u01dd\3\210\2\u01dd\1\357\1\210\1\360\2\210"+
+    "\1\u01dd\7\210\3\u01dd\4\210\2\u01dd\11\210\1\u01dd\6\210"+
+    "\1\u01dd\25\210\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\2\57\1\u01de"+
+    "\6\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\2\57\1\u01df\1\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u01e0\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\1\57\1\u0167\1\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\1\57\1\u01e1\4\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\1\57\1\u01e2\2\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\3\57\1\u01e3\1\56\1\0\11\57\1\0\16\57"+
+    "\5\56\13\0\4\56\2\0\3\56\2\0\1\u01e4\2\56"+
+    "\1\0\2\56\2\0\5\56\2\0\6\56\6\0\5\56"+
+    "\1\0\11\56\1\0\17\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\1\57\1\u01e5\2\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\2\57\1\351\6\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\2\57\1\u01e6"+
+    "\1\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\2\57"+
+    "\1\u01e7\1\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\6\57\1\u01e8\2\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\4\57"+
+    "\1\u01e9\1\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\55\0\1\u01ea\46\0\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\3\57\1\u01eb\2\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\u01ec\5\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\2\57\1\u01ed\3\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\3\57\1\250\1\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\57"+
+    "\1\250\1\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u01ee\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\6\57\1\u0172\2\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\2\57\1\u010b"+
+    "\6\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\4\57"+
+    "\1\u01ef\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\3\57\1\u01f0\2\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\1\57\1\250"+
+    "\2\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\1\57\1\u01bd\2\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u01f1"+
+    "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\4\57"+
+    "\1\u01f2\1\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\4\57\1\u01f3\4\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\1\u0139\15\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\57\1\u01f4\1\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\1\57\1\u01f5\1\57\1\0\1\56"+
+    "\1\57\2\0\3\57\1\u01e3\1\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\2\57\1\214\6\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\6\57\1\u01f6\2\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\2\57\1\u01f7\1\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\6\57\1\u01f8\2\57"+
+    "\1\0\16\57\1\56\4\57\13\0\2\57\1\u01f9\1\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\4\57\1\u01fa\11\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\1\57\1\u01fb"+
+    "\2\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\2\57\1\u01fc\2\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\13\57\1\u01fd"+
+    "\2\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\1\214"+
+    "\15\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\4\57\1\222\1\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\3\57\1\u01fe\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\2\57\1\u01c3\1\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\6\57"+
+    "\1\u01ff\2\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\57\1\u0200\4\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\1\57\1\u0172\3\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\1\57\1\u0201"+
+    "\1\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\1\u0202\3\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\41\0"+
+    "\1\u0197\123\0\1\u019a\105\0\1\u0203\100\0\2\56\2\57"+
+    "\1\56\13\0\3\57\1\56\2\0\2\57\1\56\2\0"+
+    "\2\56\1\57\1\0\2\56\2\0\2\56\3\57\2\0"+
+    "\2\56\2\57\2\56\6\0\1\56\1\57\3\56\1\0"+
+    "\2\56\1\57\6\56\1\0\16\56\23\0\1\u0204\101\0"+
+    "\3\346\1\0\1\u014d\1\346\11\0\4\346\2\0\2\346"+
+    "\3\0\3\346\5\0\6\346\1\0\6\346\6\0\3\346"+
+    "\1\u0205\2\0\11\346\1\0\16\346\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\1\57\1\u0139\1\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\2\355\2\77"+
+    "\14\355\3\77\3\355\2\77\1\u0151\1\u0152\3\355\1\77"+
+    "\7\355\3\77\4\355\2\77\11\355\1\77\6\355\1\77"+
+    "\25\355\2\210\2\100\14\210\3\100\3\210\2\100\1\357"+
+    "\1\210\1\360\2\210\1\100\7\210\3\100\4\210\2\100"+
+    "\11\210\1\100\6\210\1\100\25\210\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\3\57\1\u01b9\12\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\1\57\1\u0206"+
+    "\1\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\2\57\1\u0207\1\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\3\57"+
+    "\1\u0208\2\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\u01a5\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u0209\2\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\5\56\13\0\4\56\2\0\3\56"+
+    "\2\0\3\56\1\0\2\56\2\0\5\56\2\0\6\56"+
+    "\6\0\5\56\1\0\2\56\1\u020a\6\56\1\0\17\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\3\57\1\u020b\5\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\4\57\1\u01db\4\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\4\57\1\u01b5\4\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u020c\2\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\5\57"+
+    "\1\250\3\57\1\0\16\57\67\0\1\u020d\34\0\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u020e"+
+    "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\10\57\1\u020f"+
+    "\5\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\14\57"+
+    "\1\u0210\1\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\3\57\1\u0211\12\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\1\57\1\u0212\14\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\57\1\u0213\4\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\u0214\2\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\4\57\1\u0215\1\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\3\57\1\u0216\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\214"+
+    "\2\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\3\57\1\367"+
+    "\2\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u0217\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\u0167\5\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\u0218\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\5\57\1\u0219\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\u01b7\2\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\u0206\5\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\4\57\1\u021a\1\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\1\57\1\u021b\1\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\4\57\1\u021c\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u021d\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\5\57\1\u021e\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\2\57\1\u021f\6\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\4\57\1\u0220\1\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\22\0"+
+    "\1\u0221\123\0\1\u0222\102\0\3\346\1\0\1\u014d\1\346"+
+    "\11\0\4\346\2\0\2\346\3\0\3\346\5\0\6\346"+
+    "\1\0\1\u0223\5\346\6\0\4\346\2\0\11\346\1\0"+
+    "\16\346\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\253\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\3\57"+
+    "\1\u0224\1\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\6\57"+
+    "\1\u0167\2\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\1\57\1\214\2\57"+
+    "\1\56\1\0\11\57\1\0\16\57\5\56\13\0\4\56"+
+    "\2\0\3\56\2\0\3\56\1\0\2\56\2\0\5\56"+
+    "\2\0\2\56\1\u0225\3\56\6\0\5\56\1\0\11\56"+
+    "\1\0\17\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\365\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\57\1\u0226\1\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\74\0\1\u0227\27\0\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\1\u0228\15\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\3\57\1\u0229\2\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\2\57\1\u022a\1\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\4\57\1\u022b\4\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\2\57\1\u022c\1\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\2\57\1\u022d\1\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\1\u0172\15\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\1\u022e\3\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\u022f\3\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\1\57\1\u0230\3\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\1\57\1\u0231\1\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\1\u0232\1\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\4\57\1\u0233\4\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\u0172\5\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\1\57\1\u0234\14\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\57"+
+    "\1\u0172\4\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\2\57\1\u0235\1\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\1\u0236\3\57\1\56\1\0\11\57"+
+    "\1\0\10\57\1\u0237\5\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\2\57\1\u0238\1\57"+
+    "\1\56\1\0\11\57\1\0\16\57\17\0\1\u0239\123\0"+
+    "\1\353\105\0\3\346\1\0\1\u014d\1\346\1\u023a\2\0"+
+    "\1\u023a\5\0\4\346\1\0\1\u023b\2\346\3\0\3\346"+
+    "\5\0\6\346\1\0\6\346\6\0\4\346\2\0\11\346"+
+    "\1\u023a\16\346\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\u023c\5\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\2\57\1\u0172"+
+    "\6\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\222\3\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\u023d\5\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\1\u023e\15\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\1\57\1\u023f\14\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\2\57\1\u0240\3\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\3\57\1\u0241\2\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\4\57\1\u0242\4\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\57"+
+    "\1\u0243\4\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\4\57\1\u0244\4\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\u010b\5\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\2\57\1\u0245\1\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\3\57\1\u021b\2\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u0246\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\4\57\1\u0247\4\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\1\u0248\5\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\4\57\1\300\1\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\3\57\1\u0139\1\56\1\0\11\57\1\0\16\57\7\0"+
+    "\1\u023a\2\0\1\u023a\12\0\1\u023b\57\0\1\u023a\16\0"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u0249\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\1\u0172\10\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\1\u024a\10\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\2\57\1\u024b\1\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\4\57\1\u01fa\11\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\2\57\1\u024c\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\1\u024d\2\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\1\u012e\5\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\3\57\1\u024e\2\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\u024f\5\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\1\57\1\222\1\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\1\57\1\u0172\1\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\4\57\1\u0250\4\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u0251"+
+    "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\15\57\1\u0252"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u0253\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\4\57\1\u0254\1\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\57\1\u0255\1\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\2\57"+
+    "\1\u0206\6\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\6\57\1\u0256\2\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\3\57\1\u0172"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\4\57\1\u0257\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\1\u0258\2\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\1\u0259\3\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\2\57\1\u025a\3\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\2\57\1\u025b\6\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\3\57\1\u025c"+
+    "\2\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\1\57\1\u025d"+
+    "\14\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\3\57\1\u025e\2\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\4\57\1\u025f\1\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\5\57\1\u0240\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\5\57\1\u0172\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\3\57\1\u0240\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\u01fd\3\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\4\57\1\u0260\1\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\2\57\1\u0250"+
+    "\1\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\2\57"+
+    "\1\u0243\1\57\1\56\1\0\11\57\1\0\16\57";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[47124];
+    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 =
+    "\5\0\2\1\1\0\2\1\4\0\2\1\1\11\4\1"+
+    "\1\11\2\1\1\11\2\1\2\11\2\1\4\11\2\1"+
+    "\1\11\1\1\4\11\7\1\1\11\2\1\1\11\1\1"+
+    "\1\11\13\1\1\11\35\1\1\11\5\1\1\11\6\1"+
+    "\2\11\1\0\1\11\1\0\11\1\3\0\3\1\1\0"+
+    "\3\1\1\11\2\1\1\11\12\1\1\11\74\1\1\11"+
+    "\12\0\1\1\2\11\2\1\1\0\2\1\3\0\3\1"+
+    "\1\11\4\1\1\11\15\1\1\0\102\1\11\0\1\11"+
+    "\1\1\3\0\3\1\1\11\13\1\1\11\6\1\1\0"+
+    "\57\1\2\0\1\1\2\0\1\1\1\0\1\1\2\0"+
+    "\21\1\1\0\42\1\5\0\1\1\2\0\17\1\1\0"+
+    "\30\1\3\0\7\1\1\0\23\1\3\0\3\1\1\11"+
+    "\21\1\1\11\1\0\1\11\45\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[608];
+    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;
+
+  /* user code: */
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line with an unclosed XML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG						= -3;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line with an unclosed Script tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG_SCRIPT				= -4;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in the middle of a double-quoted attribute in a Script
+	 * tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT	= -5;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in the middle of a single-quoted attribute in a Script
+	 * tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT	= -6;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in an ActionScript code block (text content inside a
+	 * Script tag).
+	 */
+	public static final int INTERNAL_IN_AS						= -7;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in an MLC in an ActionScript code block (text content
+	 * inside a Script tag).
+	 */
+	public static final int INTERNAL_IN_AS_MLC					= -8;
+
+	/**
+	 * Whether closing markup tags are automatically completed for HTML.
+	 */
+	private static boolean completeCloseTags;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public MxmlTokenMaker() {
+	}
+
+
+	static {
+		completeCloseTags = true;
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns whether markup close tags should be completed.  For XML, the
+	 * default value is <code>true</code>.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Static version of {@link #getCompleteCloseTags()}.  This hack is
+	 * unfortunately needed for applications to be able to query this value
+	 * without instantiating this class.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public static boolean getCompleteCloseMarkupTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Always returns <tt>false</tt>, as you never want "mark occurrences"
+	 * working in XML files.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	/**
+	 * 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) {
+			case Token.MARKUP_COMMENT:
+				state = COMMENT;
+				start = text.offset;
+				break;
+			case Token.MARKUP_DTD:
+				state = DTD;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				start = text.offset;
+				break;
+			case Token.MARKUP_PROCESSING_INSTRUCTION:
+				state = PI;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_AS:
+				state = AS;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_AS_MLC:
+				state = AS_MLC;
+				start = text.offset;
+				break;
+			case Token.MARKUP_CDATA:
+				state = CDATA;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 MxmlTokenMaker(java.io.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 MxmlTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 190) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 58: break;
+        case 52: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 59: break;
+        case 29: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_AS); return firstToken;
+          }
+        case 60: break;
+        case 50: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 61: break;
+        case 34: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 62: break;
+        case 24: 
+          { addEndToken(INTERNAL_IN_AS); return firstToken;
+          }
+        case 63: break;
+        case 19: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT);
+          }
+        case 64: break;
+        case 13: 
+          { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 65: break;
+        case 26: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 66: break;
+        case 38: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 67: break;
+        case 53: 
+          { addToken(Token.FUNCTION);
+          }
+        case 68: break;
+        case 43: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(INTAG);
+          }
+        case 69: break;
+        case 31: 
+          { start = zzMarkedPos-2; yybegin(DTD);
+          }
+        case 70: break;
+        case 27: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 71: break;
+        case 21: 
+          { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 72: break;
+        case 56: 
+          { addToken(Token.MARKUP_CDATA_DELIMITER); start = zzMarkedPos; yybegin(CDATA);
+          }
+        case 73: break;
+        case 22: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 74: break;
+        case 4: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+          }
+        case 75: break;
+        case 28: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_AS_MLC); return firstToken;
+          }
+        case 76: break;
+        case 46: 
+          { addToken(Token.MARKUP_CDATA_DELIMITER);
+          }
+        case 77: break;
+        case 45: 
+          { int temp=zzStartRead; yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.MARKUP_CDATA_DELIMITER);
+          }
+        case 78: break;
+        case 17: 
+          { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 79: break;
+        case 37: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 80: break;
+        case 32: 
+          { start = zzMarkedPos-2; yybegin(PI);
+          }
+        case 81: break;
+        case 15: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+          }
+        case 82: break;
+        case 42: 
+          { yybegin(AS); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 83: break;
+        case 7: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+          }
+        case 84: break;
+        case 9: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+          }
+        case 85: break;
+        case 36: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 86: break;
+        case 8: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+          }
+        case 87: break;
+        case 20: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT);
+          }
+        case 88: break;
+        case 41: 
+          { start = zzMarkedPos-2; yybegin(AS_MLC);
+          }
+        case 89: break;
+        case 16: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */
+          }
+        case 90: break;
+        case 5: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 91: break;
+        case 30: 
+          { int count = yylength();
+									String tag = yytext(); // Get before addToken calls
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									if (tag.endsWith(":Script") || tag.equals("<Script")) {
+										yybegin(INTAG_SCRIPT);
+									}
+									else {
+										yybegin(INTAG);
+									}
+          }
+        case 92: break;
+        case 48: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 93: break;
+        case 23: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 94: break;
+        case 14: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+          }
+        case 95: break;
+        case 11: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 96: break;
+        case 33: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION);
+          }
+        case 97: break;
+        case 6: 
+          { addToken(Token.MARKUP_ENTITY_REFERENCE);
+          }
+        case 98: break;
+        case 44: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT);
+          }
+        case 99: break;
+        case 40: 
+          { start = zzMarkedPos-2; yybegin(AS_EOL_COMMENT);
+          }
+        case 100: break;
+        case 49: 
+          { start = zzMarkedPos-4; yybegin(COMMENT);
+          }
+        case 101: break;
+        case 39: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 102: break;
+        case 54: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 103: break;
+        case 25: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 104: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 105: break;
+        case 10: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD);
+          }
+        case 106: break;
+        case 18: 
+          { yybegin(AS); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 107: break;
+        case 12: 
+          { addToken(Token.OPERATOR);
+          }
+        case 108: break;
+        case 35: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 109: break;
+        case 55: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 110: break;
+        case 51: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 111: break;
+        case 57: 
+          { int origStart = zzStartRead;
+								  String text = yytext();
+								  int tagNameEnd = text.length() - 2; // "-1" is '>'
+								  while (Character.isWhitespace(text.charAt(tagNameEnd))) {
+								      tagNameEnd--;
+								  }
+								  int tagNameLen = tagNameEnd - 1;
+								  yybegin(YYINITIAL);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(origStart+2,origStart+2+tagNameLen-1, Token.MARKUP_TAG_NAME);
+								  if (tagNameEnd<text.length()-2) {
+								      addToken(origStart+tagNameEnd+1, zzMarkedPos-2, Token.WHITESPACE);
+								  }
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 112: break;
+        case 47: 
+          { addToken(Token.ERROR_STRING_DOUBLE);
+          }
+        case 113: break;
+        case 1: 
+          { 
+          }
+        case 114: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case AS_EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_AS); return firstToken;
+            }
+            case 609: break;
+            case AS_MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_AS_MLC); return firstToken;
+            }
+            case 610: break;
+            case INTAG_SCRIPT: {
+              addToken(start,zzStartRead-1, INTERNAL_INTAG_SCRIPT); return firstToken;
+            }
+            case 611: break;
+            case INATTR_DOUBLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 612: break;
+            case CDATA: {
+              addToken(start,zzStartRead-1, Token.MARKUP_CDATA); return firstToken;
+            }
+            case 613: break;
+            case INATTR_SINGLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 614: break;
+            case DTD: {
+              addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+            }
+            case 615: break;
+            case INATTR_SINGLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+            }
+            case 616: break;
+            case INATTR_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+            }
+            case 617: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 618: break;
+            case AS: {
+              addEndToken(INTERNAL_IN_AS); return firstToken;
+            }
+            case 619: break;
+            case INTAG: {
+              addToken(start,zzStartRead-1, INTERNAL_INTAG); return firstToken;
+            }
+            case 620: break;
+            case COMMENT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+            }
+            case 621: break;
+            case PI: {
+              addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+            }
+            case 622: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/NSISTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/NSISTokenMaker.flex
new file mode 100644
index 0000000..e7af3dd
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/NSISTokenMaker.flex
@@ -0,0 +1,745 @@
+/*
+ * 07/14/2014
+ *
+ * NSISTokenMaker.java - Scanner for NSIS installer scripts.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for NSIS installer scripts.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated NSISTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ *
+ */
+%%
+
+%public
+%class NSISTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public NSISTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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 = YYINITIAL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR_LITERAL;
+				break;
+			case Token.LITERAL_BACKQUOTE:
+				state = BACKTICKS;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				break;
+		}
+
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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])
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({LetterOrUnderscore}|[$/])
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+MLCBegin					= ("/*")
+MLCEnd						= ("*/")
+LineCommentBegin			= ([;#])
+
+IntegerLiteral				= (({NonzeroDigit}{Digit}*)|"0")
+HexLiteral					= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+ErrorNumberFormat			= (({IntegerLiteral}|{HexLiteral}){NonSeparator}+)
+BooleanLiteral				= ("true"|"false")
+
+Separator					= ([\(\)\{\}\[\]])
+Separator2				= ([\;,.])
+
+NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator			= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+Operator					= ({NonAssignmentOperator}|{AssignmentOperator})
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+VariableStart			= ("$")
+Variable				= ({VariableStart}({Identifier}|"{"{Identifier}"}"))
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state STRING
+%state CHAR_LITERAL
+%state BACKTICKS
+%state MLC
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"function" |
+	"functionend" |
+	"section" |
+	"sectionend" |
+	"subsection" |
+	"subsectionend"				{ addToken(Token.RESERVED_WORD); }
+
+	/* Instructions */
+	"addbrandingimage" |
+	"addsize" |
+	"allowrootdirinstall" |
+	"allowskipfiles" |
+	"autoclosewindow" |
+	"bggradient" |
+	"brandingtext" |
+	"bringtofront" |
+	"callinstdll" |
+	"caption" |
+	"changeui" |
+	"checkbitmap" |
+	"completedtext" |
+	"componenttext" |
+	"copyfiles" |
+	"crccheck" |
+	"createdirectory" |
+	"createfont" |
+	"createshortcut" |
+	"delete" |
+	"deleteinisec" |
+	"deleteinistr" |
+	"deleteregkey" |
+	"deleteregvalue" |
+	"detailprint" |
+	"detailsbuttontext" |
+	"dirshow" |
+	"dirtext" |
+	"enumregkey" |
+	"enumregvalue" |
+	"exch" |
+	"exec" |
+	"execshell" |
+	"execwait" |
+	"expandenvstrings" |
+	"file" |
+	"fileclose" |
+	"fileerrortext" |
+	"fileopen" |
+	"fileread" |
+	"filereadbyte" |
+	"fileseek" |
+	"filewrite" |
+	"filewritebyte" |
+	"findclose" |
+	"findfirst" |
+	"findnext" |
+	"findwindow" |
+	"flushini" |
+	"getcurinsttype" |
+	"getcurrentaddress" |
+	"getdlgitem" |
+	"getdllversion" |
+	"getdllversionlocal" |
+	"getfiletime" |
+	"getfiletimelocal" |
+	"getfullpathname" |
+	"getfunctionaddress" |
+	"getlabeladdress" |
+	"gettempfilename" |
+	"getwindowtext" |
+	"hidewindow" |
+	"icon" |
+	"initpluginsdir" |
+	"installbuttontext" |
+	"installcolors" |
+	"installdir" |
+	"installdirregkey" |
+	"instprogressflags" |
+	"insttype" |
+	"insttypegettext" |
+	"insttypesettext" |
+	"intfmt" |
+	"intop" |
+	"langstring" |
+	"langstringup" |
+	"licensebkcolor" |
+	"licensedata" |
+	"licenseforceselection" |
+	"licensetext" |
+	"loadlanguagefile" |
+	"loadlanguagefile" |
+	"logset" |
+	"logtext" |
+	"miscbuttontext" |
+	"name" |
+	"nop" |
+	"outfile" |
+	"page" |
+	"plugindir" |
+	"pop" |
+	"push" |
+	"readenvstr" |
+	"readinistr" |
+	"readregdword" |
+	"readregstr" |
+	"regdll" |
+	"rename" |
+	"requestexecutionlevel" |
+	"reservefile" |
+	"rmdir" |
+	"searchpath" |
+	"sectiongetflags" |
+	"sectiongetinsttypes" |
+	"sectiongetsize" |
+	"sectiongettext" |
+	"sectionin" |
+	"sectionsetflags" |
+	"sectionsetinsttypes" |
+	"sectionsetsize" |
+	"sectionsettext" |
+	"sendmessage" |
+	"setautoclose" |
+	"setbkcolor" |
+	"setbrandingimage" |
+	"setcompress" |
+	"setcompressor" |
+	"setcurinsttype" |
+	"setdatablockoptimize" |
+	"setdatesave" |
+	"setdetailsprint" |
+	"setdetailsview" |
+	"setfileattributes" |
+	"setfont" |
+	"setoutpath" |
+	"setoverwrite" |
+	"setpluginunload" |
+	"setrebootflag" |
+	"setshellvarcontext" |
+	"setstaticbkcolor" |
+	"setwindowlong" |
+	"showinstdetails" |
+	"showuninstdetails" |
+	"showwindow" |
+	"silentinstall" |
+	"silentuninstall" |
+	"sleep" |
+	"spacetexts" |
+	"strcpy" |
+	"strlen" |
+	"subcaption" |
+	"uninstallbuttontext" |
+	"uninstallcaption" |
+	"uninstallicon" |
+	"uninstallsubcaption" |
+	"uninstalltext" |
+	"uninstpage" |
+	"unregdll" |
+	"var" |
+	"viaddversionkey" |
+	"videscription" |
+	"vicompanyname" |
+	"vicomments" |
+	"vilegalcopyrights" |
+	"vilegaltrademarks" |
+	"viproductname" |
+	"viproductversion" |
+	"windowicon" |
+	"writeinistr" |
+	"writeregbin" |
+	"writeregdword" |
+	"writeregexpandstr" |
+	"writeregstr" |
+	"writeuninstaller" |
+	"xpstyle" |
+
+	/* Flow control instructions */
+	"abort" |
+	"call" |
+	"clearerrors" |
+	"goto" |
+	"ifabort" |
+	"iferrors" |
+	"iffileexists" |
+	"ifrebootflag" |
+	"intcmp" |
+	"intcmpu" |
+	"iswindow" |
+	"messagebox" |
+	"reboot" |
+	"return" |
+	"quit" |
+	"seterrors" |
+	"strcmp" |
+	"strcmps"				{ addToken(Token.FUNCTION); }
+
+	/* Compiler utility commands */
+	"!addincludedir" |
+	"!addplugindir" |
+	"!define" |
+	"!include" |
+	"!cd" |
+	"!echo" |
+	"!error" |
+	"!insertmacro" |
+	"!packhdr" |
+	"!system" |
+	"!warning" |
+	"!undef" |
+	"!verbose" |
+
+	/* Conditional compilation */
+	"!ifdef" |
+	"!ifndef" |
+	"!if" |
+	"!else" |
+	"!endif" |
+	"!macro" |
+	"!macroend"				{ addToken(Token.RESERVED_WORD); }
+
+	/* Global variables */
+	"$0" |
+	"$1" |
+	"$2" |
+	"$3" |
+	"$4" |
+	"$5" |
+	"$6" |
+	"$7" |
+	"$8" |
+	"$9" |
+	"$INSTDIR" |
+	"$OUTDIR" |
+	"$CMDLINE" |
+	"$LANGUAGE" |
+
+	/* Local variables */
+	("$R0"{Digit}) |
+
+	/* Constants */
+	"ARCHIVE" |
+	"CENTER" |
+	"CONTROL" |
+	"CUR" |
+	"EXT" |
+	("F"{NonzeroDigit}) |
+	("F1"{Digit}) |
+	("F2"[0-4]) |
+	"FILE_ATTRIBUTE_ARCHIVE" |
+	"MB_ABORTRETRYIGNORE" |
+	"RIGHT" |
+	"RO" |
+	"SET" |
+	"SHIFT" |
+	"SW_SHOWMAXIMIZED" |
+	"SW_SHOWMINIMIZED" |
+	"SW_SHOWNORMAL" |
+	"a" |
+	"admin" |
+	"all" |
+	"alwaysoff" |
+	"auto" |
+	"both" |
+	"bottom" |
+	"bzip2" |
+	"checkbox" |
+	"colored" |
+	"components" |
+	"current" |
+	"custom" |
+	"directory" |
+	"force" |
+	"hide" |
+	"highest" |
+	"ifnewer" |
+	"instfiles" |
+	"license" |
+	"listonly" |
+	"manual" |
+	"nevershow" |
+	"none" |
+	"off" |
+	"on" |
+	"r" |
+	"radiobuttons" |
+	"show" |
+	"silent" |
+	"silentlog" |
+	"smooth" |
+	"textonly" |
+	"top" |
+	"try" |
+	"uninstConfirm" |
+	"user" |
+	"w" |
+	"zlib" |
+	"$$" |
+	"$DESKTOP" |
+	"$EXEDIR" |
+	"$HWNDPARENT" |
+	"$PLUGINSDIR" |
+	"$PROGRAMFILES" |
+	"$QUICKLAUNCH" |
+	"$SMPROGRAMS" |
+	"$SMSTARTUP" |
+	"$STARTMENU" |
+	"$SYSDIR" |
+	"$TEMP" |
+	"$WINDIR" |
+	"$\n" |
+	"$\r" |
+	"${NSISDIR}" |
+	"ALT" |
+	"END" |
+	"FILE_ATTRIBUTE_HIDDEN" |
+	"FILE_ATTRIBUTE_NORMAL" |
+	"FILE_ATTRIBUTE_OFFLINE" |
+	"FILE_ATTRIBUTE_READONLY" |
+	"FILE_ATTRIBUTE_SYSTEM" |
+	"FILE_ATTRIBUTE_TEMPORARY" |
+	"HIDDEN" |
+	"HKCC" |
+	"HKCR" |
+	"HKCU" |
+	"HKDD" |
+	"HKLM" |
+	"HKPD" |
+	"HKU" |
+	"SHCTX" |
+	"IDABORT" |
+	"IDCANCEL" |
+	"IDIGNORE" |
+	"IDNO" |
+	"IDOK" |
+	"IDRETRY" |
+	"IDYES" |
+	"LEFT" |
+	"MB_DEFBUTTON1" |
+	"MB_DEFBUTTON2" |
+	"MB_DEFBUTTON3" |
+	"MB_DEFBUTTON4" |
+	"MB_ICONEXCLAMATION" |
+	"MB_ICONINFORMATION" |
+	"MB_ICONQUESTION" |
+	"MB_ICONSTOP" |
+	"MB_OK" |
+	"MB_OKCANCEL" |
+	"MB_RETRYCANCEL" |
+	"MB_RIGHT" |
+	"MB_SETFOREGROUND" |
+	"MB_TOPMOST" |
+	"MB_YESNO" |
+	"MB_YESNOCANCEL" |
+	"NORMAL" |
+	"OFFLINE" |
+	"READONLY" |
+	"SYSTEM" |
+	"TEMPORARY"						{ addToken(Token.VARIABLE); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{BooleanLiteral}				{ addToken(Token.LITERAL_BOOLEAN); }
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	{Variable}						{ addToken(Token.VARIABLE); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	\"							{ start = zzMarkedPos-1; yybegin(STRING); }
+	\'							{ start = zzMarkedPos-1; yybegin(CHAR_LITERAL); }
+	\`							{ start = zzMarkedPos-1; yybegin(BACKTICKS); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+	{LineCommentBegin}			{ start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
+
+	/* Separators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{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 and flag them as identifiers. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+
+<STRING> {
+	[^\n\\\$\"]+		{}
+	\\.					{ /* Skip all escaped chars. */ }
+	\\					{ /* Line ending in '\' => continue to next line. */
+							addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+							return firstToken;
+						}
+	{Variable}			{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	{VariableStart}		{}
+	\"					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); return firstToken; }
+}
+
+
+<CHAR_LITERAL> {
+	[^\n\\\$\']+		{}
+	\\.					{ /* Skip all escaped chars. */ }
+	\\					{ /* Line ending in '\' => continue to next line. */
+							addToken(start,zzStartRead, Token.LITERAL_CHAR);
+							return firstToken;
+						}
+	{Variable}			{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	{VariableStart}		{}
+	\'					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); return firstToken; }
+}
+
+
+<BACKTICKS> {
+	[^\n\\\$\`]+		{}
+	\\.					{ /* Skip all escaped chars. */ }
+	\\					{ /* Line ending in '\' => continue to next line. */
+							addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE);
+							return firstToken;
+						}
+	{Variable}			{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	{VariableStart}		{}
+	\`					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE); }
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
+}
+
+
+<MLC> {
+	[^hwf\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+}
+
+
+<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 |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/NSISTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/NSISTokenMaker.java
new file mode 100644
index 0000000..4efeb39
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/NSISTokenMaker.java
@@ -0,0 +1,2979 @@
+/* The following code was generated by JFlex 1.4.1 on 10/7/12 12:43 AM */
+
+/*
+ * 07/14/2014
+ *
+ * NSISTokenMaker.java - Scanner for NSIS installer scripts.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for NSIS installer scripts.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated NSISTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ *
+ */
+
+public class NSISTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int EOL_COMMENT = 5;
+  public static final int STRING = 1;
+  public static final int CHAR_LITERAL = 2;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 4;
+  public static final int BACKTICKS = 3;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\16\1\15\1\0\1\16\1\75\22\0\1\16\1\42\1\10"+
+    "\1\11\1\13\1\41\1\44\1\51\2\31\1\17\1\33\1\52\1\34"+
+    "\1\32\1\14\1\4\1\72\1\73\1\74\1\74\1\6\1\6\1\6"+
+    "\1\3\1\3\1\45\1\20\1\35\1\36\1\40\1\43\1\50\1\26"+
+    "\1\5\1\60\1\62\1\24\1\25\1\63\1\53\1\55\1\1\1\66"+
+    "\1\27\1\64\1\57\1\61\1\54\1\71\1\23\1\30\1\22\1\7"+
+    "\1\70\1\56\1\21\1\67\1\65\1\31\1\12\1\31\1\37\1\2"+
+    "\1\76\1\26\1\5\1\60\1\62\1\24\1\77\1\63\1\100\1\55"+
+    "\1\1\1\66\1\27\1\64\1\57\1\61\1\54\1\71\1\23\1\30"+
+    "\1\22\1\7\1\70\1\101\1\21\1\67\1\65\1\46\1\37\1\47"+
+    "\1\43\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 =
+    "\6\0\2\1\2\2\2\1\1\3\1\4\2\1\1\5"+
+    "\1\6\1\7\2\1\1\10\2\1\1\10\2\1\1\11"+
+    "\7\7\1\12\3\1\1\10\11\1\1\13\1\14\1\15"+
+    "\1\16\1\14\1\17\1\14\1\20\1\21\1\22\1\14"+
+    "\1\23\1\14\1\24\1\25\1\14\1\26\10\14\1\27"+
+    "\6\14\1\0\1\30\1\31\1\30\6\1\2\10\5\1"+
+    "\1\0\10\1\1\32\17\1\2\10\23\1\1\0\1\7"+
+    "\13\0\45\1\1\33\1\34\1\0\1\35\1\0\1\36"+
+    "\4\14\4\0\4\14\5\0\1\31\17\1\1\0\11\1"+
+    "\1\0\33\1\1\10\12\1\1\10\13\1\10\0\1\37"+
+    "\2\0\1\37\3\0\7\1\1\40\26\1\1\10\16\1"+
+    "\1\10\20\1\4\0\4\14\4\0\4\14\5\0\14\1"+
+    "\1\0\6\1\1\41\1\1\1\42\11\1\1\40\4\1"+
+    "\1\40\1\1\1\10\34\1\1\10\5\1\16\0\1\10"+
+    "\30\1\1\40\43\1\2\0\1\34\2\0\1\35\3\14"+
+    "\1\43\2\0\3\14\1\44\3\0\11\1\1\0\101\1"+
+    "\14\0\61\1\1\10\11\1\4\0\1\14\2\0\1\14"+
+    "\3\0\10\1\1\0\41\1\1\40\22\1\1\10\1\1"+
+    "\7\0\1\37\3\1\1\40\25\1\1\40\32\1\4\0"+
+    "\12\1\1\0\30\1\1\10\20\1\1\37\6\1\5\0"+
+    "\55\1\4\0\7\1\1\0\11\1\1\37\1\1\1\40"+
+    "\42\1\3\0\2\1\1\40\45\1\2\0\44\1\3\0"+
+    "\60\1\1\40\13\1\1\37\4\1\3\0\2\1\1\40"+
+    "\45\1\1\40\6\1\1\0\10\1\1\40\147\1";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[1322];
+    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\102\0\204\0\306\0\u0108\0\u014a\0\u018c\0\u01ce"+
+    "\0\u0210\0\u0252\0\u0294\0\u02d6\0\u018c\0\u018c\0\u0318\0\u035a"+
+    "\0\u018c\0\u039c\0\u03de\0\u0420\0\u0462\0\u04a4\0\u04e6\0\u0528"+
+    "\0\u056a\0\u05ac\0\u05ee\0\u018c\0\u0630\0\u0672\0\u06b4\0\u06f6"+
+    "\0\u0738\0\u018c\0\u077a\0\u018c\0\u07bc\0\u07fe\0\u0840\0\u0882"+
+    "\0\u08c4\0\u0906\0\u0948\0\u098a\0\u09cc\0\u0a0e\0\u0a50\0\u0a92"+
+    "\0\u0ad4\0\u018c\0\u0b16\0\u018c\0\u0b58\0\u0b9a\0\u018c\0\u0bdc"+
+    "\0\u0b58\0\u018c\0\u018c\0\u0c1e\0\u0b58\0\u0c60\0\u018c\0\u018c"+
+    "\0\u0ca2\0\u018c\0\u0ce4\0\u0d26\0\u0d68\0\u0daa\0\u0dec\0\u0e2e"+
+    "\0\u0e70\0\u0eb2\0\u018c\0\u0ef4\0\u0f36\0\u0f78\0\u0fba\0\u0ffc"+
+    "\0\u103e\0\u1080\0\u10c2\0\u1104\0\u1146\0\u1188\0\u11ca\0\u120c"+
+    "\0\u124e\0\u1290\0\u12d2\0\u01ce\0\u018c\0\u1314\0\u1356\0\u1398"+
+    "\0\u13da\0\u141c\0\u145e\0\u14a0\0\u14e2\0\u1524\0\u1566\0\u15a8"+
+    "\0\u15ea\0\u162c\0\u166e\0\u16b0\0\u16f2\0\u1734\0\u1776\0\u17b8"+
+    "\0\u17fa\0\u183c\0\u187e\0\u18c0\0\u1902\0\u1944\0\u1986\0\u19c8"+
+    "\0\u1a0a\0\u1a4c\0\u1a8e\0\u1ad0\0\u1b12\0\u1b54\0\u1b96\0\u1bd8"+
+    "\0\u1c1a\0\u1c5c\0\u1c9e\0\u1ce0\0\u1d22\0\u1d64\0\u1da6\0\u1de8"+
+    "\0\u1e2a\0\u1e6c\0\u1eae\0\u1ef0\0\u1f32\0\u1f74\0\u1fb6\0\u1ff8"+
+    "\0\u03de\0\u203a\0\u207c\0\u20be\0\u2100\0\u2142\0\u2184\0\u21c6"+
+    "\0\u2208\0\u224a\0\u228c\0\u22ce\0\u2310\0\u2352\0\u2394\0\u23d6"+
+    "\0\u2418\0\u245a\0\u249c\0\u24de\0\u2520\0\u2562\0\u25a4\0\u25e6"+
+    "\0\u2628\0\u266a\0\u26ac\0\u26ee\0\u2730\0\u2772\0\u27b4\0\u27f6"+
+    "\0\u2838\0\u287a\0\u28bc\0\u28fe\0\u2940\0\u2982\0\u29c4\0\u2a06"+
+    "\0\u2a48\0\u2a8a\0\u2acc\0\u2b0e\0\u2b50\0\u2b92\0\u2bd4\0\u2c16"+
+    "\0\u2c58\0\u2c9a\0\u018c\0\u2cdc\0\u2d1e\0\u2d60\0\u2da2\0\u018c"+
+    "\0\u2de4\0\u2e26\0\u2e68\0\u2eaa\0\u2eec\0\u2f2e\0\u2f70\0\u2fb2"+
+    "\0\u2ff4\0\u3036\0\u3078\0\u30ba\0\u30fc\0\u313e\0\u3180\0\u31c2"+
+    "\0\u3204\0\u1146\0\u3246\0\u3288\0\u32ca\0\u330c\0\u334e\0\u3390"+
+    "\0\u33d2\0\u3414\0\u3456\0\u1ad0\0\u3498\0\u34da\0\u351c\0\u355e"+
+    "\0\u35a0\0\u35e2\0\u3624\0\u3666\0\u36a8\0\u36ea\0\u372c\0\u376e"+
+    "\0\u37b0\0\u37f2\0\u3834\0\u3876\0\u38b8\0\u38fa\0\u393c\0\u397e"+
+    "\0\u39c0\0\u3a02\0\u3a44\0\u3a86\0\u3ac8\0\u3b0a\0\u3b4c\0\u3b8e"+
+    "\0\u3bd0\0\u3c12\0\u3c54\0\u3c96\0\u3cd8\0\u3d1a\0\u3d5c\0\u3d9e"+
+    "\0\u3de0\0\u3e22\0\u3e64\0\u3ea6\0\u3ee8\0\u3f2a\0\u3f6c\0\u3fae"+
+    "\0\u3ff0\0\u4032\0\u4074\0\u40b6\0\u40f8\0\u413a\0\u417c\0\u41be"+
+    "\0\u4200\0\u4242\0\u4284\0\u42c6\0\u4308\0\u434a\0\u438c\0\u43ce"+
+    "\0\u4410\0\u4452\0\u4494\0\u44d6\0\u4518\0\u455a\0\u459c\0\u45de"+
+    "\0\u4620\0\u4662\0\u46a4\0\u46e6\0\u4728\0\u476a\0\u47ac\0\u47ee"+
+    "\0\u4830\0\u018c\0\u4872\0\u48b4\0\u48f6\0\u4938\0\u497a\0\u49bc"+
+    "\0\u49fe\0\u4a40\0\u4a82\0\u4ac4\0\u01ce\0\u4b06\0\u4b48\0\u4b8a"+
+    "\0\u4bcc\0\u4c0e\0\u4c50\0\u4c92\0\u4cd4\0\u4d16\0\u4d58\0\u4d9a"+
+    "\0\u4ddc\0\u4e1e\0\u4e60\0\u4ea2\0\u4ee4\0\u4f26\0\u4f68\0\u4faa"+
+    "\0\u4fec\0\u502e\0\u5070\0\u50b2\0\u50f4\0\u5136\0\u5178\0\u51ba"+
+    "\0\u51fc\0\u523e\0\u5280\0\u52c2\0\u5304\0\u5346\0\u5388\0\u53ca"+
+    "\0\u540c\0\u544e\0\u5490\0\u54d2\0\u5514\0\u5556\0\u5598\0\u55da"+
+    "\0\u561c\0\u565e\0\u56a0\0\u56e2\0\u5724\0\u5766\0\u57a8\0\u57ea"+
+    "\0\u582c\0\u586e\0\u58b0\0\u58f2\0\u5934\0\u5976\0\u59b8\0\u59fa"+
+    "\0\u5a3c\0\u5a7e\0\u5ac0\0\u5b02\0\u5b44\0\u5b86\0\u5bc8\0\u5c0a"+
+    "\0\u5c4c\0\u5c8e\0\u5cd0\0\u5d12\0\u5d54\0\u5d96\0\u5dd8\0\u5e1a"+
+    "\0\u5e5c\0\u5e9e\0\u5ee0\0\u5f22\0\u5f64\0\u5fa6\0\u5fe8\0\u602a"+
+    "\0\u606c\0\u60ae\0\u60f0\0\u6132\0\u6174\0\u61b6\0\u61f8\0\u623a"+
+    "\0\u5490\0\u627c\0\u62be\0\u018c\0\u6300\0\u01ce\0\u6342\0\u6384"+
+    "\0\u63c6\0\u6408\0\u644a\0\u648c\0\u64ce\0\u6510\0\u6552\0\u6594"+
+    "\0\u65d6\0\u6618\0\u665a\0\u669c\0\u66de\0\u6720\0\u6762\0\u67a4"+
+    "\0\u67e6\0\u6828\0\u686a\0\u68ac\0\u68ee\0\u6930\0\u6972\0\u69b4"+
+    "\0\u69f6\0\u6a38\0\u6a7a\0\u6abc\0\u6afe\0\u6b40\0\u6b82\0\u6bc4"+
+    "\0\u6c06\0\u6c48\0\u6c8a\0\u6ccc\0\u6d0e\0\u6d50\0\u6d92\0\u6dd4"+
+    "\0\u6e16\0\u6e58\0\u6e9a\0\u6edc\0\u6f1e\0\u6f60\0\u6fa2\0\u6fe4"+
+    "\0\u7026\0\u7068\0\u70aa\0\u70ec\0\u712e\0\u7170\0\u71b2\0\u71f4"+
+    "\0\u7236\0\u7278\0\u72ba\0\u72fc\0\u733e\0\u7380\0\u73c2\0\u2520"+
+    "\0\u7404\0\u7446\0\u7488\0\u74ca\0\u750c\0\u754e\0\u7590\0\u75d2"+
+    "\0\u7614\0\u7656\0\u7698\0\u76da\0\u771c\0\u775e\0\u77a0\0\u77e2"+
+    "\0\u7824\0\u7866\0\u78a8\0\u78ea\0\u792c\0\u796e\0\u79b0\0\u79f2"+
+    "\0\u7a34\0\u7a76\0\u7ab8\0\u7afa\0\u7b3c\0\u7b7e\0\u7bc0\0\u7c02"+
+    "\0\u7c44\0\u7c86\0\u7cc8\0\u7d0a\0\u7d4c\0\u7d8e\0\u7dd0\0\u7e12"+
+    "\0\u7e54\0\u7e96\0\u7ed8\0\u7f1a\0\u7f5c\0\u7f9e\0\u7fe0\0\u8022"+
+    "\0\u8064\0\u80a6\0\u80e8\0\u812a\0\u816c\0\u81ae\0\u81f0\0\u8232"+
+    "\0\u8274\0\u82b6\0\u82f8\0\u833a\0\u837c\0\u83be\0\u018c\0\u8400"+
+    "\0\u8442\0\u018c\0\u8484\0\u84c6\0\u8508\0\u854a\0\u858c\0\u85ce"+
+    "\0\u8610\0\u8652\0\u8694\0\u86d6\0\u8718\0\u875a\0\u879c\0\u87de"+
+    "\0\u8820\0\u8862\0\u88a4\0\u88e6\0\u8928\0\u896a\0\u89ac\0\u89ee"+
+    "\0\u8a30\0\u8a72\0\u8ab4\0\u8af6\0\u8b38\0\u8b7a\0\u8bbc\0\u8bfe"+
+    "\0\u8c40\0\u8c82\0\u8cc4\0\u8d06\0\u8d48\0\u8d8a\0\u8dcc\0\u8e0e"+
+    "\0\u8e50\0\u8e92\0\u8ed4\0\u8f16\0\u8f58\0\u8f9a\0\u8fdc\0\u901e"+
+    "\0\u9060\0\u90a2\0\u90e4\0\u9126\0\u9168\0\u91aa\0\u91ec\0\u922e"+
+    "\0\u9270\0\u92b2\0\u92f4\0\u9336\0\u9378\0\u93ba\0\u93fc\0\u943e"+
+    "\0\u9480\0\u94c2\0\u9504\0\u9546\0\u9588\0\u95ca\0\u960c\0\u964e"+
+    "\0\u9690\0\u96d2\0\u9714\0\u9756\0\u9798\0\u97da\0\u981c\0\u985e"+
+    "\0\u98a0\0\u98e2\0\u9924\0\u9966\0\u99a8\0\u99ea\0\u9a2c\0\u9a6e"+
+    "\0\u9ab0\0\u9af2\0\u9b34\0\u9b76\0\u9bb8\0\u9bfa\0\u9c3c\0\u9c7e"+
+    "\0\u9cc0\0\u9d02\0\u9d44\0\u9d86\0\u9dc8\0\u9e0a\0\u9e4c\0\u9e8e"+
+    "\0\u9ed0\0\u9f12\0\u9f54\0\u9f96\0\u9fd8\0\ua01a\0\ua05c\0\ua09e"+
+    "\0\ua0e0\0\ua122\0\ua164\0\ua1a6\0\ua1e8\0\ua22a\0\ua26c\0\ua2ae"+
+    "\0\ua2f0\0\ua332\0\ua374\0\ua3b6\0\ua3f8\0\ua43a\0\ua47c\0\ua4be"+
+    "\0\ua500\0\ua542\0\ua584\0\ua5c6\0\ua608\0\ua64a\0\ua68c\0\ua6ce"+
+    "\0\ua710\0\ua752\0\ua794\0\ua7d6\0\ua818\0\ua85a\0\ua89c\0\ua8de"+
+    "\0\ua920\0\ua962\0\ua9a4\0\ua9e6\0\uaa28\0\uaa6a\0\uaaac\0\uaaee"+
+    "\0\uab30\0\uab72\0\uabb4\0\uabf6\0\uac38\0\uac7a\0\uacbc\0\uacfe"+
+    "\0\uad40\0\uad82\0\uadc4\0\uae06\0\uae48\0\uae8a\0\u854a\0\uaecc"+
+    "\0\uaf0e\0\u86d6\0\uaf50\0\uaf92\0\uafd4\0\ub016\0\ub058\0\ub09a"+
+    "\0\ub0dc\0\ub11e\0\ub160\0\ub1a2\0\ub1e4\0\ub226\0\ub268\0\ub2aa"+
+    "\0\ub2ec\0\ub32e\0\ub370\0\ub3b2\0\ub3f4\0\ub436\0\ub478\0\ub4ba"+
+    "\0\ub4fc\0\ub53e\0\ub580\0\ub5c2\0\ub604\0\ub646\0\ub688\0\ub6ca"+
+    "\0\ub70c\0\ub74e\0\ub790\0\ub7d2\0\ub814\0\ub856\0\ub898\0\ub8da"+
+    "\0\ub91c\0\ub95e\0\ub9a0\0\ub9e2\0\uba24\0\uba66\0\ubaa8\0\ubaea"+
+    "\0\ubb2c\0\ubb6e\0\ubbb0\0\ubbf2\0\ubc34\0\ubc76\0\ubcb8\0\ubcfa"+
+    "\0\ubd3c\0\ubd7e\0\ubdc0\0\ube02\0\ube44\0\ube86\0\ubec8\0\ubf0a"+
+    "\0\ubf4c\0\ubf8e\0\ubfd0\0\uc012\0\uc054\0\uc096\0\uc0d8\0\uc11a"+
+    "\0\uc15c\0\uc19e\0\uc1e0\0\uc222\0\uc264\0\uc2a6\0\uc2e8\0\uc32a"+
+    "\0\uc36c\0\uc3ae\0\uc3f0\0\uc432\0\uc474\0\uc4b6\0\uc4f8\0\uc53a"+
+    "\0\uc57c\0\uc5be\0\uc600\0\uc642\0\uc684\0\uc6c6\0\uc708\0\uc74a"+
+    "\0\uc78c\0\uc7ce\0\uc810\0\uc852\0\uc894\0\uc8d6\0\uc918\0\uc95a"+
+    "\0\uc99c\0\uc9de\0\uca20\0\uca62\0\ucaa4\0\ucae6\0\ucb28\0\ucb6a"+
+    "\0\ucbac\0\ucbee\0\ucc30\0\ucc72\0\uccb4\0\uccf6\0\ucd38\0\ucd7a"+
+    "\0\ucdbc\0\ucdfe\0\uce40\0\uce82\0\ucec4\0\ucf06\0\ucf48\0\ucf8a"+
+    "\0\ucfcc\0\ud00e\0\ud050\0\ud092\0\ud0d4\0\ud116\0\ud158\0\ud19a"+
+    "\0\ud1dc\0\ud21e\0\ud260\0\ud2a2\0\ud2e4\0\ud326\0\u50b2\0\ud368"+
+    "\0\ud3aa\0\ud3ec\0\ud42e\0\ud470\0\ud4b2\0\ud4f4\0\ud536\0\ud578"+
+    "\0\ud5ba\0\ud5fc\0\ud63e\0\ud680\0\ud6c2\0\ud704\0\ud746\0\ud788"+
+    "\0\ud7ca\0\ud80c\0\ud84e\0\ud890\0\ud8d2\0\ud914\0\ud956\0\ud998"+
+    "\0\ud9da\0\uda1c\0\uda5e\0\udaa0\0\udae2\0\udb24\0\udb66\0\udba8"+
+    "\0\udbea\0\udc2c\0\udc6e\0\udcb0\0\udcf2\0\udd34\0\udd76\0\uddb8"+
+    "\0\uddfa\0\ude3c\0\ude7e\0\udec0\0\udf02\0\udf44\0\udf86\0\udfc8"+
+    "\0\ue00a\0\ue04c\0\ue08e\0\ue0d0\0\ubaa8\0\ue112\0\ue154\0\ue196"+
+    "\0\ue1d8\0\ue21a\0\ue25c\0\ue29e\0\ue2e0\0\ue322\0\ue364\0\ue3a6"+
+    "\0\ue3e8\0\ue42a\0\ue46c\0\ue4ae\0\ue4f0\0\ue532\0\ue574\0\ue5b6"+
+    "\0\ue5f8\0\ue63a\0\ue67c\0\ue6be\0\ue700\0\ue742\0\ue784\0\ue7c6"+
+    "\0\ue808\0\ue84a\0\ue88c\0\ue8ce\0\ue910\0\ue952\0\ue994\0\ue9d6"+
+    "\0\uea18\0\uea5a\0\uea9c\0\ueade\0\ueb20\0\ueb62\0\ueba4\0\uebe6"+
+    "\0\uec28\0\uec6a\0\uecac\0\uecee\0\ued30\0\ued72\0\uedb4\0\uedf6"+
+    "\0\uee38\0\uee7a\0\ueebc\0\ueefe\0\uef40\0\uef82\0\uefc4\0\uf006"+
+    "\0\uf048\0\uf08a\0\uf0cc\0\uf10e\0\uf150\0\uf192\0\uf1d4\0\uf216"+
+    "\0\uf258\0\uf29a\0\uf2dc\0\uf31e\0\uf360\0\uf3a2\0\uf3e4\0\uf426"+
+    "\0\uf468\0\uf4aa\0\uf4ec\0\uf52e\0\uf570\0\uf5b2\0\uf5f4\0\uf636"+
+    "\0\uf678\0\uf6ba\0\uf6fc\0\uf73e\0\uf780\0\uf7c2\0\uf804\0\uf846"+
+    "\0\uf888\0\uf8ca\0\uf90c\0\uf94e\0\uf990\0\uf9d2\0\ufa14\0\ufa56"+
+    "\0\ufa98\0\ufada\0\ufb1c\0\ufb5e\0\ufba0\0\ufbe2\0\ufc24\0\ufc66"+
+    "\0\ufca8\0\ufcea\0\ufd2c\0\ufd6e\0\ufdb0\0\ufdf2\0\ufe34\0\ufe76"+
+    "\0\ufeb8\0\ufefa\0\uff3c\0\uff7e\0\uffc0\1\2\1\104\1\206"+
+    "\1\310\1\u010a\1\u014c\1\u018e\1\u01d0\1\u0212\1\u0254\0\uaaee"+
+    "\1\u0296\1\u02d8\1\u031a\1\u035c\1\u039e\1\u03e0\1\u0422\1\u0464"+
+    "\1\u04a6\1\u04e8\1\u052a\1\u056c\1\u05ae\1\u05f0\1\u0632\1\u0674"+
+    "\1\u06b6\1\u06f8\1\u073a\1\u077c\1\u07be\1\u0800\1\u0842\1\u0884"+
+    "\1\u08c6\1\u0908\1\u094a\1\u098c\1\u09ce\1\u0a10\1\u0a52\1\u0a94"+
+    "\1\u0ad6\1\u0b18\1\u0b5a\1\u0b9c\1\u0bde\1\u0c20\1\u0c62\1\u0ca4"+
+    "\1\u0ce6\1\u0d28\1\u0d6a\1\u0dac\1\u0dee\1\u0e30\1\u0e72\1\u0eb4"+
+    "\1\u0ef6\1\u0f38\1\u0f7a\1\u0fbc\1\u0ffe\1\u1040\1\u1082\1\u10c4"+
+    "\1\u1106\1\u1148\1\u118a\1\u11cc\1\u120e\1\u1250\1\u1292\1\u12d4"+
+    "\1\u1316\1\u1358\1\u139a\1\u13dc\1\u141e\1\u1460\1\u14a2\1\u14e4"+
+    "\1\u1526\1\u1568\1\u15aa\1\u15ec\1\u162e\1\u1670\1\u16b2\1\u16f4"+
+    "\1\u1736\1\u1778\1\u17ba\1\u17fc\1\u183e\1\u1880\1\u18c2\1\u1904"+
+    "\1\u1946\1\u1988\1\u19ca\1\u1a0c\1\u1a4e\1\u1a90\1\u1ad2\1\u1b14"+
+    "\1\u1b56\1\u1b98\1\u1bda\1\u1c1c\1\u1c5e\1\u1ca0\1\u1ce2\1\u1d24"+
+    "\1\u1d66\1\u1da8\1\u1dea\1\u1e2c\1\u1e6e\1\u1eb0\1\u1ef2\1\u1f34"+
+    "\1\u1f76\1\u1fb8\0\u01ce\1\u1ffa\1\u203c\1\u207e\1\u20c0\1\u2102"+
+    "\1\u2144\1\u2186\1\u21c8\1\u220a\1\u224c\1\u228e\1\u22d0\1\u2312"+
+    "\1\u2354\1\u2396\1\u23d8\1\u241a\1\u245c\1\u249e\1\u24e0\1\u2522"+
+    "\1\u2564\1\u25a6\1\u25e8\1\u262a\1\u266c\1\u26ae\1\u26f0\1\u2732"+
+    "\1\u2774\1\u27b6\1\u27f8\1\u283a\1\u287c\1\u28be\1\u2900\1\u2942"+
+    "\1\u2984\1\u29c6\1\u2a08\1\u2a4a\1\u2a8c\1\u2ace\1\u2b10\1\u2b52"+
+    "\1\u2b94\1\u2bd6\0\uf570\1\u2c18\1\u2c5a\1\u2c9c\1\u2cde\1\u2d20"+
+    "\1\u2d62\1\u2da4\1\u2de6\1\u2e28\1\u2e6a\1\u2eac\1\u2eee\1\u2f30"+
+    "\1\u2f72\1\u2fb4\1\u2ff6\1\u3038\1\u307a\1\u30bc\1\u30fe\1\u3140"+
+    "\1\u3182\1\u31c4\1\u3206\1\u3248\1\u328a\1\u32cc\1\u330e\1\u3350"+
+    "\1\u3392\1\u33d4\1\u3416\1\u3458\1\u349a\1\u34dc\1\u351e\1\u3560"+
+    "\1\u35a2\1\u35e4\1\u3626\1\u3668\1\u36aa\1\u36ec\1\u372e\1\u3770"+
+    "\1\u37b2\1\u37f4\1\u3836\1\u3878\1\u38ba\1\u38fc\1\u393e\1\u3980"+
+    "\1\u39c2\1\u3a04\1\u3a46\1\u3a88\1\u3aca\1\u3b0c\1\u3b4e\1\u3b90"+
+    "\1\u3bd2\1\u3c14\1\u3c56\1\u3c98\1\u3cda\1\u3d1c\1\u3d5e\1\u3da0"+
+    "\1\u3de2\1\u3e24\1\u3e66\1\u3ea8\1\u3eea\1\u3f2c\1\u3f6e\1\u3fb0"+
+    "\1\u3ff2\1\u4034\1\u4076\1\u40b8\1\u40fa\1\u413c\1\u417e\1\u41c0"+
+    "\1\u4202\1\u4244\1\u4286\1\u42c8\1\u430a\1\u434c\1\u438e\1\u43d0"+
+    "\1\u4412\1\u4454\1\u4496\1\u44d8\1\u451a\1\u455c\1\u459e\1\u45e0"+
+    "\1\u4622\1\u4664\1\u46a6\1\u46e8\1\u472a\1\u476c\1\u47ae\1\u47f0"+
+    "\1\u4832\1\u4874\1\u48b6\1\u48f8\1\u493a\1\u497c\1\u49be\1\u4a00"+
+    "\1\u4a42\1\u4a84";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[1322];
+    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\7\2\10\1\11\1\12\1\13\1\11\1\14\1\15"+
+    "\1\16\1\7\1\17\1\20\1\21\1\22\1\23\1\16"+
+    "\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33"+
+    "\1\34\1\7\1\35\1\36\1\37\2\23\1\40\1\23"+
+    "\1\41\1\42\1\43\1\42\2\34\1\7\1\44\1\7"+
+    "\1\45\1\46\1\47\1\50\1\51\1\52\1\53\1\54"+
+    "\1\55\1\56\1\57\2\10\1\60\1\61\3\11\1\7"+
+    "\1\62\1\30\1\45\1\50\10\63\1\64\1\63\1\65"+
+    "\1\66\1\63\1\67\64\63\12\70\1\71\1\66\1\70"+
+    "\1\72\33\70\1\73\30\70\12\74\1\75\1\76\1\74"+
+    "\1\77\60\74\1\100\3\74\15\101\1\102\1\101\1\103"+
+    "\5\101\1\104\25\101\1\105\2\101\1\106\20\101\1\107"+
+    "\1\110\1\111\15\112\1\113\7\112\1\114\25\112\1\115"+
+    "\2\112\1\116\20\112\1\117\1\120\1\121\103\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\22\10\2\0"+
+    "\3\10\3\123\2\11\1\123\1\11\1\123\1\0\3\123"+
+    "\5\0\10\123\17\0\1\123\2\0\17\123\3\11\1\0"+
+    "\10\123\1\124\1\123\1\124\1\123\1\0\3\123\5\0"+
+    "\1\125\7\123\17\0\1\123\2\0\17\123\3\124\1\0"+
+    "\4\123\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+    "\1\126\5\10\22\0\6\10\1\127\1\10\1\130\1\10"+
+    "\1\131\7\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\7\10\1\132\22\0\4\10\1\133\15\10"+
+    "\2\0\3\10\1\0\2\10\2\134\1\10\1\134\1\10"+
+    "\2\0\1\122\1\134\1\10\1\135\3\0\1\10\1\136"+
+    "\1\137\1\140\2\10\1\141\1\142\15\0\1\143\4\0"+
+    "\1\144\1\145\1\146\1\147\1\10\1\150\1\151\1\152"+
+    "\6\10\1\153\3\134\1\135\1\0\1\10\1\144\1\147"+
+    "\1\0\7\10\2\0\1\122\2\10\2\0\1\154\1\0"+
+    "\10\10\5\0\1\42\14\0\22\10\2\0\3\10\16\0"+
+    "\1\22\121\0\1\42\44\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\1\10\1\155\20\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\156"+
+    "\1\157\4\10\22\0\6\10\1\160\13\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\161"+
+    "\1\10\1\162\2\10\22\0\2\10\1\163\3\10\1\134"+
+    "\2\10\1\164\10\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\165\7\10\22\0\4\10\1\166"+
+    "\15\10\2\0\3\10\1\0\2\10\1\134\2\10\1\134"+
+    "\1\167\2\0\1\122\2\10\4\0\5\10\1\170\1\171"+
+    "\1\10\22\0\2\10\1\172\3\10\1\173\10\10\1\174"+
+    "\1\175\1\134\2\0\3\10\1\0\4\10\1\176\1\10"+
+    "\1\177\2\0\1\122\2\10\4\0\2\10\1\200\3\10"+
+    "\1\201\1\10\22\0\7\10\1\202\12\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\203"+
+    "\1\10\1\204\2\10\22\0\2\10\1\205\3\10\1\206"+
+    "\13\10\2\0\3\10\1\0\6\10\1\207\2\0\1\122"+
+    "\2\10\4\0\1\10\1\210\1\10\1\211\2\10\1\212"+
+    "\1\10\22\0\1\213\1\214\1\215\1\216\5\10\1\217"+
+    "\2\10\1\220\5\10\2\0\1\10\1\213\1\216\33\0"+
+    "\1\42\2\0\1\42\77\0\1\42\1\0\1\42\100\0"+
+    "\1\221\1\42\101\0\1\42\1\0\1\222\50\0\1\223"+
+    "\14\0\1\224\1\0\1\225\1\0\1\226\5\0\1\42"+
+    "\15\0\1\227\1\230\1\231\1\0\1\232\1\0\1\233"+
+    "\1\0\1\234\3\0\1\235\10\0\1\231\36\0\1\42"+
+    "\5\0\1\42\36\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\2\10\1\236\10\10\1\237\6\10\2\0"+
+    "\3\10\1\0\6\10\1\240\2\0\1\122\2\10\4\0"+
+    "\5\10\1\241\1\242\1\10\22\0\6\10\1\243\13\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\4\10\1\244\2\10\1\245\22\0\4\10\1\246\1\247"+
+    "\1\10\1\250\12\10\2\0\1\244\2\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\2\10\1\251\5\10\22\0"+
+    "\2\10\1\252\17\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\253\1\10\1\254\2\10"+
+    "\22\0\6\10\1\255\13\10\2\0\3\10\1\0\6\10"+
+    "\1\256\2\0\1\122\2\10\4\0\2\10\1\257\1\260"+
+    "\1\10\1\261\1\262\1\10\22\0\1\263\5\10\1\264"+
+    "\13\10\2\0\1\10\1\263\1\10\1\0\6\10\1\265"+
+    "\2\0\1\122\2\10\4\0\4\10\1\266\3\10\22\0"+
+    "\4\10\1\134\15\10\2\0\1\266\2\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\267\4\10\22\0"+
+    "\2\10\1\270\17\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\271\4\10\22\0\6\10"+
+    "\1\272\13\10\2\0\3\10\1\0\4\10\1\273\2\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\274\1\10\1\275"+
+    "\2\10\22\0\2\10\1\276\17\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\6\10\1\277\1\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\5\10\1\300\2\10\22\0\2\10\1\301"+
+    "\17\10\2\0\3\10\1\0\6\10\1\302\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\10\63"+
+    "\1\0\1\63\2\0\1\63\1\0\64\63\15\303\1\0"+
+    "\64\303\1\0\2\304\2\0\1\304\1\0\1\304\3\0"+
+    "\2\304\4\0\10\304\15\0\1\305\4\0\17\304\5\0"+
+    "\3\304\12\70\2\0\1\70\1\0\33\70\1\0\30\70"+
+    "\12\74\2\0\1\74\1\0\60\74\1\0\3\74\1\0"+
+    "\2\306\2\0\1\306\1\0\1\306\3\0\2\306\4\0"+
+    "\10\306\15\0\1\307\4\0\17\306\5\0\3\306\15\101"+
+    "\1\0\1\101\1\0\57\101\17\0\1\310\65\0\15\101"+
+    "\1\0\1\101\1\0\2\101\1\311\32\101\1\312\21\101"+
+    "\3\0\15\101\1\0\1\101\1\0\2\101\1\313\54\101"+
+    "\3\0\15\101\1\0\1\101\1\0\36\101\1\314\20\101"+
+    "\2\0\1\315\22\0\1\316\32\0\1\317\46\0\1\320"+
+    "\135\0\1\315\22\0\1\315\15\112\1\0\61\112\3\0"+
+    "\15\112\1\0\4\112\1\321\32\112\1\322\21\112\3\0"+
+    "\15\112\1\0\4\112\1\323\54\112\3\0\15\112\1\0"+
+    "\40\112\1\324\20\112\2\0\1\325\22\0\1\326\32\0"+
+    "\1\327\46\0\1\330\135\0\1\325\22\0\1\325\7\0"+
+    "\1\331\72\0\10\123\1\0\3\123\5\0\10\123\17\0"+
+    "\1\123\2\0\22\123\1\0\10\123\1\124\1\123\1\124"+
+    "\1\123\1\0\3\123\5\0\10\123\17\0\1\123\2\0"+
+    "\17\123\3\124\1\0\7\123\4\332\1\123\1\0\3\123"+
+    "\5\0\3\123\3\332\2\123\17\0\1\123\2\0\5\123"+
+    "\1\332\1\123\1\332\7\123\3\332\1\0\1\123\1\332"+
+    "\2\123\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+    "\1\333\2\10\22\0\2\10\1\334\17\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\1\10\1\335"+
+    "\6\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\10\10\1\336\11\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\2\10\1\337\17\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\3\10\1\340\4\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\2\10\1\341\5\10\22\0\2\10\1\342"+
+    "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\3\10\1\343\4\10\22\0\22\10\2\0\3\10"+
+    "\1\0\3\10\1\344\3\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\345\7\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+    "\1\346\2\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\10\1\347\6\10\22\0"+
+    "\11\10\1\350\2\10\1\351\5\10\2\0\3\10\1\0"+
+    "\2\352\2\0\1\352\1\0\1\352\3\0\2\352\4\0"+
+    "\10\352\22\0\17\352\5\0\3\352\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\3\10\1\353\16\10"+
+    "\2\0\2\10\1\353\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\2\10\1\354\3\10\1\355\1\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\4\10\1\356\15\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+    "\1\357\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\11\10\1\360\10\10\2\0"+
+    "\3\10\1\0\6\10\1\361\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\362\4\10\22\0\22\10"+
+    "\2\0\3\10\1\0\6\10\1\363\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\22\10\2\0\3\10\17\0\1\364"+
+    "\63\0\7\10\2\0\1\122\2\10\4\0\7\10\1\365"+
+    "\22\0\22\10\2\0\3\10\1\0\6\10\1\366\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\14\10\1\134\5\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\1\367\7\10\22\0\11\10\1\370\10\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\1\10\1\134\20\10\2\0\3\10\1\0\4\10\1\371"+
+    "\2\10\2\0\1\122\2\10\4\0\1\10\1\372\3\10"+
+    "\1\373\1\10\1\374\22\0\4\10\1\375\3\10\1\376"+
+    "\5\10\1\377\3\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\7\10\1\u0100\12\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\10\10\1\u0101\11\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\7\10"+
+    "\1\u0102\12\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\1\10\1\134\1\10\1\u0103\4\10\22\0"+
+    "\1\10\1\u0104\3\10\1\u0105\14\10\2\0\3\10\1\0"+
+    "\6\10\1\u0106\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\7\10\1\134\12\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\4\10\1\u0107\15\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\6\10\1\u0108\1\10\22\0\22\10\2\0\3\10\1\0"+
+    "\6\10\1\u0109\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\6\10\1\u010a\1\10\22\0\4\10\1\u010b\15\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\2\10\1\u010c\5\10\22\0\22\10\2\0\3\10\1\0"+
+    "\2\10\2\134\1\10\1\134\1\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\17\10\3\134\2\0\3\10\1\0"+
+    "\3\10\1\134\3\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\17\10\3\134\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\6\10\1\u010d\13\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\1\10\1\u010e\6\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\5\10"+
+    "\1\u010f\14\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\1\10\1\134\4\10\1\u0110\1\10\22\0"+
+    "\3\10\1\u0111\16\10\2\0\2\10\1\u0111\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\7\10\1\u0112"+
+    "\1\10\1\u0113\10\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\4\10\1\u0114\3\10\22\0\22\10"+
+    "\2\0\1\u0114\2\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\4\10\1\u0115\15\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\367"+
+    "\22\0\5\10\1\u0116\14\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\5\10\1\u0117\2\10\22\0"+
+    "\10\10\1\u0118\11\10\2\0\3\10\1\0\4\10\1\u0119"+
+    "\2\10\2\0\1\122\2\10\4\0\10\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\2\10\1\u011a\5\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\1\10\1\u011b\3\10"+
+    "\1\u011c\2\10\22\0\4\10\1\u011d\1\u011e\14\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+    "\1\u011f\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\203"+
+    "\2\10\1\u0120\1\u0121\13\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\5\10\1\u0122\2\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\6\10\1\u0123\1\10\22\0\22\10\2\0\3\10"+
+    "\1\0\1\10\1\u0124\5\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\6\10\1\u0125\13\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\7\10\1\u0126\22\0\22\10\2\0\3\10\36\0\1\42"+
+    "\1\0\1\23\120\0\1\u0127\45\0\1\u0128\3\0\1\u0129"+
+    "\27\0\1\u012a\1\u012b\103\0\1\u012c\106\0\1\u012d\40\0"+
+    "\1\u012e\100\0\1\u012f\31\0\1\u0130\17\0\1\u012f\30\0"+
+    "\1\u0131\135\0\1\u0132\43\0\1\u0133\103\0\1\u0134\77\0"+
+    "\1\u0135\56\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\7\10\1\u0136\1\u0137\11\10\2\0\3\10\1\0"+
+    "\6\10\1\134\2\0\1\122\2\10\4\0\6\10\1\u0138"+
+    "\1\10\22\0\1\10\1\u0139\3\10\1\u013a\1\10\1\u0139"+
+    "\12\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\7\10\1\u0105\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\10\10"+
+    "\1\u013b\11\10\2\0\3\10\1\0\6\10\1\u013c\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\1\10\1\u013d\20\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\2\10\1\u013e\1\u013f\1\u0140\1\u0141"+
+    "\2\10\22\0\4\10\1\u0142\15\10\2\0\1\u0140\2\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\3\10\1\u0143\16\10\2\0\2\10\1\u0143\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\10\1\u0144\5\10\1\u0145"+
+    "\22\0\2\10\1\u0146\17\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0147"+
+    "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\2\10\1\u0148\2\10\1\u0149\2\10\22\0\2\10"+
+    "\1\u014a\1\10\1\u014b\1\u014c\1\u014d\5\10\1\u014e\5\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\2\10\1\u014f\17\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u0150\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\15\10\1\u0151\4\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\11\10\1\u013b\10\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\2\10\1\u0152\5\10\22\0"+
+    "\1\10\1\u013d\2\10\1\u0153\15\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0154\4\10"+
+    "\1\u0155\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\u0156\4\10\22\0\5\10"+
+    "\1\u0157\14\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\4\10\1\u0158\15\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+    "\1\u0159\1\10\22\0\1\10\1\u015a\20\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u015b"+
+    "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\u015c\1\10\1\u015d\2\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\6\10\1\u015e\1\10\22\0\1\10\1\u015f"+
+    "\2\10\1\u0160\4\10\1\u0161\10\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\1\10\1\u0162\6\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\4\10\1\u0163\3\10\22\0\22\10\2\0"+
+    "\1\u0163\2\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\1\10\1\u0164\4\10\1\u0165\1\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+    "\1\u0166\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\10\1\u0167\6\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u0168\6\10\22\0\22\10\2\0\3\10"+
+    "\1\0\1\10\1\u0169\5\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\7\10\1\u016a\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\4\10\1\u016b\15\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\7\10\1\u016c\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\2\10\1\u016d\17\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\2\10\1\u013d\5\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\5\10\1\u016e\1\u016f\1\10\22\0\1\10"+
+    "\1\u0170\3\10\1\u0171\1\10\1\u0172\12\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\2\10\1\u0173\17\10\2\0\3\10\1\0\7\304\2\0"+
+    "\1\u0174\2\304\4\0\10\304\22\0\22\304\2\0\3\304"+
+    "\1\0\2\u0175\2\0\1\u0175\1\0\1\u0175\3\0\2\u0175"+
+    "\4\0\10\u0175\22\0\17\u0175\5\0\3\u0175\1\0\7\306"+
+    "\2\0\1\u0176\2\306\4\0\10\306\22\0\22\306\2\0"+
+    "\3\306\1\0\2\u0177\2\0\1\u0177\1\0\1\u0177\3\0"+
+    "\2\u0177\4\0\10\u0177\22\0\17\u0177\5\0\3\u0177\15\101"+
+    "\1\0\1\101\1\0\34\101\1\u0178\22\101\3\0\15\101"+
+    "\1\0\1\101\1\0\7\101\1\u0179\47\101\3\0\15\101"+
+    "\1\0\1\101\1\0\2\101\1\u017a\54\101\3\0\15\101"+
+    "\1\0\1\101\1\0\36\101\1\u017b\20\101\2\0\1\u017c"+
+    "\56\0\1\u017c\22\0\1\u017c\54\0\1\u017d\54\0\1\u017e"+
+    "\74\0\1\u017f\57\0\15\112\1\0\36\112\1\u0180\22\112"+
+    "\3\0\15\112\1\0\11\112\1\u0181\47\112\3\0\15\112"+
+    "\1\0\4\112\1\u0182\54\112\3\0\15\112\1\0\40\112"+
+    "\1\u0183\20\112\2\0\1\u0184\56\0\1\u0184\22\0\1\u0184"+
+    "\54\0\1\u0185\54\0\1\u0186\74\0\1\u0187\62\0\4\u0188"+
+    "\15\0\3\u0188\31\0\1\u0188\1\0\1\u0188\7\0\3\u0188"+
+    "\2\0\1\u0188\3\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\4\10\1\u0189\15\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u018a\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\1\10\1\u018b\6\10\22\0\1\134\21\10"+
+    "\2\0\1\10\1\134\1\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\2\10\1\u018c\5\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\1\10\1\u018d\20\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\2\10\1\134\5\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\3\10\1\u018e\4\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\4\10\1\u018f\15\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\11\10\1\160\10\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u0190\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u0191\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\5\10\1\u0192\2\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+    "\1\u0193\22\0\1\10\1\u0194\20\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\7\10\1\u0190\22\0"+
+    "\22\10\2\0\3\10\1\0\7\352\2\0\1\u0195\2\352"+
+    "\4\0\10\352\16\0\1\135\3\0\22\352\2\0\3\352"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\4\10\1\u0196\15\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\6\10\1\u0197\13\10"+
+    "\2\0\3\10\1\0\6\10\1\u0198\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\7\10\1\361\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\4\10\1\u0190\15\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\7\10"+
+    "\1\u0199\12\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\1\10\1\u0190\6\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+    "\1\u019a\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\2\10\1\u019b\17\10"+
+    "\2\0\3\10\14\0\1\u019c\66\0\7\10\2\0\1\122"+
+    "\2\10\4\0\1\10\1\u019d\6\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+    "\1\u019e\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\10\1\u019f\6\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\1\10\1\u01a0\20\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\6\10\1\u01a1\13\10\2\0\3\10\1\0\6\10\1\u01a2"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\7\10\1\u01a3\12\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\u01a4\4\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\5\10\1\254\2\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\7\10\1\u01a5\12\10\2\0\3\10\1\0\6\10\1\u01a6"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\2\10\1\u01a7\17\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\1\u0114\21\10"+
+    "\2\0\1\10\1\u0114\1\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\2\10\1\300\17\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\5\10\1\u01a8\14\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\5\10\1\u01a9\2\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\1\u013d\21\10\2\0\1\10\1\u013d"+
+    "\1\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\11\10\1\u01aa\10\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\5\10\1\u01ab"+
+    "\14\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\7\10\1\366\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\7\10\1\u01ac\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\3\10\1\u01ad\4\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\7\10\1\u01ae\12\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\5\10\1\u0153\14\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\2\10\1\u0173\5\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\6\10"+
+    "\1\u01af\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\1\u01b0\21\10\2\0\1\10"+
+    "\1\u01b0\1\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\6\10\1\u01b1\13\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\5\10\1\u01b2\2\10"+
+    "\22\0\22\10\2\0\3\10\1\0\4\10\1\u01b3\2\10"+
+    "\2\0\1\122\2\10\4\0\7\10\1\u01b4\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\2\10\1\u01b5\17\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\1\10\1\134\6\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\10\10\1\u01b6\11\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+    "\1\u01b7\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\7\10\1\u01b8"+
+    "\12\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u01b9\5\10\1\u01ba\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+    "\1\u01bb\22\0\5\10\1\u01bc\14\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\6\10\1\u01bd\1\10"+
+    "\22\0\5\10\1\u01be\14\10\2\0\3\10\1\0\4\10"+
+    "\1\u01bf\2\10\2\0\1\122\2\10\4\0\2\10\1\u013e"+
+    "\1\u013f\1\u01c0\1\u01c1\1\10\1\u01c2\22\0\1\10\1\u01c3"+
+    "\1\10\1\u01c4\1\10\1\u01c5\1\u01c6\1\u01c7\12\10\2\0"+
+    "\1\u01c0\1\10\1\u01c4\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\2\10\1\u01c8\5\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\7\10\1\u01c9\12\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u01ca\6\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\243\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\1\10\1\u01cb\6\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\3\10\1\u01cc\16\10\2\0"+
+    "\2\10\1\u01cc\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\5\10\1\u01cd\14\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\3\10\1\u01ce\4\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\7\10\1\u01cf\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\6\10\1\u01d0\13\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u01d1\6\10\22\0\22\10"+
+    "\2\0\3\10\62\0\1\u01d2\42\0\1\u01d3\106\0\1\u01d4"+
+    "\133\0\1\u01d5\72\0\1\u01d6\24\0\1\u01d6\63\0\1\u01d7"+
+    "\47\0\1\u01d8\131\0\1\u01d9\100\0\1\u0127\2\0\1\u01d2"+
+    "\47\0\1\u01da\27\0\1\u01db\44\0\1\u01dc\103\0\1\u01dd"+
+    "\51\0\1\u01dd\62\0\1\u01de\44\0\1\u01df\57\0\7\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\u01e0\4\10\22\0"+
+    "\7\10\1\u01e1\12\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\1\u01e2\21\10\2\0"+
+    "\1\10\1\u01e2\1\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\11\10\1\134\10\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\7\10\1\134\12\10\2\0\3\10\1\0\6\10\1\134"+
+    "\2\0\1\122\2\10\4\0\2\10\1\134\5\10\22\0"+
+    "\5\10\1\134\14\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\u013d\4\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\10\10\1\u01e3\11\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\3\10\1\u01e4\4\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\2\10\1\u01e5\5\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\2\10\1\u01e6\17\10\2\0\3\10\1\0\4\10"+
+    "\1\176\2\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\3\10\1\u01e7\4\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\2\10\1\u01e8\17\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\4\10\1\u01e9\3\10\22\0\5\10"+
+    "\1\u01ea\1\243\13\10\2\0\1\u01e9\2\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\10\1\u01eb\6\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u01ec\6\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\4\10\1\u013d\15\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\u01ed\4\10\22\0\22\10"+
+    "\2\0\3\10\1\0\4\10\1\u01ee\2\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\10\10"+
+    "\1\u01ef\11\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\6\10\1\134\13\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+    "\1\u01f0\2\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\13\10\1\134"+
+    "\6\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\3\10\1\u01f1\4\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\1\10\1\u01f2"+
+    "\6\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\7\10\1\u01f3\12\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u01f4\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\11\10"+
+    "\1\u01f5\10\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\3\10\1\134\4\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+    "\1\u01f6\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\10\1\u018b\6\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\5\10\1\u01f7\2\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\5\10\1\u01f8\14\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\132\6\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\6\10\1\u01f9\1\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\1\10\1\u01fa\6\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\5\10\1\u01fb\2\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\5\10\1\u01fc\14\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\u01fd"+
+    "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\6\10\1\u01fe\13\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\14\10\1\u01ff\5\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u0200\6\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\1\10\1\u0201\20\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\4\10\1\u0202\3\10"+
+    "\22\0\22\10\2\0\1\u0202\2\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\6\10\1\u0203\1\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\5\10\1\u0204\2\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\3\10\1\u0205\4\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\1\10\1\u01b9\1\10\1\u0206\3\10\1\u0207"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\1\10\1\u0208\2\10\1\u0209\1\10\1\u020a"+
+    "\1\10\22\0\3\10\1\u020b\1\10\1\u020c\1\10\1\u020d"+
+    "\12\10\2\0\1\u0209\1\10\1\u020b\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\6\10\1\u013d\13\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\1\10\1\u020e\1\u020f\2\10\1\u0210\1\10\1\u0211\22\0"+
+    "\2\10\1\u0212\3\10\1\u0213\1\u0214\4\10\1\u0215\5\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\7\10\1\u0216\22\0\22\10\2\0\3\10\1\0\6\10"+
+    "\1\u01f5\2\0\1\122\2\10\4\0\10\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\5\10\1\u0217\14\10\2\0\3\10\1\0"+
+    "\4\10\1\134\2\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\7\10\1\u0218\12\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+    "\1\u0219\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\2\10\1\u021a\5\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\6\10\1\u021b\13\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u021c"+
+    "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u013d\6\10\22\0\22\10"+
+    "\2\0\3\10\7\0\1\u021d\73\0\7\u0175\2\0\1\u021e"+
+    "\2\u0175\4\0\10\u0175\16\0\1\u021f\3\0\22\u0175\2\0"+
+    "\3\u0175\7\0\1\u0220\73\0\7\u0177\2\0\1\u0221\2\u0177"+
+    "\4\0\10\u0177\16\0\1\u0222\3\0\22\u0177\2\0\3\u0177"+
+    "\15\101\1\0\1\101\1\0\25\101\1\u0223\31\101\3\0"+
+    "\15\101\1\0\1\101\1\0\4\101\1\u0178\52\101\3\0"+
+    "\15\101\1\0\1\101\1\0\34\101\1\u0224\22\101\3\0"+
+    "\15\101\1\0\1\101\1\0\12\101\1\u0225\44\101\35\0"+
+    "\1\u0226\114\0\1\u0227\60\0\1\u017d\131\0\1\u0228\25\0"+
+    "\15\112\1\0\27\112\1\u0229\31\112\3\0\15\112\1\0"+
+    "\6\112\1\u0180\52\112\3\0\15\112\1\0\36\112\1\u022a"+
+    "\22\112\3\0\15\112\1\0\14\112\1\u022b\44\112\35\0"+
+    "\1\u022c\114\0\1\u022d\60\0\1\u0185\131\0\1\u022e\30\0"+
+    "\4\u022f\15\0\3\u022f\31\0\1\u022f\1\0\1\u022f\7\0"+
+    "\3\u022f\2\0\1\u022f\3\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\7\10\1\u0230\12\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\10\10\1\u0231\11\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\6\10\1\u0138\13\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\5\10\1\u0232\2\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\20\10"+
+    "\1\134\1\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\10\10\1\376\11\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+    "\1\u0233\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\7\10\1\u0234\12\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\10\10\1\u0235\11\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0236\5\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\1\10\1\u0237\6\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+    "\1\u0238\5\10\22\0\22\10\2\0\3\10\7\0\1\u0239"+
+    "\73\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\7\10\1\u023a\12\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\10\10\1\u023b\11\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\10\10\1\u023c\11\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\13\10"+
+    "\1\u023d\6\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\5\10\1\u023e\14\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\14\10\1\u023f\5\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0240"+
+    "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\6\10\1\u0241\13\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\6\10\1\u0173\13\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\2\10\1\u0147\5\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\2\10\1\u0242\1\u0243\4\10\22\0\2\10\1\u0244\3\10"+
+    "\1\u0240\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\2\10\1\u0245\5\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+    "\1\u0246\1\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\u0247\4\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\6\10\1\u0248\13\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\u0249"+
+    "\22\0\3\10\1\u024a\16\10\2\0\2\10\1\u024a\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u024b\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\2\10\1\u024c\5\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u024d\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\1\u024e\21\10"+
+    "\2\0\1\10\1\u024e\1\10\1\0\1\10\1\u024f\5\10"+
+    "\2\0\1\122\2\10\4\0\2\10\1\u0250\1\u0251\3\10"+
+    "\1\u0252\22\0\3\10\1\u0253\1\10\1\u0254\1\u0255\13\10"+
+    "\2\0\2\10\1\u0253\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\4\10\1\u0256\3\10\22\0\3\10\1\u0143\1\u01b9"+
+    "\1\u0254\14\10\2\0\1\u0256\1\10\1\u0143\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\5\10\1\u0257"+
+    "\14\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\2\10\1\u0258\17\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\3\10\1\u0259\16\10\2\0\2\10\1\u0259\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\14\10\1\u025a"+
+    "\5\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\2\10\1\u025b\5\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\2\10\1\u025c\17\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\4\10\1\134\15\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\7\10\1\u025d\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\u025e"+
+    "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\6\10\1\u025f\1\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u0260"+
+    "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\u0173\4\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u0107\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\5\10\1\u0261\2\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\3\10\1\u0147\4\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\1\10\1\u0262\7\10\1\u0263\10\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\u025b"+
+    "\5\10\22\0\13\10\1\u0264\6\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+    "\1\u0265\3\10\1\u0266\13\10\2\0\3\10\1\0\6\10"+
+    "\1\u0267\2\0\1\122\2\10\4\0\10\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\1\10\1\u0268\6\10\22\0\1\u0269\21\10\2\0\1\10"+
+    "\1\u0269\1\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\6\10\1\u026a\1\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+    "\1\u026b\17\10\2\0\3\10\1\0\6\10\1\u026c\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\6\10\1\u026d\13\10"+
+    "\2\0\3\10\1\0\6\10\1\u026e\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\15\10\1\u026f\4\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u0270"+
+    "\1\10\1\u0271\2\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\5\10"+
+    "\1\u0272\14\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\11\10\1\u0273\10\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\2\10\1\u0274\17\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\134\7\10\22\0\22\10"+
+    "\2\0\3\10\1\0\6\10\1\u0275\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\2\10\1\u0276\1\u0143\16\10\2\0"+
+    "\2\10\1\u0143\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u0277\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u0278\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\1\u0279\21\10\2\0\1\10"+
+    "\1\u0279\1\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\1\10\1\u027a\6\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\3\10\1\u0138\4\10"+
+    "\22\0\22\10\2\0\3\10\24\0\1\u027b\136\0\1\u027c"+
+    "\44\0\1\u0132\132\0\1\u027b\105\0\1\u0132\74\0\1\u027d"+
+    "\1\u027e\46\0\1\u027f\145\0\1\u0280\37\0\1\u0281\104\0"+
+    "\1\u0282\131\0\1\u0283\77\0\1\u0284\47\0\1\u0285\63\0"+
+    "\1\u0286\75\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+    "\1\u01b5\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\u0287\4\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\2\10\1\u0288\17\10\2\0\3\10"+
+    "\1\0\4\10\1\u0289\2\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\2\10\1\u028a\5\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\6\10\1\u028b\1\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\3\10"+
+    "\1\132\16\10\2\0\2\10\1\132\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\4\10\1\u028c\15\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\11\10\1\u0173\10\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\11\10"+
+    "\1\u028d\10\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\1\10\1\u028e\2\10\1\u028f\1\u0290\2\10"+
+    "\22\0\1\10\1\u0291\20\10\2\0\1\u028f\2\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\1\10"+
+    "\1\u0292\20\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\1\10\1\u0293\6\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\6\10\1\u0294\13\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\u0295"+
+    "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\4\10\1\u0296\15\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\134"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\3\10\1\u0297\4\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\6\10\1\u0298\13\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\2\10\1\u0299\5\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\5\10\1\u029a\2\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u029b"+
+    "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u029c\6\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\1\u029d\21\10\2\0\1\10\1\u029d\1\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\2\10\1\u029e\17\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\2\10\1\247\17\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\2\10\1\u029f\5\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\13\10"+
+    "\1\u02a0\6\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\10\10\1\u02a1\11\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+    "\1\u02a2\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\4\10\1\u02a3\3\10\22\0"+
+    "\22\10\2\0\1\u02a3\2\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\2\10\1\u02a4\5\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+    "\1\u02a5\1\10\22\0\6\10\1\u02a6\13\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\2\10\1\u023f\17\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\2\10\1\u02a7\17\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\2\10\1\u02a8\17\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\1\10\1\u02a9\6\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\5\10\1\u02aa\14\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\1\u02ab\21\10\2\0\1\10\1\u02ab\1\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\3\10\1\u02ac\4\10"+
+    "\22\0\22\10\2\0\3\10\1\0\6\10\1\u02ad\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\2\10\1\u02ae\17\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\5\10\1\u02af\2\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+    "\1\u02b0\17\10\2\0\3\10\1\0\6\10\1\u02b1\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u02b2"+
+    "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\6\10\1\u02b3\13\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u02b4\4\10\22\0\2\10\1\163\17\10\2\0"+
+    "\3\10\1\0\4\10\1\u02b5\2\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\u02b6\4\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\5\10\1\u02b7\14\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\13\10\1\u02b8\6\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\u02b9\4\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u02ba\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\5\10\1\u02bb\2\10"+
+    "\22\0\22\10\2\0\3\10\1\0\4\10\1\u02bc\2\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\7\10\1\u02bd\12\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\10\10\1\u02be"+
+    "\11\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\6\10\1\u02bf\13\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\11\10\1\u02c0\10\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\7\10\1\u02c1\22\0\22\10\2\0"+
+    "\3\10\3\0\4\u02c2\15\0\3\u02c2\31\0\1\u02c2\1\0"+
+    "\1\u02c2\7\0\3\u02c2\2\0\1\u02c2\11\0\1\u02c3\75\0"+
+    "\4\u02c4\15\0\3\u02c4\31\0\1\u02c4\1\0\1\u02c4\7\0"+
+    "\3\u02c4\2\0\1\u02c4\11\0\1\u02c5\72\0\14\101\1\u02c6"+
+    "\1\0\1\101\1\0\57\101\3\0\15\101\1\0\1\101"+
+    "\1\0\10\101\1\u0178\14\101\1\u0223\31\101\3\0\1\101"+
+    "\7\u0225\1\101\1\u0225\1\101\2\u0225\1\0\1\101\1\u02c7"+
+    "\15\u0225\1\101\1\u0225\2\101\5\u0225\2\101\25\u0225\2\101"+
+    "\3\u0226\1\0\1\u0226\1\u02c7\5\u0226\1\0\1\u02c7\1\0"+
+    "\2\u0226\2\0\2\u02c7\10\u0226\4\u02c7\1\0\1\u02c7\2\0"+
+    "\5\u02c7\2\0\3\u02c7\22\u0226\2\0\3\u0226\14\0\1\u02c8"+
+    "\115\0\1\u017d\14\0\1\u0227\34\0\14\112\1\u02c9\1\0"+
+    "\61\112\3\0\15\112\1\0\12\112\1\u0180\14\112\1\u0229"+
+    "\31\112\3\0\1\112\7\u022b\1\112\1\u022b\1\112\2\u022b"+
+    "\1\0\1\112\16\u022b\1\112\1\u022b\2\112\5\u022b\2\112"+
+    "\25\u022b\2\112\3\u022c\1\0\1\u022c\1\u02ca\5\u022c\1\0"+
+    "\1\u02ca\1\0\2\u022c\2\0\2\u02ca\10\u022c\4\u02ca\1\0"+
+    "\1\u02ca\2\0\5\u02ca\2\0\3\u02ca\22\u022c\2\0\3\u022c"+
+    "\14\0\1\u02cb\115\0\1\u0185\14\0\1\u022d\37\0\4\u02cc"+
+    "\15\0\3\u02cc\31\0\1\u02cc\1\0\1\u02cc\7\0\3\u02cc"+
+    "\2\0\1\u02cc\3\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\2\10\1\u02cd\17\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\1\10\1\u02ce\6\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\7\10\1\u02cf\12\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u02d0\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\340"+
+    "\17\10\2\0\3\10\1\0\6\10\1\u02d1\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\1\10\1\u02d2\6\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\5\10\1\u02d3\2\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\6\10\1\u02d4\13\10\2\0\3\10\3\0\4\u02d5"+
+    "\15\0\3\u02d5\31\0\1\u02d5\1\0\1\u02d5\7\0\3\u02d5"+
+    "\2\0\1\u02d5\3\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\1\10\1\u02d6\20\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\2\10\1\u02d7\5\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\2\10\1\u02d8\17\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u02d9\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\13\10\1\u02da"+
+    "\6\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\6\10\1\u013b\1\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\4\10\1\u02db\15\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\2\10\1\u02dc\5\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u02dd\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u02de\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\4\10\1\u02df\15\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\15\10\1\u02e0\4\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\6\10\1\u013d\1\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\7\10\1\u02e1\22\0\22\10\2\0\3\10\1\0"+
+    "\4\10\1\u02e2\2\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\1\u02e3\21\10\2\0\1\10"+
+    "\1\u02e3\1\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\5\10\1\302\2\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\7\10"+
+    "\1\u02e4\12\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\3\10\1\u02e5\4\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\2\10\1\u02e6\17\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u02e7"+
+    "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\5\10\1\u02e8\2\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u02e9"+
+    "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\2\10\1\u02ea\5\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u02eb\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\2\10\1\u02ec\5\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\6\10\1\u02ed\1\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\1\10\1\u01bd\20\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u02ee"+
+    "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\6\10\1\u02ef\1\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\15\10\1\u0153\4\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\2\10\1\u02f0\4\10\1\u02f1\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\7\10\1\u02f2\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\5\10\1\u02f3\2\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\12\10\1\u013b\7\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u02f4\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\7\10\1\u02f5\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\5\10\1\u02f6\2\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\1\u0173\7\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\1\10\1\u015a\20\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\14\10\1\u013d\5\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\1\10\1\u02f7\20\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\5\10\1\u02f8\14\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\6\10\1\u02f9\1\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\4\10\1\u0173\15\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u02fa\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\5\10\1\u02fb\2\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\3\10\1\u02fc\4\10\22\0\22\10\2\0\3\10"+
+    "\1\0\6\10\1\u02fd\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\4\10\1\u02fe\15\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+    "\1\u02ff\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\11\10\1\u0300"+
+    "\10\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u0301\6\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u0302"+
+    "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u0303\6\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\1\10\1\u0304\6\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\1\u0301"+
+    "\21\10\2\0\1\10\1\u0301\1\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\u0305\4\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\6\10\1\u0306\13\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u0307\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\4\10\1\u0308\15\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u0309\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\10\1\u030a\6\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\6\10\1\u030b\13\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\1\134\21\10\2\0\1\10\1\134\1\10\25\0\1\u0132"+
+    "\51\0\1\u0132\25\0\1\u0132\105\0\1\u030c\131\0\1\u030d"+
+    "\46\0\1\u030e\130\0\1\u030f\24\0\1\u030f\24\0\1\u0310"+
+    "\65\0\1\u0311\147\0\1\u0312\103\0\1\u01d4\103\0\1\u0313"+
+    "\101\0\1\u0129\21\0\7\10\2\0\1\122\2\10\4\0"+
+    "\7\10\1\u0114\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\164"+
+    "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\6\10\1\u0314\13\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\6\10\1\u0315\13\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\u0316\4\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\7\10\1\u02ab\12\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\1\10"+
+    "\1\u0317\20\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\14\10\1\u0318\5\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\2\10\1\u0319\17\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\6\10\1\u031a\1\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\2\10\1\u031b\5\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u031c"+
+    "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\2\10\1\u031d\5\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\2\10\1\u0114\5\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\6\10"+
+    "\1\u031e\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\5\10\1\u031f\14\10\2\0"+
+    "\3\10\1\0\6\10\1\u0320\2\0\1\122\2\10\4\0"+
+    "\2\10\1\u0321\5\10\22\0\2\10\1\u0244\17\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\3\10\1\u0322\16\10\2\0\2\10\1\u0322\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\7\10\1\u0323\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\6\10\1\134\1\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\4\10\1\u0114\15\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\u0324\4\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u0325\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u0326\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\3\10\1\u013f\4\10\22\0\22\10\2\0"+
+    "\3\10\1\0\4\10\1\u0327\2\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\u0328\4\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\3\10\1\u0139\4\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\2\10\1\u0329\17\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\6\10\1\u029a\13\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u032a\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u032b\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\4\10\1\u0153\15\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+    "\1\u032c\1\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\u032d\4\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u032e\6\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\6\10\1\u032f\13\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\11\10\1\u0330\10\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\6\10\1\u0331\1\10\22\0\4\10\1\u0332\15\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+    "\1\u0333\1\10\22\0\22\10\2\0\3\10\1\0\4\10"+
+    "\1\u0334\2\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\4\10\1\u0335\15\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\u0336"+
+    "\5\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\6\10\1\u0337\1\10\22\0\10\10"+
+    "\1\u0338\11\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\1\10\1\u0339\20\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u033a\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u033b"+
+    "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u033c\6\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\6\10\1\u033d\13\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\5\10\1\u014c\14\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\4\10\1\u033e\3\10\22\0\22\10\2\0\1\u033e\2\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\u033f"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\10\10\1\u0340\11\10\2\0"+
+    "\3\10\1\0\6\10\1\u0341\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\15\10\1\u0342\4\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\5\10\1\u0343\2\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\7\10"+
+    "\1\u0344\12\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\1\10\1\u0345\7\10\1\u0346"+
+    "\10\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\5\10\1\u0347\14\10\2\0\3\10"+
+    "\3\0\4\u0348\15\0\3\u0348\31\0\1\u0348\1\0\1\u0348"+
+    "\7\0\3\u0348\2\0\1\u0348\5\0\4\u0349\15\0\3\u0349"+
+    "\31\0\1\u0349\1\0\1\u0349\7\0\3\u0349\2\0\1\u0349"+
+    "\5\0\4\u034a\15\0\3\u034a\31\0\1\u034a\1\0\1\u034a"+
+    "\7\0\3\u034a\2\0\1\u034a\5\0\4\u034b\15\0\3\u034b"+
+    "\31\0\1\u034b\1\0\1\u034b\7\0\3\u034b\2\0\1\u034b"+
+    "\2\0\14\101\1\u0225\1\0\1\101\1\0\57\101\17\0"+
+    "\1\u0226\65\0\14\112\1\u022b\1\0\61\112\17\0\1\u022c"+
+    "\70\0\4\10\15\0\3\10\31\0\1\10\1\0\1\10"+
+    "\7\0\3\10\2\0\1\10\3\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\4\10\1\u034c\15\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\6\10\1\u034d\13\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u034e"+
+    "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\5\10\1\u034f\2\10\22\0\1\10\1\u0350\3\10"+
+    "\1\u0351\14\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\5\10\1\u0352\2\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\11\10\1\u0353\10\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\2\10\1\u0354\5\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\10\10\1\u0355\11\10\2\0\3\10"+
+    "\3\0\4\u0356\15\0\3\u0356\31\0\1\u0356\1\0\1\u0356"+
+    "\7\0\3\u0356\2\0\1\u0356\3\0\7\10\2\0\1\122"+
+    "\2\10\4\0\5\10\1\u0357\2\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+    "\1\u0358\2\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\351"+
+    "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\6\10\1\160\13\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u0359"+
+    "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\6\10\1\u031d\1\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\5\10\1\u0293\2\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\10\10"+
+    "\1\u035a\11\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\15\10\1\u035b\4\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\2\10\1\u035b\17\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\u0162\4\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u035c\6\10\22\0\22\10\2\0\3\10"+
+    "\1\0\6\10\1\u035d\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\3\10\1\u01a5\4\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+    "\1\u035e\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\10\10\1\u035f"+
+    "\11\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\6\10\1\u0360\13\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\4\10\1\u0361\15\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u0362\6\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\5\10\1\u0363\2\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0364\5\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\3\10\1\u0365\4\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\2\10\1\u0366\17\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0367"+
+    "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\2\10\1\u0368\5\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\6\10\1\u0369\13\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\6\10\1\u036a\13\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\13\10\1\u036b\6\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\6\10"+
+    "\1\u036c\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\4\10\1\u036d\15\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+    "\1\u036e\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\u036f\4\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\4\10\1\u0370\15\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\u013d"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\6\10\1\u0371\13\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+    "\1\u0372\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0373"+
+    "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u0374\6\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u0375"+
+    "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\10\10\1\u0376\11\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\7\10\1\u0377\12\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+    "\1\u0378\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\1\10\1\u0379\20\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\1\10\1\u037a\20\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\2\10\1\u037b\5\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\5\10\1\u037c\2\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u037d"+
+    "\1\10\1\u037e\2\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\7\10\1\u037f\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\4\10\1\u0380\15\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\2\10\1\u0276\17\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\7\10\1\u0381\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+    "\1\u0382\4\10\22\0\22\10\2\0\3\10\1\0\6\10"+
+    "\1\u0383\2\0\1\122\2\10\4\0\6\10\1\u0384\1\10"+
+    "\22\0\2\10\1\u0385\17\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\3\10\1\u0386"+
+    "\16\10\2\0\2\10\1\u0386\7\0\1\u0387\152\0\1\u0388"+
+    "\105\0\1\u0132\77\0\1\u027c\41\0\1\u0389\141\0\1\u01d4"+
+    "\76\0\1\u038a\46\0\1\u038b\56\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\6\10\1\u038c\13\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+    "\1\u038d\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\u038e\4\10\22\0"+
+    "\22\10\2\0\3\10\1\0\6\10\1\u013d\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\1\10"+
+    "\1\u038f\20\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\6\10\1\u014e\1\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+    "\1\u0390\1\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0391"+
+    "\13\10\2\0\3\10\1\0\6\10\1\u0392\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\14\10"+
+    "\1\134\5\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\2\10\1\u0153\5\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+    "\1\u029a\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\u0393"+
+    "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\3\10\1\u0394\4\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\2\10\1\u0395\17\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\1\u0396\21\10\2\0"+
+    "\1\10\1\u0396\1\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\4\10\1\u0397\2\10\1\u0398\22\0\7\10\1\u0399"+
+    "\12\10\2\0\1\u0397\2\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\5\10\1\u0365\14\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+    "\1\u039a\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\2\10\1\u039b\3\10"+
+    "\1\u01cb\13\10\2\0\3\10\1\0\6\10\1\u0361\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u039c"+
+    "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u039d\6\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u039e\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\7\10\1\u0217\22\0"+
+    "\1\10\1\u039f\20\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\2\10\1\u024c\5\10\22\0\2\10"+
+    "\1\u03a0\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\6\10\1\u0293\13\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\3\10\1\u013d\16\10\2\0\2\10\1\u013d\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\1\10"+
+    "\1\u03a1\20\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\6\10\1\u03a2\1\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\5\10\1\u03a3\14\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\u03a4\4\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\3\10\1\u03a5\4\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\7\10\1\u03a6\12\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\2\10\1\u03a7\5\10\22\0\2\10"+
+    "\1\u0378\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\15\10\1\u03a8\4\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\2\10\1\u03a9\17\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\11\10\1\u03aa"+
+    "\10\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\2\10\1\u03ab\5\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\u03ac"+
+    "\5\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\4\10\1\u03ad\3\10\22\0\22\10"+
+    "\2\0\1\u03ad\2\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\4\10\1\u03ae\15\10\2\0\3\10"+
+    "\1\0\4\10\1\u03af\2\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\4\10\1\u03b0\15\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u03b1\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\1\10\1\u03b2\6\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\3\10\1\u03b3\4\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+    "\1\u03b4\1\10\22\0\22\10\2\0\3\10\1\0\6\10"+
+    "\1\u03b5\2\0\1\122\2\10\4\0\10\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\5\10\1\u03b6\2\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\3\10\1\u03b7\4\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\2\10\1\u03b8\5\10\22\0\22\10\2\0"+
+    "\3\10\3\0\4\u03b9\15\0\3\u03b9\31\0\1\u03b9\1\0"+
+    "\1\u03b9\7\0\3\u03b9\2\0\1\u03b9\5\0\4\u03ba\15\0"+
+    "\3\u03ba\31\0\1\u03ba\1\0\1\u03ba\7\0\3\u03ba\2\0"+
+    "\1\u03ba\5\0\4\u03bb\15\0\3\u03bb\31\0\1\u03bb\1\0"+
+    "\1\u03bb\7\0\3\u03bb\2\0\1\u03bb\5\0\4\u03bc\15\0"+
+    "\3\u03bc\31\0\1\u03bc\1\0\1\u03bc\7\0\3\u03bc\2\0"+
+    "\1\u03bc\3\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\10\10\1\u03bd\11\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\4\10\1\u03be\3\10\22\0"+
+    "\22\10\2\0\1\u03be\2\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\3\10\1\u0266\4\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+    "\1\u03bf\1\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\5\10\1\241\2\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\6\10\1\u03c0\13\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\10\10\1\u0153\11\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\u03c1\4\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\1\10\1\u03c2\6\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\2\10\1\u03c3\5\10"+
+    "\22\0\22\10\2\0\3\10\3\0\4\u03c4\15\0\3\u03c4"+
+    "\31\0\1\u03c4\1\0\1\u03c4\7\0\3\u03c4\2\0\1\u03c4"+
+    "\3\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\11\10\1\u03c5\10\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\5\10\1\u03c6\2\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\7\10\1\u03c7\22\0\7\10\1\u03c8\12\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\u03c7"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\3\10\1\u03c9\4\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u03ca\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\u03cb"+
+    "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\13\10\1\u03cc\1\10\1\u03cd\4\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\4\10\1\u03ce\15\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+    "\1\u013d\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\1\10\1\u03cf\6\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\7\10\1\u03d0\12\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u03d1"+
+    "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\13\10\1\u013d\6\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\1\10\1\u03d2"+
+    "\6\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\7\10\1\u013b\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+    "\1\u0173\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\7\10\1\u03d3\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\6\10\1\u03d4\13\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u03d5"+
+    "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\4\10\1\u03d6\3\10\22\0\22\10\2\0\1\u03d6"+
+    "\2\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\7\10\1\u03d7\12\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u03d8"+
+    "\17\10\2\0\3\10\1\0\4\10\1\u03d9\2\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u01b9\2\10\1\u03da\3\10"+
+    "\22\0\7\10\1\u03db\12\10\2\0\1\u03da\2\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\10\10"+
+    "\1\u03dc\11\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\6\10\1\u03dd\1\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+    "\1\u03de\2\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\5\10\1\u0254"+
+    "\14\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\2\10\1\u03df\17\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u03e0"+
+    "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\2\10\1\u03e1\17\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\6\10\1\u03e2\13\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u03e3\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\2\10\1\u03e4\5\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+    "\1\u03e5\2\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\3\10\1\u03e6"+
+    "\16\10\2\0\2\10\1\u03e6\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\2\10\1\u03e7\17\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+    "\1\u03e8\22\0\22\10\2\0\3\10\1\0\4\10\1\u03e9"+
+    "\2\10\2\0\1\122\2\10\4\0\10\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\7\10\1\u0350\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\u03ea\3\10\1\u03eb"+
+    "\22\0\2\10\1\u0147\5\10\1\u03eb\11\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\1\10\1\u03ec"+
+    "\6\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\u03ed\7\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\4\10\1\u03ee\15\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u03ef"+
+    "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\4\10\1\u03f0\15\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\4\10\1\u03f1\4\10\1\u03f2\10\10\2\0\3\10\63\0"+
+    "\1\u03f3\45\0\1\u03f4\136\0\1\u03f5\100\0\1\u0132\75\0"+
+    "\1\232\23\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u03f6\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\u03f7\7\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u03f8\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\4\10\1\u02bc\2\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\5\10\1\u03f9\1\10\1\u03fa\12\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\10\10\1\u03fb\11\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\10\10\1\u03fc\11\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\2\10\1\u03fd\17\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\10\10"+
+    "\1\u03fe\11\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\5\10\1\247\14\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\6\10\1\u03ff\13\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0266"+
+    "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\1\u0400\21\10\2\0\1\10\1\u0400"+
+    "\1\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\2\10\1\u0401\17\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\10\1\376\6\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u0402\6\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u038d"+
+    "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\u0403\4\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\4\10\1\u0404\15\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0405\5\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\4\10\1\u0406\15\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\4\10"+
+    "\1\u0407\3\10\22\0\22\10\2\0\1\u0407\2\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\1\10"+
+    "\1\u0408\20\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\1\10\1\u0409\6\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u040a\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\6\10\1\u040b\1\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\6\10\1\u040c\13\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u040d"+
+    "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\u040e\4\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\1\10\1\u040f\6\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\6\10"+
+    "\1\u0287\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\14\10\1\u0410\5\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u0411\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0412"+
+    "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\3\10\1\u0413\3\10\1\u023d\22\0\2\10\1\u0414"+
+    "\13\10\1\u0415\3\10\2\0\3\10\1\0\6\10\1\u0416"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\6\10\1\u02b8\13\10\2\0\3\10\1\0\4\10"+
+    "\1\u0417\2\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u0418\6\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\u0419"+
+    "\5\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u041a\6\10\22\0\5\10"+
+    "\1\u041b\14\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\5\10\1\u041c\14\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\4\10\1\u041d\15\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\u03ed"+
+    "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\2\10\1\u0261\17\10\2\0\3\10"+
+    "\3\0\4\304\15\0\3\304\31\0\1\304\1\0\1\304"+
+    "\7\0\3\304\2\0\1\304\5\0\4\u041e\15\0\3\u041e"+
+    "\31\0\1\u041e\1\0\1\u041e\7\0\3\u041e\2\0\1\u041e"+
+    "\5\0\4\306\15\0\3\306\31\0\1\306\1\0\1\306"+
+    "\7\0\3\306\2\0\1\306\5\0\4\u041f\15\0\3\u041f"+
+    "\31\0\1\u041f\1\0\1\u041f\7\0\3\u041f\2\0\1\u041f"+
+    "\3\0\7\10\2\0\1\122\2\10\4\0\1\10\1\u01b9"+
+    "\6\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\2\10\1\u0397\5\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\6\10\1\u0420\1\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u0421\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\4\10\1\u0422\15\10\2\0"+
+    "\3\10\1\0\6\10\1\160\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\5\10\1\u0423\2\10\22\0\22\10"+
+    "\2\0\3\10\3\0\4\352\15\0\3\352\31\0\1\352"+
+    "\1\0\1\352\7\0\3\352\2\0\1\352\3\0\7\10"+
+    "\2\0\1\122\2\10\4\0\4\10\1\u028f\3\10\22\0"+
+    "\22\10\2\0\1\u028f\2\10\1\0\6\10\1\u0424\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\1\10\1\300"+
+    "\6\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\3\10\1\u0425\16\10"+
+    "\2\0\2\10\1\u0425\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\u0426\7\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\1\10\1\u0427\6\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\15\10\1\u0428\4\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+    "\1\u0262\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\5\10\1\u0429\2\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\3\10\1\u03ea\4\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\u042a"+
+    "\5\10\22\0\22\10\2\0\3\10\1\0\4\10\1\u042b"+
+    "\2\10\2\0\1\122\2\10\4\0\10\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\2\10\1\u03bd\5\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\3\10\1\u03d0\4\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\3\10\1\245\4\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u042c\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\1\10\1\u01ff"+
+    "\20\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\4\10\1\134\3\10\22\0\22\10\2\0\1\134"+
+    "\2\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\2\10\1\u042d\17\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\u042e"+
+    "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\13\10\1\u0264\6\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\6\10\1\u042f\13\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\5\10\1\u0430\2\10\22\0\22\10"+
+    "\2\0\3\10\1\0\6\10\1\u0431\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\300"+
+    "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u0432\6\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\5\10\1\u0433\14\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\15\10\1\u0434\4\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\4\10\1\u0435\15\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\3\10"+
+    "\1\u0436\16\10\2\0\2\10\1\u0436\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\7\10\1\u0437\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+    "\1\u0438\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\10\1\u0105\6\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\2\10\1\u0439\5\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u043a"+
+    "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\5\10\1\u043b\2\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\6\10\1\u043c\1\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u043d\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\3\10\1\u043e\4\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\7\10\1\u043f\12\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\10\1\u038d\6\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\2\10\1\u0385\17\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\10\10\1\134\11\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\7\10\1\u0440\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\6\10\1\u0441\13\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\5\10\1\u0442\2\10\22\0"+
+    "\2\10\1\u0443\17\10\2\0\3\10\55\0\1\u0444\33\0"+
+    "\1\u0445\120\0\1\u0446\54\0\7\10\2\0\1\122\2\10"+
+    "\4\0\4\10\1\u0447\3\10\22\0\22\10\2\0\1\u0447"+
+    "\2\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\2\10\1\u0448\17\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\7\10\1\u0449\22\0\10\10"+
+    "\1\u0449\11\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\6\10\1\u044a\13\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\2\10\1\u044b\17\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\2\10\1\u044c\5\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\2\10\1\u044d\17\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\4\10\1\u044e\15\10\2\0\3\10\1\0\4\10\1\u044f"+
+    "\2\10\2\0\1\122\2\10\4\0\3\10\1\u0450\3\10"+
+    "\1\u03c7\22\0\7\10\1\u03c8\12\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\3\10"+
+    "\1\134\16\10\2\0\2\10\1\134\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\6\10\1\u0451\13\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\2\10\1\u0452\5\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\11\10"+
+    "\1\u0453\10\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\7\10\1\u03bd\12\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u0454\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u0266"+
+    "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\2\10\1\u0455\17\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\2\10\1\u0456\17\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\5\10\1\u0457\2\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\2\10\1\u0458\17\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+    "\1\u0459\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\5\10\1\u045a\2\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\3\10\1\u03bd\16\10\2\0\2\10\1\u03bd\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u045b\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\2\10\1\u045c\5\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+    "\1\u045d\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\2\10\1\u045e\5\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\2\10\1\u045f\5\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\1\u0460\7\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\4\10\1\u0461\15\10\2\0"+
+    "\3\10\1\0\6\10\1\u0462\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u0463\6\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\6\10\1\u0464\13\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\6\10"+
+    "\1\u0465\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\7\10\1\u0466\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\u0467"+
+    "\5\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\6\10\1\u0468\13\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\1\10\1\u0469\6\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\14\10"+
+    "\1\u046a\5\10\2\0\3\10\3\0\4\u0175\15\0\3\u0175"+
+    "\31\0\1\u0175\1\0\1\u0175\7\0\3\u0175\2\0\1\u0175"+
+    "\5\0\4\u0177\15\0\3\u0177\31\0\1\u0177\1\0\1\u0177"+
+    "\7\0\3\u0177\2\0\1\u0177\3\0\4\10\1\u02bc\2\10"+
+    "\2\0\1\122\2\10\4\0\1\10\1\u01b9\5\10\1\u046b"+
+    "\22\0\2\10\1\u0395\2\10\1\u01bc\14\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\4\10\1\u046c"+
+    "\3\10\22\0\22\10\2\0\1\u046c\2\10\1\0\6\10"+
+    "\1\134\2\0\1\122\2\10\4\0\10\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\11\10\1\u01f1\10\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u046d\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\6\10\1\u046e\13\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+    "\1\u046f\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0470"+
+    "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\7\10\1\u0471\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\6\10\1\u0472\1\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\2\10\1\u0473\17\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\14\10\1\u0474\5\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\7\10\1\u0475"+
+    "\12\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\4\10\1\u0476\15\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\10\10\1\u0477\11\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\2\10\1\u0478\5\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\1\10\1\u0479\6\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\5\10\1\u047a\2\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\1\10\1\u047b\6\10\22\0\22\10\2\0"+
+    "\3\10\1\0\4\10\1\u03d9\2\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\5\10\1\u047c\2\10\22\0"+
+    "\22\10\2\0\3\10\1\0\6\10\1\u047d\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\6\10\1\u047e\1\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\1\10\1\u047f\6\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+    "\1\u0480\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\2\10\1\u0474\17\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\7\10\1\u0481\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\15\10\1\u013b"+
+    "\4\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\6\10\1\u0482\13\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\7\10\1\u0483\12\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u0484\6\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u0485\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\1\10\1\u0486\6\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\2\10\1\u0152\5\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\u0487"+
+    "\7\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\4\10\1\u0487\15\10"+
+    "\2\0\3\10\57\0\1\u0488\104\0\1\u0489\77\0\1\u048a"+
+    "\22\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u048b"+
+    "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\7\10\1\u03ed\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+    "\1\u048c\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\6\10\1\u028a\1\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\2\10\1\u048d\5\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u048e"+
+    "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\4\10\1\u048f\15\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\7\10\1\u0490\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u0147"+
+    "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\u0491\7\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0492\5\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\3\10\1\u0493\4\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+    "\1\243\2\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\10\1\u01b9\5\10\1\134"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\7\10\1\u0494\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u0495"+
+    "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u0496\6\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\6\10\1\u0497\13\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\11\10"+
+    "\1\u0498\10\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\7\10\1\u0499\12\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u040b\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\7\10\1\u049a\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\11\10\1\u013d\10\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\3\10\1\u049b\4\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\3\10\1\u049c\4\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\5\10\1\u049d\14\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\4\10\1\u049e\3\10\22\0"+
+    "\22\10\2\0\1\u049e\2\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\3\10\1\u049f\4\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u04a0\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\u013d\7\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\4\10\1\u03bd\15\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+    "\1\u04a1\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\5\10\1\u04a2\2\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\1\10\1\u04a3\20\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\375"+
+    "\10\10\1\u04a4\4\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\4\10\1\375\15\10"+
+    "\2\0\3\10\1\0\6\10\1\u04a5\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u04a6"+
+    "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\5\10\1\u027a\14\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\u04a7"+
+    "\5\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\5\10\1\u04a8\14\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\4\10\1\u01f1\15\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\1\10\1\u04a9\6\10"+
+    "\22\0\22\10\2\0\3\10\1\0\6\10\1\u013b\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+    "\1\0\4\10\1\u04aa\2\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u013b\6\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\2\10\1\u04ab\17\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\10\10"+
+    "\1\u04ac\11\10\2\0\3\10\1\0\6\10\1\243\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\5\10\1\u04ad\14\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\5\10\1\u013d\2\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\10\10\1\u02e0\11\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\2\10\1\u04ae\5\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\2\10\1\u04af\5\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\4\10\1\u04b0\15\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u04b1"+
+    "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u04b2\6\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\u04b3"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\1\10\1\u039f\13\10\1\u04b4"+
+    "\4\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\5\10\1\u04b5\14\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\1\10\1\u01b9"+
+    "\2\10\1\u04b6\2\10\1\u01b4\22\0\2\10\1\u04b7\17\10"+
+    "\2\0\1\u04b6\2\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u04b8\6\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\5\10\1\u01a5"+
+    "\2\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\2\10\1\u04b9\17\10"+
+    "\2\0\3\10\62\0\1\u04ba\43\0\1\u0488\100\0\1\u01d6"+
+    "\57\0\7\10\2\0\1\122\2\10\4\0\5\10\1\u04bb"+
+    "\2\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u03bd\6\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\2\10\1\u04bc\5\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\7\10\1\u04bd\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\7\10\1\164\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\1\10\1\u04be\6\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\1\10\1\u04bf\20\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u04c0\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\5\10\1\u04c1"+
+    "\14\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\300\1\10\1\u04c2\4\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u046a\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\1\u046a"+
+    "\21\10\2\0\1\10\1\u046a\1\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\4\10\1\u040b\15\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u04c3\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\7\10"+
+    "\1\u04c4\12\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\2\10\1\u04c5\17\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u04c6\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\10\10\1\u04c7"+
+    "\11\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\6\10\1\u04c8\1\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\6\10\1\u04c9\13\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\7\10\1\u04ca\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\6\10\1\u04cb\13\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u04cc"+
+    "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\7\10\1\u04cd\12\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\14\10\1\u04ce\5\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\u04cf\4\10\22\0\22\10"+
+    "\2\0\3\10\1\0\4\10\1\u04d0\2\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0138\5\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\7\10\1\u013d\12\10\2\0"+
+    "\3\10\1\0\6\10\1\u04d1\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\2\10\1\u04d2\5\10\22\0\22\10"+
+    "\2\0\3\10\1\0\6\10\1\u04d3\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\2\10\1\u03ee\5\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\2\10\1\u04d4\17\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u04d5"+
+    "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\2\10\1\u04d6\17\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\5\10\1\u0418\14\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\6\10\1\u04d7\1\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\4\10\1\u04bb\15\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\14\10\1\u04d8\5\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u04d9"+
+    "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\13\10\1\u04da\6\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u04db"+
+    "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\4\10\1\u04dc\15\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\5\10\1\u04dd\2\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\11\10"+
+    "\1\u04de\10\10\2\0\3\10\55\0\1\u027c\25\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\10\10\1\u013d"+
+    "\11\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\3\10\1\u04df\4\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\u04e0"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\5\10\1\u04e1\2\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+    "\1\u04e2\2\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\5\10\1\u04e3"+
+    "\14\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u04e4\6\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\5\10\1\u013d\14\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\6\10\1\u04e5\1\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\2\10\1\u04e6\5\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\6\10"+
+    "\1\u04e7\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\2\10\1\u04e8\5\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+    "\1\u04e9\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\5\10\1\u04ea\2\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\2\10\1\u04ea\5\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\1\10\1\u04eb"+
+    "\6\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\4\10\1\u04ec\15\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\4\10\1\u04ed\15\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\3\10\1\u04ee\4\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\2\10\1\u04ef\5\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+    "\1\u04f0\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\5\10\1\u01bc"+
+    "\14\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u04f1\6\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\2\10\1\u04f2\17\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\1\10\1\u04f3\6\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\11\10\1\u0350\10\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\7\10\1\u04f4\22\0"+
+    "\22\10\2\0\3\10\1\0\4\10\1\u04f5\2\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\6\10\1\u04f6\13\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\1\10\1\u013b\20\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u032f\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\6\10"+
+    "\1\u04f7\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\5\10\1\u04f8\2\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+    "\1\u04f9\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\2\10\1\u04fa\17\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\2\10\1\u04fb\17\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\10\10"+
+    "\1\u04ed\11\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\4\10\1\u04b6\3\10\22\0\22\10\2\0"+
+    "\1\u04b6\2\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\6\10\1\u04fc\1\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u04fd\15\10\2\0\3\10\1\0\6\10\1\u0173\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\6\10\1\u04fe\13\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\6\10\1\u04ff\13\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\3\10\1\u0500\4\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+    "\1\u04c3\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\14\10\1\u0501\5\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\6\10\1\u0502\13\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\11\10\1\u0503"+
+    "\10\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\2\10\1\u0504\17\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\17\10\3\134\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\13\10\1\u03cc\6\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\11\10\1\u0505\10\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u0506"+
+    "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\7\10\1\u01fa\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+    "\1\u0507\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\4\10\1\u04f8\15\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+    "\1\u0508\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\u0509\4\10\22\0"+
+    "\22\10\2\0\3\10\1\0\6\10\1\u050a\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\5\10\1\u04a7\2\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\1\10\1\u050b\20\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\10\10\1\u038d\11\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\10\1\u050c\6\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\6\10\1\u038d\1\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\12\10\1\u02a2\7\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\6\10\1\u050d\1\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\7\10\1\u035b\12\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0262\5\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\5\10\1\u050e\14\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+    "\1\u038d\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\2\10\1\u014a\17\10"+
+    "\2\0\3\10\1\0\6\10\1\u050f\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\5\10\1\u04ca\2\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\6\10\1\u01b5\13\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\5\10\1\u0510"+
+    "\2\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\10\10\1\u0511\11\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\6\10\1\u0512\13\10\2\0\3\10\1\0"+
+    "\1\10\1\u0513\5\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\6\10\1\u0514\1\10\22\0\22\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+    "\1\u039c\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\1\10\1\u0515\6\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\1\10\1\u0516\6\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\300"+
+    "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\5\10\1\u0246\2\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\4\10\1\u0139\15\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0517\5\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\1\u03ed\21\10\2\0\1\10"+
+    "\1\u03ed\1\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\4\10\1\u0518\15\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\1\10\1\u0519\1\u051a"+
+    "\2\10\1\u051b\1\10\1\u051c\22\0\1\u051d\3\10\1\u03f1"+
+    "\1\10\1\u051e\13\10\2\0\1\10\1\u051d\1\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\3\10\1\u051f\4\10"+
+    "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\2\10\1\u0520\17\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\14\10\1\u0521\5\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\10\10\22\0\13\10\1\u038d"+
+    "\6\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\6\10\1\u0522\1\10\22\0\22\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u0523"+
+    "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\3\10\1\u0524\4\10\22\0\22\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\2\10\1\200\5\10\22\0\22\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\14\10"+
+    "\1\220\5\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\2\10\1\u0525\17\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\4\10"+
+    "\1\u0526\3\10\22\0\22\10\2\0\1\u0526\2\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\5\10"+
+    "\1\u015a\14\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+    "\2\10\4\0\10\10\22\0\11\10\1\u01b4\10\10\2\0"+
+    "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+    "\22\0\1\10\1\u039c\20\10\2\0\3\10\1\0\7\10"+
+    "\2\0\1\122\2\10\4\0\3\10\1\u0527\4\10\22\0"+
+    "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+    "\4\0\10\10\22\0\11\10\1\370\10\10\2\0\3\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\5\10\1\u0528"+
+    "\2\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\7\10\1\u0529\12\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\4\10\1\u0199\3\10\22\0\22\10\2\0\1\u0199\2\10"+
+    "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+    "\15\10\1\u052a\4\10\2\0\3\10\1\0\7\10\2\0"+
+    "\1\122\2\10\4\0\10\10\22\0\7\10\1\u019f\12\10"+
+    "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+    "\10\10\22\0\7\10\1\u01e1\12\10\2\0\3\10\1\0"+
+    "\7\10\2\0\1\122\2\10\4\0\3\10\1\u0246\4\10"+
+    "\22\0\22\10\2\0\3\10";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[84678];
+    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 =
+    "\6\0\1\11\5\1\2\11\2\1\1\11\12\1\1\11"+
+    "\5\1\1\11\1\1\1\11\15\1\1\11\1\1\1\11"+
+    "\2\1\1\11\2\1\2\11\3\1\2\11\1\1\1\11"+
+    "\10\1\1\11\6\1\1\0\12\1\1\11\5\1\1\0"+
+    "\55\1\1\0\1\1\13\0\45\1\1\11\1\1\1\0"+
+    "\1\1\1\0\1\11\4\1\4\0\4\1\5\0\20\1"+
+    "\1\0\11\1\1\0\62\1\10\0\1\1\2\0\1\11"+
+    "\3\0\76\1\4\0\4\1\4\0\4\1\5\0\14\1"+
+    "\1\0\6\1\1\11\65\1\16\0\75\1\2\0\1\11"+
+    "\2\0\1\11\4\1\2\0\4\1\3\0\11\1\1\0"+
+    "\101\1\14\0\73\1\4\0\1\1\2\0\1\1\3\0"+
+    "\10\1\1\0\66\1\7\0\65\1\4\0\12\1\1\0"+
+    "\60\1\5\0\55\1\4\0\7\1\1\0\56\1\3\0"+
+    "\50\1\2\0\44\1\3\0\101\1\3\0\57\1\1\0"+
+    "\160\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[1322];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public NSISTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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 = YYINITIAL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR_LITERAL;
+				break;
+			case Token.LITERAL_BACKQUOTE:
+				state = BACKTICKS;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				break;
+		}
+
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+		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 NSISTokenMaker(java.io.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 NSISTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 204) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 37: break;
+        case 34: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 38: break;
+        case 29: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 39: break;
+        case 19: 
+          { /* Line ending in '\' => continue to next line. */
+							addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE);
+							return firstToken;
+          }
+        case 40: break;
+        case 27: 
+          { /* Skip all escaped chars. */
+          }
+        case 41: break;
+        case 24: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 42: break;
+        case 3: 
+          { start = zzMarkedPos-1; yybegin(STRING);
+          }
+        case 43: break;
+        case 32: 
+          { addToken(Token.FUNCTION);
+          }
+        case 44: break;
+        case 8: 
+          { addToken(Token.VARIABLE);
+          }
+        case 45: break;
+        case 16: 
+          { /* Line ending in '\' => continue to next line. */
+							addToken(start,zzStartRead, Token.LITERAL_CHAR);
+							return firstToken;
+          }
+        case 46: break;
+        case 14: 
+          { /* Line ending in '\' => continue to next line. */
+							addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+							return firstToken;
+          }
+        case 47: break;
+        case 17: 
+          { addToken(start,zzStartRead-1, Token.ERROR_CHAR); return firstToken;
+          }
+        case 48: break;
+        case 18: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+          }
+        case 49: break;
+        case 25: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 50: break;
+        case 26: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 51: break;
+        case 6: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 52: break;
+        case 30: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 53: break;
+        case 10: 
+          { start = zzMarkedPos-1; yybegin(CHAR_LITERAL);
+          }
+        case 54: break;
+        case 2: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 55: break;
+        case 28: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 56: break;
+        case 4: 
+          { start = zzMarkedPos-1; yybegin(EOL_COMMENT);
+          }
+        case 57: break;
+        case 21: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE);
+          }
+        case 58: break;
+        case 13: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 59: break;
+        case 15: 
+          { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); return firstToken;
+          }
+        case 60: break;
+        case 31: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 61: break;
+        case 35: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 62: break;
+        case 20: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+          }
+        case 63: break;
+        case 23: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 64: break;
+        case 9: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 65: break;
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 66: break;
+        case 22: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 67: break;
+        case 7: 
+          { addToken(Token.OPERATOR);
+          }
+        case 68: break;
+        case 36: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 69: break;
+        case 33: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 70: break;
+        case 11: 
+          { start = zzMarkedPos-1; yybegin(BACKTICKS);
+          }
+        case 71: break;
+        case 12: 
+          { 
+          }
+        case 72: 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 1323: break;
+            case STRING: {
+              addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); return firstToken;
+            }
+            case 1324: break;
+            case CHAR_LITERAL: {
+              addToken(start,zzStartRead-1, Token.ERROR_CHAR); return firstToken;
+            }
+            case 1325: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 1326: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 1327: break;
+            case BACKTICKS: {
+              addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+            }
+            case 1328: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.flex
new file mode 100644
index 0000000..bcb9e1d
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.flex
@@ -0,0 +1,2319 @@
+/*
+ * 01/28/2009
+ *
+ * PHPTokenMaker.java - Generates tokens for PHP syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for PHP files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated PHPTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+%%
+
+%public
+%class PHPTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Type specific to PHPTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	private static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to PHPTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	private static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to PHPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed HTML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	private static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to PHPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code><script></code> tag.
+	 */
+	private static final int INTERNAL_INTAG_SCRIPT			= -4;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * script tag.
+	 */
+	private static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * script tag.
+	 */
+	private static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+	/**
+	 * Token type specifying that the user has
+	 * ended a line with an unclosed <code><style></code> tag.
+	 */
+	private static final int INTERNAL_INTAG_STYLE			= -7;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * style tag.
+	 */
+	private static final int INTERNAL_ATTR_DOUBLE_QUOTE_STYLE = -8;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * style tag.
+	 */
+	private static final int INTERNAL_ATTR_SINGLE_QUOTE_STYLE = -9;
+
+	/**
+	 * Token type specifying we're in JavaScript.
+	 */
+	private static final int INTERNAL_IN_JS					= -10;
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	private static final int INTERNAL_IN_JS_MLC				= -11;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	private static final int INTERNAL_IN_JS_STRING_INVALID	= -12;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	private static final int INTERNAL_IN_JS_STRING_VALID		= -13;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	private static final int INTERNAL_IN_JS_CHAR_INVALID	= -14;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	private static final int INTERNAL_IN_JS_CHAR_VALID		= -15;
+
+	/**
+	 * Internal type denoting a line ending in CSS.
+	 */
+	private static final int INTERNAL_CSS					= -16;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property.
+	 */
+	private static final int INTERNAL_CSS_PROPERTY			= -17;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property value.
+	 */
+	private static final int INTERNAL_CSS_VALUE				= -18;
+
+	/**
+	 * Internal type denoting line ending in a CSS double-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	private static final int INTERNAL_CSS_STRING				= -(1<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS single-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	private static final int INTERNAL_CSS_CHAR				= -(2<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS multi-line comment.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	private static final int INTERNAL_CSS_MLC				= -(3<<11);
+
+	/**
+	 * Token type specifying we're in PHP.  This particular field is public so
+	 * that we can hack and key off of it for code completion.
+	 */
+	public static final int INTERNAL_IN_PHP					= -(4<<11);
+
+	/**
+	 * Token type specifying we're in a PHP multiline comment.
+	 */
+	private static final int INTERNAL_IN_PHP_MLC				= -(5<<11);
+
+	/**
+	 * Token type specifying we're in a PHP multiline string.
+	 */
+	private static final int INTERNAL_IN_PHP_STRING				= -(6<<11);
+
+	/**
+	 * Token type specifying we're in a PHP multiline char.
+	 */
+	private static final int INTERNAL_IN_PHP_CHAR				= -(7<<11);
+
+	/**
+	 * The state previous CSS-related state we were in before going into a CSS
+	 * string, multi-line comment, etc.
+	 */
+	private int cssPrevState;
+
+	/**
+	 * Whether closing markup tags are automatically completed for PHP.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * The state PHP was started in (YYINITIAL, INTERNAL_IN_JS, etc.).
+	 */
+	private int phpInState;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+	/**
+	 * Language state set on HTML tokens.  Must be 0.
+	 */
+	private static final int LANG_INDEX_DEFAULT = 0;
+
+	/**
+	 * Language state set on JavaScript tokens.
+	 */
+	private static final int LANG_INDEX_JS = 1;
+
+	/**
+	 * Language state set on CSS tokens.
+	 */
+	private static final int LANG_INDEX_CSS = 2;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PHPTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.FUNCTION || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * 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;
+		phpInState = YYINITIAL; // Shouldn't be necessary
+		cssPrevState = CSS; // Shouldn't be necessary
+		int languageIndex = LANG_INDEX_DEFAULT;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.MARKUP_COMMENT:
+				state = COMMENT;
+				break;
+			case Token.VARIABLE:
+				state = DTD;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				break;
+			case INTERNAL_INTAG_STYLE:
+				state = INTAG_STYLE;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_STYLE:
+				state = INATTR_DOUBLE_STYLE;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_STYLE:
+				state = INATTR_SINGLE_STYLE;
+				break;
+			case INTERNAL_IN_JS:
+				state = JAVASCRIPT;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = false;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = true;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = false;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = true;
+				break;
+			case INTERNAL_CSS:
+				state = CSS;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			case INTERNAL_CSS_PROPERTY:
+				state = CSS_PROPERTY;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			case INTERNAL_CSS_VALUE:
+				state = CSS_VALUE;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_PHPxxx - phpInState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_PHP:
+							state = PHP;
+							phpInState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_IN_PHP_MLC:
+							state = PHP_MLC;
+							phpInState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_IN_PHP_STRING:
+							state = PHP_STRING;
+							phpInState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_IN_PHP_CHAR:
+							state = PHP_CHAR;
+							phpInState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_CSS_STRING:
+							state = CSS_STRING;
+							languageIndex = LANG_INDEX_CSS;
+							cssPrevState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_CSS_CHAR:
+							state = CSS_CHAR_LITERAL;
+							languageIndex = LANG_INDEX_CSS;
+							cssPrevState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_CSS_MLC:
+							state = CSS_C_STYLE_COMMENT;
+							languageIndex = LANG_INDEX_CSS;
+							cssPrevState = -initialTokenType&0xff;
+							break;
+					}
+				}
+				else {
+					state = Token.NULL;
+				}
+				break;
+		}
+
+		setLanguageIndex(languageIndex);
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * 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(java.io.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;
+	}
+
+
+%}
+
+// HTML-specific stuff.
+Whitespace					= ([ \t\f]+)
+LineTerminator				= ([\n])
+Identifier					= ([^ \t\n<&]+)
+EntityReference					= ([&][^; \t]*[;]?)
+InTagIdentifier				= ([^ \t\n\"\'/=>]+)
+EndScriptTag				= ("</" [sS][cC][rR][iI][pP][tT] ">")
+EndStyleTag					= ("</" [sS][tT][yY][lL][eE] ">")
+
+
+// General stuff.
+Letter							= [A-Za-z]
+NonzeroDigit					= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit						= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+LetterOrUnderscore				= ({Letter}|"_")
+LetterOrUnderscoreOrDash		= ({LetterOrUnderscore}|[\-])
+
+
+// JavaScript stuff.
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({Letter}|"_"|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+JS_MLCBegin				= "/*"
+JS_MLCEnd					= "*/"
+JS_LineCommentBegin			= "//"
+JS_IntegerHelper1			= (({NonzeroDigit}{Digit}*)|"0")
+JS_IntegerHelper2			= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+JS_IntegerLiteral			= ({JS_IntegerHelper1}[lL]?)
+JS_HexLiteral				= ({JS_IntegerHelper2}[lL]?)
+JS_FloatHelper1			= ([fFdD]?)
+JS_FloatHelper2			= ([eE][+-]?{Digit}+{JS_FloatHelper1})
+JS_FloatLiteral1			= ({Digit}+"."({JS_FloatHelper1}|{JS_FloatHelper2}|{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2})))
+JS_FloatLiteral2			= ("."{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2}))
+JS_FloatLiteral3			= ({Digit}+{JS_FloatHelper2})
+JS_FloatLiteral			= ({JS_FloatLiteral1}|{JS_FloatLiteral2}|{JS_FloatLiteral3}|({Digit}+[fFdD]))
+JS_ErrorNumberFormat		= (({JS_IntegerLiteral}|{JS_HexLiteral}|{JS_FloatLiteral}){NonSeparator}+)
+JS_Separator				= ([\(\)\{\}\[\]\]])
+JS_Separator2				= ([\;,.])
+JS_NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+JS_AssignmentOperator		= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+JS_Operator				= ({JS_NonAssignmentOperator}|{JS_AssignmentOperator})
+JS_Identifier				= ({IdentifierStart}{IdentifierPart}*)
+JS_ErrorIdentifier			= ({NonSeparator}+)
+JS_Regex					= ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[gim]*)
+BooleanLiteral				= ("true"|"false")
+
+
+// PHP stuff (most PHP stuff is shared with JS for simplicity)
+PHP_Start					= ("<?""php"?)
+LetterOrUnderscoreOrDigit	= ({LetterOrUnderscore}|{Digit})
+PHP_Variable				= ("$"{LetterOrUnderscore}{LetterOrUnderscoreOrDigit}*)
+PHP_LineCommentBegin		= ("//"|[#])
+
+
+// CSS stuff.
+CSS_SelectorPiece			= (("*"|"."|{LetterOrUnderscoreOrDash})({LetterOrUnderscoreOrDash}|"."|{Digit})*)
+CSS_PseudoClass				= (":"("root"|"nth-child"|"nth-last-child"|"nth-of-type"|"nth-last-of-type"|"first-child"|"last-child"|"first-of-type"|"last-of-type"|"only-child"|"only-of-type"|"empty"|"link"|"visited"|"active"|"hover"|"focus"|"target"|"lang"|"enabled"|"disabled"|"checked"|":first-line"|":first-letter"|":before"|":after"|"not"))
+CSS_AtKeyword				= ("@"{CSS_SelectorPiece})
+CSS_Id						= ("#"{CSS_SelectorPiece})
+CSS_Separator				= ([;\(\)\[\]])
+CSS_MlcStart				= ({JS_MLCBegin})
+CSS_MlcEnd					= ({JS_MLCEnd})
+CSS_Property				= ([\*]?{LetterOrUnderscoreOrDash}({LetterOrUnderscoreOrDash}|{Digit})*)
+CSS_ValueChar				= ({LetterOrUnderscoreOrDash}|[\\/])
+CSS_Value					= ({CSS_ValueChar}*)
+CSS_Function				= ({CSS_Value}\()
+CSS_Digits					= ([\-]?{Digit}+([0-9\.]+)?(pt|pc|in|mm|cm|em|ex|px|ms|s|%)?)
+CSS_Hex						= ("#"[0-9a-fA-F]+)
+CSS_Number					= ({CSS_Digits}|{CSS_Hex})
+
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscoreOrDigit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state COMMENT
+%state DTD
+%state INTAG
+%state INTAG_CHECK_TAG_NAME
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state INTAG_SCRIPT
+%state INATTR_DOUBLE_SCRIPT
+%state INATTR_SINGLE_SCRIPT
+%state INTAG_STYLE
+%state INATTR_DOUBLE_STYLE
+%state INATTR_SINGLE_STYLE
+%state JAVASCRIPT
+%state JS_CHAR
+%state JS_STRING
+%state JS_MLC
+%state JS_EOL_COMMENT
+%state PHP
+%state PHP_MLC
+%state PHP_STRING
+%state PHP_CHAR
+%state CSS
+%state CSS_PROPERTY
+%state CSS_VALUE
+%state CSS_STRING
+%state CSS_CHAR_LITERAL
+%state CSS_C_STYLE_COMMENT
+
+
+%%
+
+<YYINITIAL> {
+	"<!--"						{ start = zzMarkedPos-4; yybegin(COMMENT); }
+	"<"[sS][cC][rR][iI][pP][tT]	{
+								  addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+								}
+	"<"[sS][tT][yY][lL][eE]		{
+								  addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-5,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; cssPrevState = zzLexicalState; yybegin(INTAG_STYLE);
+								}
+	"<!"						{ start = zzMarkedPos-2; yybegin(DTD); }
+	{PHP_Start}					{ addToken(Token.MARKUP_TAG_DELIMITER); phpInState = zzLexicalState; yybegin(PHP); }
+	"<"({Letter}|{Digit})+		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+									yybegin(INTAG_CHECK_TAG_NAME);
+								}
+	"</"({Letter}|{Digit})+		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-2); //yypushback(count-2);
+									yybegin(INTAG_CHECK_TAG_NAME);
+								}
+	"<"							{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	"</"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	{LineTerminator}			{ addNullToken(); return firstToken; }
+	{Identifier}				{ addToken(Token.IDENTIFIER); } // Catches everything.
+	{EntityReference}				{ addToken(Token.MARKUP_ENTITY_REFERENCE); }
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	<<EOF>>					{ addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+	[^hwf\n\-]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos; }
+	[hwf]					{}
+	"-->"					{ yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); }
+	"-"						{}
+	{LineTerminator} |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken; }
+}
+
+<DTD> {
+	[^\n>]+					{}
+	">"						{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD); }
+	{LineTerminator} |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken; }
+}
+
+<INTAG_CHECK_TAG_NAME> {
+	[Aa] |
+	[aA][bB][bB][rR] |
+	[aA][cC][rR][oO][nN][yY][mM] |
+	[aA][dD][dD][rR][eE][sS][sS] |
+	[aA][pP][pP][lL][eE][tT] |
+	[aA][rR][eE][aA] |
+	[aA][rR][tT][iI][cC][lL][eE] |
+	[aA][sS][iI][dD][eE] |
+	[aA][uU][dD][iI][oO] |
+	[bB] |
+	[bB][aA][sS][eE] |
+	[bB][aA][sS][eE][fF][oO][nN][tT] |
+	[bB][dD][oO] |
+	[bB][gG][sS][oO][uU][nN][dD] |
+	[bB][iI][gG] |
+	[bB][lL][iI][nN][kK] |
+	[bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE] |
+	[bB][oO][dD][yY] |
+	[bB][rR] |
+	[bB][uU][tT][tT][oO][nN] |
+	[cC][aA][nN][vV][aA][sS] |
+	[cC][aA][pP][tT][iI][oO][nN] |
+	[cC][eE][nN][tT][eE][rR] |
+	[cC][iI][tT][eE] |
+	[cC][oO][dD][eE] |
+	[cC][oO][lL] |
+	[cC][oO][lL][gG][rR][oO][uU][pP] |
+	[cC][oO][mM][mM][aA][nN][dD] |
+	[cC][oO][mM][mM][eE][nN][tT] |
+	[dD][dD] |
+	[dD][aA][tT][aA][gG][rR][iI][dD] |
+	[dD][aA][tT][aA][lL][iI][sS][tT] |
+	[dD][aA][tT][aA][tT][eE][mM][pP][lL][aA][tT][eE] |
+	[dD][eE][lL] |
+	[dD][eE][tT][aA][iI][lL][sS] |
+	[dD][fF][nN] |
+	[dD][iI][aA][lL][oO][gG] |
+	[dD][iI][rR] |
+	[dD][iI][vV] |
+	[dD][lL] |
+	[dD][tT] |
+	[eE][mM] |
+	[eE][mM][bB][eE][dD] |
+	[eE][vV][eE][nN][tT][sS][oO][uU][rR][cC][eE] |
+	[fF][iI][eE][lL][dD][sS][eE][tT] |
+	[fF][iI][gG][uU][rR][eE] |
+	[fF][oO][nN][tT] |
+	[fF][oO][oO][tT][eE][rR] |
+	[fF][oO][rR][mM] |
+	[fF][rR][aA][mM][eE] |
+	[fF][rR][aA][mM][eE][sS][eE][tT] |
+	[hH][123456] |
+	[hH][eE][aA][dD] |
+	[hH][eE][aA][dD][eE][rR] |
+	[hH][rR] |
+	[hH][tT][mM][lL] |
+	[iI] |
+	[iI][fF][rR][aA][mM][eE] |
+	[iI][lL][aA][yY][eE][rR] |
+	[iI][mM][gG] |
+	[iI][nN][pP][uU][tT] |
+	[iI][nN][sS] |
+	[iI][sS][iI][nN][dD][eE][xX] |
+	[kK][bB][dD] |
+	[kK][eE][yY][gG][eE][nN] |
+	[lL][aA][bB][eE][lL] |
+	[lL][aA][yY][eE][rR] |
+	[lL][eE][gG][eE][nN][dD] |
+	[lL][iI] |
+	[lL][iI][nN][kK] |
+	[mM][aA][pP] |
+	[mM][aA][rR][kK] |
+	[mM][aA][rR][qQ][uU][eE][eE] |
+	[mM][eE][nN][uU] |
+	[mM][eE][tT][aA] |
+	[mM][eE][tT][eE][rR] |
+	[mM][uU][lL][tT][iI][cC][oO][lL] |
+	[nN][aA][vV] |
+	[nN][eE][sS][tT] |
+	[nN][oO][bB][rR] |
+	[nN][oO][eE][mM][bB][eE][dD] |
+	[nN][oO][fF][rR][aA][mM][eE][sS] |
+	[nN][oO][lL][aA][yY][eE][rR] |
+	[nN][oO][sS][cC][rR][iI][pP][tT] |
+	[oO][bB][jJ][eE][cC][tT] |
+	[oO][lL] |
+	[oO][pP][tT][gG][rR][oO][uU][pP] |
+	[oO][pP][tT][iI][oO][nN] |
+	[oO][uU][tT][pP][uU][tT] |
+	[pP] |
+	[pP][aA][rR][aA][mM] |
+	[pP][lL][aA][iI][nN][tT][eE][xX][tT] |
+	[pP][rR][eE] |
+	[pP][rR][oO][gG][rR][eE][sS][sS] |
+	[qQ] |
+	[rR][uU][lL][eE] |
+	[sS] |
+	[sS][aA][mM][pP] |
+	[sS][cC][rR][iI][pP][tT] |
+	[sS][eE][cC][tT][iI][oO][nN] |
+	[sS][eE][lL][eE][cC][tT] |
+	[sS][eE][rR][vV][eE][rR] |
+	[sS][mM][aA][lL][lL] |
+	[sS][oO][uU][rR][cC][eE] |
+	[sS][pP][aA][cC][eE][rR] |
+	[sS][pP][aA][nN] |
+	[sS][tT][rR][iI][kK][eE] |
+	[sS][tT][rR][oO][nN][gG] |
+	[sS][tT][yY][lL][eE] |
+	[sS][uU][bB] |
+	[sS][uU][pP] |
+	[tT][aA][bB][lL][eE] |
+	[tT][bB][oO][dD][yY] |
+	[tT][dD] |
+	[tT][eE][xX][tT][aA][rR][eE][aA] |
+	[tT][fF][oO][oO][tT] |
+	[tT][hH] |
+	[tT][hH][eE][aA][dD] |
+	[tT][iI][mM][eE] |
+	[tT][iI][tT][lL][eE] |
+	[tT][rR] |
+	[tT][tT] |
+	[uU] |
+	[uU][lL] |
+	[vV][aA][rR] |
+	[vV][iI][dD][eE][oO]    { addToken(Token.MARKUP_TAG_NAME); }
+	{InTagIdentifier}		{ /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG); }
+	.						{ /* Shouldn't happen */ yypushback(1); yybegin(INTAG); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INTAG> {
+	{PHP_Start}				{ addToken(Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); }
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	"/>"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	">"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+	{PHP_Start}					{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+	[^\"<]*						{}
+	"<"							{ /* Allowing "<?" and "<?php" to start PHP */ }
+	[\"]						{ addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+	{PHP_Start}					{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+	[^\'<]*						{}
+	"<"							{ /* Allowing "<?" and "<?php" to start PHP */ }
+	[\']						{ addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<INTAG_SCRIPT> {
+	{PHP_Start}				{ addToken(Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	"/>"					{	addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	">"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JAVASCRIPT, LANG_INDEX_JS); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken; }
+}
+
+<INATTR_DOUBLE_SCRIPT> {
+	{PHP_Start}					{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+	[^\"<]*						{}
+	"<"							{ /* Allowing "<?" and "<?php" to start PHP */ }
+	[\"]						{ addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG_SCRIPT); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INATTR_SINGLE_SCRIPT> {
+	{PHP_Start}					{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+	[^\'<]*						{}
+	"<"							{ /* Allowing "<?" and "<?php" to start PHP */ }
+	[\']						{ addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG_SCRIPT); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INTAG_STYLE> {
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	"/>"					{	addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	">"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(CSS, LANG_INDEX_CSS); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_STYLE); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE_STYLE); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_STYLE); return firstToken; }
+}
+
+<INATTR_DOUBLE_STYLE> {
+	[^\"]*						{}
+	[\"]						{ yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_STYLE); return firstToken; }
+}
+
+<INATTR_SINGLE_STYLE> {
+	[^\']*						{}
+	[\']						{ yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_STYLE); return firstToken; }
+}
+
+<JAVASCRIPT> {
+
+	{EndScriptTag}					{
+								  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+								}
+
+	// ECMA 3+ keywords.
+	"break" |
+	"continue" |
+	"delete" |
+	"else" |
+	"for" |
+	"function" |
+	"if" |
+	"in" |
+	"new" |
+	"this" |
+	"typeof" |
+	"var" |
+	"void" |
+	"while" |
+	"with"						{ addToken(Token.RESERVED_WORD); }
+	"return"					{ addToken(Token.RESERVED_WORD_2); }
+
+	//JavaScript 1.6
+	"each" 						{if(JavaScriptTokenMaker.isJavaScriptCompatible("1.6")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+	//JavaScript 1.7
+	"let" 						{if(JavaScriptTokenMaker.isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+
+	// Reserved (but not yet used) ECMA keywords.
+	"abstract"					{ addToken(Token.RESERVED_WORD); }
+	"boolean"						{ addToken(Token.DATA_TYPE); }
+	"byte"						{ addToken(Token.DATA_TYPE); }
+	"case"						{ addToken(Token.RESERVED_WORD); }
+	"catch"						{ addToken(Token.RESERVED_WORD); }
+	"char"						{ addToken(Token.DATA_TYPE); }
+	"class"						{ addToken(Token.RESERVED_WORD); }
+	"const"						{ addToken(Token.RESERVED_WORD); }
+	"debugger"					{ addToken(Token.RESERVED_WORD); }
+	"default"						{ addToken(Token.RESERVED_WORD); }
+	"do"							{ addToken(Token.RESERVED_WORD); }
+	"double"						{ addToken(Token.DATA_TYPE); }
+	"enum"						{ addToken(Token.RESERVED_WORD); }
+	"export"						{ addToken(Token.RESERVED_WORD); }
+	"extends"						{ addToken(Token.RESERVED_WORD); }
+	"final"						{ addToken(Token.RESERVED_WORD); }
+	"finally"						{ addToken(Token.RESERVED_WORD); }
+	"float"						{ addToken(Token.DATA_TYPE); }
+	"goto"						{ addToken(Token.RESERVED_WORD); }
+	"implements"					{ addToken(Token.RESERVED_WORD); }
+	"import"						{ addToken(Token.RESERVED_WORD); }
+	"instanceof"					{ addToken(Token.RESERVED_WORD); }
+	"int"						{ addToken(Token.DATA_TYPE); }
+	"interface"					{ addToken(Token.RESERVED_WORD); }
+	"long"						{ addToken(Token.DATA_TYPE); }
+	"native"						{ addToken(Token.RESERVED_WORD); }
+	"package"						{ addToken(Token.RESERVED_WORD); }
+	"private"						{ addToken(Token.RESERVED_WORD); }
+	"protected"					{ addToken(Token.RESERVED_WORD); }
+	"public"						{ addToken(Token.RESERVED_WORD); }
+	"short"						{ addToken(Token.DATA_TYPE); }
+	"static"						{ addToken(Token.RESERVED_WORD); }
+	"super"						{ addToken(Token.RESERVED_WORD); }
+	"switch"						{ addToken(Token.RESERVED_WORD); }
+	"synchronized"					{ addToken(Token.RESERVED_WORD); }
+	"throw"						{ addToken(Token.RESERVED_WORD); }
+	"throws"						{ addToken(Token.RESERVED_WORD); }
+	"transient"					{ addToken(Token.RESERVED_WORD); }
+	"try"						{ addToken(Token.RESERVED_WORD); }
+	"volatile"					{ addToken(Token.RESERVED_WORD); }
+	"null"						{ addToken(Token.RESERVED_WORD); }
+
+	// Literals.
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+	"NaN"						{ addToken(Token.RESERVED_WORD); }
+	"Infinity"					{ addToken(Token.RESERVED_WORD); }
+
+	// Functions.
+	"eval" |
+	"parseInt" |
+	"parseFloat" |
+	"escape" |
+	"unescape" |
+	"isNaN" |
+	"isFinite"					{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addEndToken(INTERNAL_IN_JS); return firstToken; }
+	{JS_Identifier}				{ addToken(Token.IDENTIFIER); }
+	{Whitespace}					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	[\']							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
+	[\"]							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
+
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{JS_MLCBegin}					{ start = zzMarkedPos-2; yybegin(JS_MLC); }
+	{JS_LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
+
+	/* Attempt to identify regular expressions (not foolproof) - do after comments! */
+	{JS_Regex}						{
+										boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+									}
+
+	/* Separators. */
+	{JS_Separator}					{ addToken(Token.SEPARATOR); }
+	{JS_Separator2}				{ addToken(Token.IDENTIFIER); }
+
+	{PHP_Start}					{ addToken(Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+
+	/* Operators. */
+	{JS_Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{JS_IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{JS_HexLiteral}				{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{JS_FloatLiteral}				{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{JS_ErrorNumberFormat}			{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{JS_ErrorIdentifier}			{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<JS_STRING> {
+	[^\n\\\"]+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+							}
+	\"						{ int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_CHAR> {
+	[^\n\\\']+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+							}
+	\'						{ int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_MLC> {
+	// JavaScript MLC's.  This state is essentially Java's MLC state.
+	[^hwf<\n\*]+			{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+	{EndScriptTag}			{
+							  yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+							}
+	"<"						{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+	{JS_MLCEnd}					{ yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+}
+
+
+<JS_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]					{}
+	{EndScriptTag}			{
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+							  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+							}
+	"<"						{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+}
+
+
+<CSS> {
+	{EndStyleTag}		{
+						  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+						  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+						  addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+						  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+						}
+	{CSS_SelectorPiece}	{ addToken(Token.DATA_TYPE); }
+	{CSS_PseudoClass}	{ addToken(Token.RESERVED_WORD); }
+	":"					{ /* Unknown pseudo class */ addToken(Token.DATA_TYPE); }
+	{CSS_AtKeyword}		{ addToken(Token.REGEX); }
+	{CSS_Id}			{ addToken(Token.VARIABLE); }
+	"{"					{ addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY); }
+	[,]					{ addToken(Token.IDENTIFIER); }
+	\"					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+	\'					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+	[+>~\^$\|=]			{ addToken(Token.OPERATOR); }
+	{CSS_Separator}		{ addToken(Token.SEPARATOR); }
+	{Whitespace}		{ addToken(Token.WHITESPACE); }
+	{CSS_MlcStart}		{ start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+	.					{ /*System.out.println("CSS: " + yytext());*/ addToken(Token.IDENTIFIER); }
+	"\n" |
+	<<EOF>>				{ addEndToken(INTERNAL_CSS); return firstToken; }
+}
+
+<CSS_PROPERTY> {
+	{EndStyleTag}		{
+						  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+						  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+						  addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+						  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+						}
+	{CSS_Property}		{ addToken(Token.RESERVED_WORD); }
+	"}"					{ addToken(Token.SEPARATOR); yybegin(CSS); }
+	":"					{ addToken(Token.OPERATOR); yybegin(CSS_VALUE); }
+	{Whitespace}		{ addToken(Token.WHITESPACE); }
+	{CSS_MlcStart}		{ start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+	.					{ /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER); }
+	"\n" |
+	<<EOF>>				{ addEndToken(INTERNAL_CSS_PROPERTY); return firstToken; }
+}
+
+<CSS_VALUE> {
+	{EndStyleTag}		{
+						  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+						  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+						  addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+						  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+						}
+	{CSS_Value}			{ addToken(Token.IDENTIFIER); }
+	"!important"		{ addToken(Token.ANNOTATION); }
+	{CSS_Function}		{ int temp = zzMarkedPos - 2;
+						  addToken(zzStartRead, temp, Token.FUNCTION);
+						  addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+						  zzStartRead = zzCurrentPos = zzMarkedPos;
+						}
+	{CSS_Number}		{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	\"					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+	\'					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+	")"					{ /* End of a function */ addToken(Token.SEPARATOR); }
+	[;]					{ addToken(Token.OPERATOR); yybegin(CSS_PROPERTY); }
+	[,\.]				{ addToken(Token.IDENTIFIER); }
+	"}"					{ addToken(Token.SEPARATOR); yybegin(CSS); }
+	{Whitespace}		{ addToken(Token.WHITESPACE); }
+	{CSS_MlcStart}		{ start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+	.					{ /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER); }
+	"\n" |
+	<<EOF>>				{ addEndToken(INTERNAL_CSS_VALUE); return firstToken; }
+}
+
+<CSS_STRING> {
+	[^\n\\\"]+			{}
+	\\.?				{ /* Skip escaped chars. */ }
+	\"					{ addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState); }
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken; }
+}
+
+<CSS_CHAR_LITERAL> {
+	[^\n\\\']+			{}
+	\\.?				{ /* Skip escaped chars. */ }
+	\'					{ addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState); }
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken; }
+}
+
+<CSS_C_STYLE_COMMENT> {
+	[^hwf\n\*]+			{}
+	{URL}				{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]				{}
+	{CSS_MlcEnd}		{ addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState); }
+	\*					{}
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken; }
+}
+
+
+<PHP> {
+
+	"?>"						{ addToken(Token.MARKUP_TAG_DELIMITER); start = zzMarkedPos; yybegin(phpInState); }
+
+	/* Error control operator */
+	("@"{JS_Identifier})		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.FUNCTION);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+								}
+
+	/* Keywords */
+	"__CLASS__" |
+	"__DIR__" |
+	"__FILE__" |
+	"__FUNCTION__" |
+	"__METHOD__" |
+	"__NAMESPACE__" |
+	"abstract" |
+	"and" |
+	"array" |
+	"as" |
+	"break" |
+	"case" |
+	"catch" |
+	"cfunction" |
+	"class" |
+	"clone" |
+	"const" |
+	"continue" |
+	"declare" |
+	"default" |
+	"die" |
+	"do" |
+	"echo" |
+	"else" |
+	"elseif" |
+	"empty" |
+	"enddeclare" |
+	"endfor" |
+	"endforeach" |
+	"endif" |
+	"endswitch" |
+	"endwhile" |
+	"eval" |
+	"extends" |
+	"final" |
+	"for" |
+	"foreach" |
+	"function" |
+	"global" |
+	"goto" |
+	"if" |
+	"implements" |
+	"include" |
+	"include_once" |
+	"interface" |
+	"instanceof" |
+	"isset" |
+	"list" |
+	"namespace" |
+	"new" |
+	"old_function" |
+	"or" |
+	"print" |
+	"private" |
+	"protected" |
+	"public" |
+	"require" |
+	"require_once" |
+	"static" |
+	"switch" |
+	"throw" |
+	"try" |
+	"unset" |
+	"use" |
+	"var" |
+	"while" |
+	"xor" |
+
+	"parent" |
+	"self" |
+	"stdClass"					{ addToken(Token.RESERVED_WORD); }
+
+	"exit" |
+	"return"					{ addToken(Token.RESERVED_WORD_2); }
+
+	/* Functions */
+	"__call" |
+	"__construct" |
+	"__getfunctions" |
+	"__getlastrequest" |
+	"__getlastresponse" |
+	"__gettypes" |
+	"__tostring" |
+	"abs" |
+	"acos" |
+	"acosh" |
+	"add" |
+	("add"("_namespace"|"_root"|"action"|"color"|"cslashes"|"entry"|"fill"|"function"|"shape"|"slashes"|"string")) |
+	"aggregate" |
+	"aggregate_info" |
+	"aggregate_methods" |
+	"aggregate_methods_by_list" |
+	"aggregate_methods_by_regexp" |
+	"aggregate_properties" |
+	"aggregate_properties_by_list" |
+	"aggregate_properties_by_regexp" |
+	"aggregation_info" |
+	"align" |
+	("apd_"("breakpoint"|"callstack"|"clunk"|"continue"|"croak"|"dump_function_table"|"dump_persistent_resources"|"dump_regular_resources"|"echo"|"get_active_symbols"|"set_pprof_trace"|"set_session"|"set_session_trace"|"set_socket_session_trace")) |
+	"append" |
+	"append_child" |
+	"append_sibling" |
+	"appendchild" |
+	"appenddata" |
+	("array_"("change_key_case"|"chunk"|"combine"|"count_values"|"diff"|"diff_assoc"|"diff_key"|"diff_uassoc"|"diff_ukey"|"fill"|"filter"|"flip"|"intersect"|"intersect_assoc"|"intersect_key"|"intersect_uassoc"|"intersect_ukey"|"key_exists"|"keys"|"map"|"merge"|"merge_recursive"|"multisort"|"pad"|"pop"|"push"|"rand"|"reduce"|"reverse"|"search"|"shift"|"slice"|"splice"|"sum"|"udiff"|"udiff_assoc"|"udiff_uassoc"|"uintersect"|"uintersect_assoc"|"uintersect_uassoc"|"unique"|"unshift"|"values"|"w [...]
+	"arsort" |
+	"ascii2ebcdic" |
+	"asin" |
+	"asinh" |
+	"asort" |
+	"assert" |
+	"assert_options" |
+	"assign" |
+	"assignelem" |
+	"asxml" |
+	"atan" |
+	"atan2" |
+	"atanh" |
+	"attreditable" |
+	"attributes" |
+	"base64_decode" |
+	"base64_encode" |
+	"base_convert" |
+	"basename" |
+	"bcadd" |
+	"bccomp" |
+	"bcdiv" |
+	"bcmod" |
+	"bcmul" |
+	"bcpow" |
+	"bcpowmod" |
+	"bcscale" |
+	"bcsqrt" |
+	"bcsub" |
+	"begintransaction" |
+	"bin2hex" |
+	"bind_textdomain_codeset" |
+	"bindcolumn" |
+	"bindec" |
+	"bindparam" |
+	"bindtextdomain" |
+	"bzclose" |
+	"bzcompress" |
+	"bzdecompress" |
+	"bzerrno" |
+	"bzerror" |
+	"bzerrstr" |
+	"bzflush" |
+	"bzopen" |
+	"bzread" |
+	"bzwrite" |
+	"cal_days_in_month" |
+	"cal_from_jd" |
+	"cal_info" |
+	"cal_to_jd" |
+	"call_user_func" |
+	"call_user_func_array" |
+	"call_user_method" |
+	"call_user_method_array" |
+	("ccvs_"("add"|"auth"|"command"|"count"|"delete"|"done"|"init"|"lookup"|"new"|"report"|"return"|"reverse"|"sale"|"status"|"textvalue"|"void")) |
+	"ceil" |
+	"chdir" |
+	"checkdate" |
+	"checkdnsrr" |
+	"checkin" |
+	"checkout" |
+	"chgrp" |
+	"child_nodes" |
+	"children" |
+	"chmod" |
+	"chop" |
+	"chown" |
+	"chr" |
+	"chroot" |
+	"chunk_split" |
+	"class_exists" |
+	"class_implements" |
+	"class_parents" |
+	"classkit_import" |
+	"classkit_method_add" |
+	"classkit_method_copy" |
+	"classkit_method_redefine" |
+	"classkit_method_remove" |
+	"classkit_method_rename" |
+	"clearstatcache" |
+	"clone_node" |
+	"clonenode" |
+	"close" |
+	"closedir" |
+	"closelog" |
+	"com" |
+	"commit" |
+	"compact" |
+	"connect" |
+	"connection_aborted" |
+	"connection_status" |
+	"connection_timeout" |
+	"constant" |
+	"content" |
+	"convert_cyr_string" |
+	"convert_uudecode" |
+	"convert_uuencode" |
+	"copy" |
+	"cos" |
+	"cosh" |
+	"count" |
+	"count_chars" |
+	"crack_check" |
+	"crack_closedict" |
+	"crack_getlastmessage" |
+	"crack_opendict" |
+	"crc32" |
+	("create"("_attribute"|"_cdata_section"|"_comment"|"_element"|"_element_ns"|"_entity_reference"|"_function"|"_processing_instruction"|"_text_node"|"attribute"|"attributens"|"cdatasection"|"comment"|"document"|"documentfragment"|"documenttype"|"element"|"elementns"|"entityreference"|"processinginstruction"|"textnode")) |
+	"crypt" |
+	("curl_"("close"|"copy_handle"|"errno"|"error"|"exec"|"getinfo"|"init"|"multi_add_handle"|"multi_close"|"multi_exec"|"multi_getcontent"|"multi_info_read"|"multi_init"|"multi_remove_handle"|"multi_select"|"setopt"|"version")) |
+	"current" |
+	"cybercash_base64_decode" |
+	"cybercash_base64_encode" |
+	"cybercash_decr" |
+	"cybercash_encr" |
+	"cyrus_authenticate" |
+	"cyrus_bind" |
+	"cyrus_close" |
+	"cyrus_connect" |
+	"cyrus_query" |
+	"cyrus_unbind" |
+	"data" |
+	"date" |
+	"date_sunrise" |
+	"date_sunset" |
+	"dblist" |
+	"dbmclose" |
+	"dbmdelete" |
+	"dbmexists" |
+	"dbmfetch" |
+	"dbmfirstkey" |
+	"dbminsert" |
+	"dbmnextkey" |
+	"dbmopen" |
+	"dbmreplace" |
+	"dbstat" |
+	"dcgettext" |
+	"dcngettext" |
+	"dcstat" |
+	"deaggregate" |
+	"debug_backtrace" |
+	"debug_print_backtrace" |
+	"debug_zval_dump" |
+	"debugger_off" |
+	"debugger_on" |
+	"decbin" |
+	"dechex" |
+	"decoct" |
+	"decrement" |
+	"define" |
+	"define_syslog_variables" |
+	"defined" |
+	"deg2rad" |
+	"delete" |
+	"deletedata" |
+	"description" |
+	"dgettext" |
+	("dio_"("close"|"fcntl"|"open"|"read"|"seek"|"stat"|"tcsetattr"|"truncate"|"write")) |
+	"dir" |
+	"dirname" |
+	"disk_free_space" |
+	"disk_total_space" |
+	"diskfreespace" |
+	"dl" |
+	"dngettext" |
+	"dns_check_record" |
+	"dns_get_mx" |
+	"dns_get_record" |
+	"doctype" |
+	"document_element" |
+	"dom_import_simplexml" |
+	("domxml_"("new_doc"|"open_file"|"open_mem"|"version"|"xmltree"|"xslt_stylesheet"|"xslt_stylesheet_doc"|"xslt_stylesheet_file")) |
+	"dotnet" |
+	"dotnet_load" |
+	"doubleval" |
+	"drawcurve" |
+	"drawcurveto" |
+	"drawline" |
+	"drawlineto" |
+	"dstanchors" |
+	"dstofsrcanchors" |
+	"dump_file" |
+	"dump_mem" |
+	"dump_node" |
+	"each" |
+	"easter_date" |
+	"easter_days" |
+	"ebcdic2ascii" |
+	"end" |
+	"entities" |
+	"eof" |
+	"erase" |
+	"ereg" |
+	"ereg_replace" |
+	"eregi" |
+	"eregi_replace" |
+	"error_log" |
+	"error_reporting" |
+	"errorcode" |
+	"errorinfo" |
+	"escapeshellarg" |
+	"escapeshellcmd" |
+	"exec" |
+	"execute" |
+	"exif_imagetype" |
+	"exif_read_data" |
+	"exif_tagname" |
+	"exif_thumbnail" |
+	"exp" |
+	"explode" |
+	"expm1" |
+	"export" |
+	"extension_loaded" |
+	"extract" |
+	"ezmlm_hash" |
+	"fclose" |
+	"feof" |
+	"fetch" |
+	"fetchall" |
+	"fetchsingle" |
+	"fflush" |
+	"fgetc" |
+	"fgetcsv" |
+	"fgets" |
+	"fgetss" |
+	"file" |
+	("file"("_exists"|"_get_contents"|"_put_contents"|"atime"|"ctime"|"group"|"inode"|"mtime"|"owner"|"perms"|"pro"|"pro_fieldcount"|"pro_fieldname"|"pro_fieldtype"|"pro_fieldwidth"|"pro_retrieve"|"pro_rowcount"|"size"|"type")) |
+	"find" |
+	"first_child" |
+	"floatval" |
+	"flock" |
+	"floor" |
+	"flush" |
+	"fmod" |
+	"fnmatch" |
+	"fopen" |
+	"fpassthru" |
+	"fprintf" |
+	"fputcsv" |
+	"fputs" |
+	"fread" |
+	"free" |
+	"frenchtojd" |
+	"fribidi_log2vis" |
+	"fscanf" |
+	"fseek" |
+	"fsockopen" |
+	"fstat" |
+	"ftell" |
+	"ftok" |
+	("ftp_"("alloc"|"cdup"|"chdir"|"chmod"|"close"|"connect"|"delete"|"exec"|"fget"|"fput"|"get"|"get_option"|"login"|"mdtm"|"mkdir"|"nb_continue"|"nb_fget"|"nb_fput"|"nb_get"|"nb_put"|"nlist"|"pasv"|"put"|"pwd"|"quit"|"raw"|"rawlist"|"rename"|"rmdir"|"set_option"|"site"|"size"|"ssl_connect"|"systype")) |
+	"ftruncate" |
+	"ftstat" |
+	"func_get_arg" |
+	"func_get_args" |
+	"func_num_args" |
+	"function_exists" |
+	"fwrite" |
+	"gd_info" |
+	"get" |
+	("get"("_attr"|"_attribute"|"_attribute_node"|"_browser"|"_cfg_var"|"_class"|"_class_methods"|"_class_vars"|"_content"|"_current_user"|"_declared_classes"|"_declared_interfaces"|"_defined_constants"|"_defined_functions"|"_defined_vars"|"_element_by_id"|"_elements_by_tagname"|"_extension_funcs"|"_headers"|"_html_translation_table"|"_include_path"|"_included_files"|"_loaded_extensions"|"_magic_quotes_gpc"|"_magic_quotes_runtime"|"_meta_tags"|"_nodes"|"_object_vars"|"_parent_class"|"_requi [...]
+	"glob" |
+	"gmdate" |
+	"gmmktime" |
+	("gmp_"("abs"|"add"|"and"|"clrbit"|"cmp"|"com"|"div"|"div_q"|"div_qr"|"div_r"|"divexact"|"fact"|"gcd"|"gcdext"|"hamdist"|"init"|"intval"|"invert"|"jacobi"|"legendre"|"mod"|"mul"|"neg"|"or"|"perfect_square"|"popcount"|"pow"|"powm"|"prob_prime"|"random"|"scan0"|"scan1"|"setbit"|"sign"|"sqrt"|"sqrtrem"|"strval"|"sub"|"xor")) |
+	"gmstrftime" |
+	"gregoriantojd" |
+	("gz"("close"|"compress"|"deflate"|"encode"|"eof"|"file"|"getc"|"gets"|"getss"|"inflate"|"open"|"passthru"|"puts"|"read"|"rewind"|"seek"|"tell"|"uncompress"|"write")) |
+	"handle" |
+	("has"("_attribute"|"_attributes"|"_child_nodes"|"attribute"|"attributens"|"attributes"|"childnodes"|"children"|"feature"|"next"|"siblings")) |
+	"header" |
+	"headers_list" |
+	"headers_sent" |
+	"hebrev" |
+	"hebrevc" |
+	"hexdec" |
+	"highlight_file" |
+	"highlight_string" |
+	"html_dump_mem" |
+	"html_entity_decode" |
+	"htmlentities" |
+	"htmlspecialchars" |
+	"http_build_query" |
+	("hw_"("array2objrec"|"changeobject"|"children"|"childrenobj"|"close"|"connect"|"connection_info"|"cp"|"deleteobject"|"docbyanchor"|"docbyanchorobj"|"document_attributes"|"document_bodytag"|"document_content"|"document_setcontent"|"document_size"|"dummy"|"edittext"|"error"|"errormsg"|"free_document"|"getanchors"|"getanchorsobj"|"getandlock"|"getchildcoll"|"getchildcollobj"|"getchilddoccoll"|"getchilddoccollobj"|"getobject"|"getobjectbyquery"|"getobjectbyquerycoll"|"getobjectbyquerycollo [...]
+	"hwapi_hgcsp" |
+	"hwstat" |
+	"hypot" |
+	("ibase_"("add_user"|"affected_rows"|"backup"|"blob_add"|"blob_cancel"|"blob_close"|"blob_create"|"blob_echo"|"blob_get"|"blob_import"|"blob_info"|"blob_open"|"close"|"commit"|"commit_ret"|"connect"|"db_info"|"delete_user"|"drop_db"|"errcode"|"errmsg"|"execute"|"fetch_assoc"|"fetch_object"|"fetch_row"|"field_info"|"free_event_handler"|"free_query"|"free_result"|"gen_id"|"maintain_db"|"modify_user"|"name_result"|"num_fields"|"num_params"|"param_info"|"pconnect"|"prepare"|"query"|"restore [...]
+	"iconv" |
+	("iconv_"("get_encoding"|"mime_decode"|"mime_decode_headers"|"mime_encode"|"set_encoding"|"strlen"|"strpos"|"strrpos"|"substr")) |
+	"identify" |
+	"ignore_user_abort" |
+	("image"("2wbmp"|"_type_to_extension"|"_type_to_mime_type"|"alphablending"|"antialias"|"arc"|"char"|"charup"|"colorallocate"|"colorallocatealpha"|"colorat"|"colorclosest"|"colorclosestalpha"|"colorclosesthwb"|"colordeallocate"|"colorexact"|"colorexactalpha"|"colormatch"|"colorresolve"|"colorresolvealpha"|"colorset"|"colorsforindex"|"colorstotal"|"colortransparent"|"copy"|"copymerge"|"copymergegray"|"copyresampled"|"copyresized"|"create"|"createfromgd"|"createfromgd2"|"createfromgd2part" [...]
+	("imap_"("8bit"|"alerts"|"append"|"base64"|"binary"|"body"|"bodystruct"|"check"|"clearflag_full"|"close"|"createmailbox"|"delete"|"deletemailbox"|"errors"|"expunge"|"fetch_overview"|"fetchbody"|"fetchheader"|"fetchstructure"|"get_quota"|"get_quotaroot"|"getacl"|"getmailboxes"|"getsubscribed"|"header"|"headerinfo"|"headers"|"last_error"|"list"|"listmailbox"|"listscan"|"listsubscribed"|"lsub"|"mail"|"mail_compose"|"mail_copy"|"mail_move"|"mailboxmsginfo"|"mime_header_decode"|"msgno"|"num_ [...]
+	"implode" |
+	"import" |
+	"import_request_variables" |
+	"importnode" |
+	"in_array" |
+	"increment" |
+	"inet_ntop" |
+	"inet_pton" |
+	"info" |
+	("ini_"("alter"|"get"|"get_all"|"restore"|"set")) |
+	"insert" |
+	"insert_before" |
+	"insertanchor" |
+	"insertbefore" |
+	"insertcollection" |
+	"insertdata" |
+	"insertdocument" |
+	"interface_exists" |
+	"internal_subset" |
+	"intval" |
+	"ip2long" |
+	"iptcembed" |
+	"iptcparse" |
+	("is_"("a"|"array"|"blank_node"|"bool"|"callable"|"dir"|"double"|"executable"|"file"|"finite"|"float"|"infinite"|"int"|"integer"|"link"|"long"|"nan"|"null"|"numeric"|"object"|"readable"|"real"|"resource"|"scalar"|"soap_fault"|"string"|"subclass_of"|"uploaded_file"|"writable"|"writeable")) |
+	("is"("asp"|"comment"|"dir"|"dot"|"executable"|"file"|"html"|"id"|"jste"|"link"|"php"|"readable"|"samenode"|"supported"|"text"|"whitespaceinelementcontent"|"writable"|"xhtml"|"xml")) |
+	"item" |
+	"iterator_count" |
+	"iterator_to_array" |
+	"java_last_exception_clear" |
+	"java_last_exception_get" |
+	"jddayofweek" |
+	"jdmonthname" |
+	"jdtofrench" |
+	"jdtogregorian" |
+	"jdtojewish" |
+	"jdtojulian" |
+	"jdtounix" |
+	"jewishtojd" |
+	"join" |
+	"jpeg2wbmp" |
+	"juliantojd" |
+	"key" |
+	"krsort" |
+	"ksort" |
+	"langdepvalue" |
+	"last_child" |
+	"lastinsertid" |
+	"lcg_value" |
+	("ldap_"("8859_to_t61"|"add"|"bind"|"close"|"compare"|"connect"|"count_entries"|"delete"|"dn2ufn"|"err2str"|"errno"|"error"|"explode_dn"|"first_attribute"|"first_entry"|"first_reference"|"free_result"|"get_attributes"|"get_dn"|"get_entries"|"get_option"|"get_values"|"get_values_len"|"list"|"mod_add"|"mod_del"|"mod_replace"|"modify"|"next_attribute"|"next_entry"|"next_reference"|"parse_reference"|"parse_result"|"read"|"rename"|"sasl_bind"|"search"|"set_option"|"set_rebind_proc"|"sort"|"s [...]
+	"levenshtein" |
+	"link" |
+	"linkinfo" |
+	"load" |
+	"loadhtml" |
+	"loadhtmlfile" |
+	"loadxml" |
+	"localeconv" |
+	"localtime" |
+	"lock" |
+	"log" |
+	"log10" |
+	"log1p" |
+	"long2ip" |
+	"lookupnamespaceuri" |
+	"lookupprefix" |
+	"lstat" |
+	"ltrim" |
+	"lzf_compress" |
+	"lzf_decompress" |
+	"lzf_optimized_for" |
+	"mail" |
+	"main" |
+	"max" |
+	("mb_"("convert_case"|"convert_encoding"|"convert_kana"|"convert_variables"|"decode_mimeheader"|"decode_numericentity"|"detect_encoding"|"detect_order"|"encode_mimeheader"|"encode_numericentity"|"ereg"|"ereg_match"|"ereg_replace"|"ereg_search"|"ereg_search_getpos"|"ereg_search_getregs"|"ereg_search_init"|"ereg_search_pos"|"ereg_search_regs"|"ereg_search_setpos"|"eregi"|"eregi_replace"|"get_info"|"http_input"|"http_output"|"internal_encoding"|"language"|"list_encodings"|"output_handler"| [...]
+	("mcal_"("append_event"|"close"|"create_calendar"|"date_compare"|"date_valid"|"day_of_week"|"day_of_year"|"days_in_month"|"delete_calendar"|"delete_event"|"event_add_attribute"|"event_init"|"event_set_alarm"|"event_set_category"|"event_set_class"|"event_set_description"|"event_set_end"|"event_set_recur_daily"|"event_set_recur_monthly_mday"|"event_set_recur_monthly_wday"|"event_set_recur_none"|"event_set_recur_weekly"|"event_set_recur_yearly"|"event_set_start"|"event_set_title"|"expunge" [...]
+	("mcrypt_"("cbc"|"cfb"|"create_iv"|"decrypt"|"ecb"|"enc_get_algorithms_name"|"enc_get_block_size"|"enc_get_iv_size"|"enc_get_key_size"|"enc_get_modes_name"|"enc_get_supported_key_sizes"|"enc_is_block_algorithm"|"enc_is_block_algorithm_mode"|"enc_is_block_mode"|"enc_self_test"|"encrypt"|"generic"|"generic_deinit"|"generic_end"|"generic_init"|"get_block_size"|"get_cipher_name"|"get_iv_size"|"get_key_size"|"list_algorithms"|"list_modes"|"module_close"|"module_get_algo_block_size"|"module_g [...]
+	"md5" |
+	"md5_file" |
+	"mdecrypt_generic" |
+	"memcache_debug" |
+	"memory_get_usage" |
+	"metaphone" |
+	"method_exists" |
+	"mhash" |
+	"mhash_count" |
+	"mhash_get_block_size" |
+	"mhash_get_hash_name" |
+	"mhash_keygen_s2k" |
+	"microtime" |
+	"mime_content_type" |
+	"mimetype" |
+	"min" |
+	"ming_setcubicthreshold" |
+	"ming_setscale" |
+	"ming_useswfversion" |
+	"mkdir" |
+	"mktime" |
+	"money_format" |
+	"move" |
+	"move_uploaded_file" |
+	"movepen" |
+	"movepento" |
+	"moveto" |
+	("msession_"("connect"|"count"|"create"|"destroy"|"disconnect"|"find"|"get"|"get_array"|"get_data"|"inc"|"list"|"listvar"|"lock"|"plugin"|"randstr"|"set"|"set_array"|"set_data"|"timeout"|"uniq"|"unlock")) |
+	"msg_get_queue" |
+	"msg_receive" |
+	"msg_remove_queue" |
+	"msg_send" |
+	"msg_set_queue" |
+	"msg_stat_queue" |
+	"msql" |
+	"mt_getrandmax" |
+	"mt_rand" |
+	"mt_srand" |
+	"name" |
+	"natcasesort" |
+	"natsort" |
+	"next" |
+	"next_sibling" |
+	"nextframe" |
+	"ngettext" |
+	"nl2br" |
+	"nl_langinfo" |
+	("node_"("name"|"type"|"value")) |
+	"normalize" |
+	"notations" |
+	("notes_"("body"|"copy_db"|"create_db"|"create_note"|"drop_db"|"find_note"|"header_info"|"list_msgs"|"mark_read"|"mark_unread"|"nav_create"|"search"|"unread"|"version")) |
+	("nsapi_"("request_headers"|"response_headers"|"virtual")) |
+	"number_format" |
+	("ob_"("clean"|"end_clean"|"end_flush"|"flush"|"get_clean"|"get_contents"|"get_flush"|"get_length"|"get_level"|"get_status"|"gzhandler"|"iconv_handler"|"implicit_flush"|"list_handlers"|"start"|"tidyhandler")) |
+	"object" |
+	"objectbyanchor" |
+	("oci"("_bind_by_name"|"_cancel"|"_close"|"_commit"|"_connect"|"_define_by_name"|"_error"|"_execute"|"_fetch"|"_fetch_all"|"_fetch_array"|"_fetch_assoc"|"_fetch_object"|"_fetch_row"|"_field_is_null"|"_field_name"|"_field_precision"|"_field_scale"|"_field_size"|"_field_type"|"_field_type_raw"|"_free_statement"|"_internal_debug"|"_lob_copy"|"_lob_is_equal"|"_new_collection"|"_new_connect"|"_new_cursor"|"_new_descriptor"|"_num_fields"|"_num_rows"|"_parse"|"_password_change"|"_pconnect"|"_r [...]
+	"octdec" |
+	("odbc_"("autocommit"|"binmode"|"close"|"close_all"|"columnprivileges"|"columns"|"commit"|"connect"|"cursor"|"data_source"|"do"|"error"|"errormsg"|"exec"|"execute"|"fetch_array"|"fetch_into"|"fetch_object"|"fetch_row"|"field_len"|"field_name"|"field_num"|"field_precision"|"field_scale"|"field_type"|"foreignkeys"|"free_result"|"gettypeinfo"|"longreadlen"|"next_result"|"num_fields"|"num_rows"|"pconnect"|"prepare"|"primarykeys"|"procedurecolumns"|"procedures"|"result"|"result_all"|"rollbac [...]
+	"offsetexists" |
+	"offsetget" |
+	"offsetset" |
+	"offsetunset" |
+	"opendir" |
+	"openlog" |
+	("openssl_"("csr_export"|"csr_export_to_file"|"csr_new"|"csr_sign"|"error_string"|"free_key"|"get_privatekey"|"get_publickey"|"open"|"pkcs7_decrypt"|"pkcs7_encrypt"|"pkcs7_sign"|"pkcs7_verify"|"pkey_export"|"pkey_export_to_file"|"pkey_get_private"|"pkey_get_public"|"pkey_new"|"private_decrypt"|"private_encrypt"|"public_decrypt"|"public_encrypt"|"seal"|"sign"|"verify"|"x509_check_private_key"|"x509_checkpurpose"|"x509_export"|"x509_export_to_file"|"x509_free"|"x509_parse"|"x509_read")) |
+	("ora_"("bind"|"close"|"columnname"|"columnsize"|"columntype"|"commit"|"commitoff"|"commiton"|"do"|"error"|"errorcode"|"exec"|"fetch"|"fetch_into"|"getcolumn"|"logoff"|"logon"|"numcols"|"numrows"|"open"|"parse"|"plogon"|"rollback")) |
+	"ord" |
+	"output" |
+	"output_add_rewrite_var" |
+	"output_reset_rewrite_vars" |
+	"overload" |
+	"override_function" |
+	"owner_document" |
+	"pack" |
+	"parent_node" |
+	"parents" |
+	"parse_ini_file" |
+	"parse_str" |
+	"parse_url" |
+	"parsekit_compile_file" |
+	"parsekit_compile_string" |
+	"parsekit_func_arginfo" |
+	"passthru" |
+	"pathinfo" |
+	"pclose" |
+	("pcntl_"("alarm"|"exec"|"fork"|"getpriority"|"setpriority"|"signal"|"wait"|"waitpid"|"wexitstatus"|"wifexited"|"wifsignaled"|"wifstopped"|"wstopsig"|"wtermsig")) |
+	"pconnect" |
+	("pdf_"("add_annotation"|"add_bookmark"|"add_launchlink"|"add_locallink"|"add_note"|"add_outline"|"add_pdflink"|"add_thumbnail"|"add_weblink"|"arc"|"arcn"|"attach_file"|"begin_page"|"begin_pattern"|"begin_template"|"circle"|"clip"|"close"|"close_image"|"close_pdi"|"close_pdi_page"|"closepath"|"closepath_fill_stroke"|"closepath_stroke"|"concat"|"continue_text"|"curveto"|"delete"|"end_page"|"end_pattern"|"end_template"|"endpath"|"fill"|"fill_stroke"|"findfont"|"fit_pdi_page"|"get_buffer"| [...]
+	"pfpro_cleanup" |
+	"pfpro_init" |
+	"pfpro_process" |
+	"pfpro_process_raw" |
+	"pfpro_version" |
+	"pfsockopen" |
+	("pg_"("affected_rows"|"cancel_query"|"client_encoding"|"close"|"connect"|"connection_busy"|"connection_reset"|"connection_status"|"convert"|"copy_from"|"copy_to"|"dbname"|"delete"|"end_copy"|"escape_bytea"|"escape_string"|"fetch_all"|"fetch_array"|"fetch_assoc"|"fetch_object"|"fetch_result"|"fetch_row"|"field_is_null"|"field_name"|"field_num"|"field_prtlen"|"field_size"|"field_type"|"free_result"|"get_notify"|"get_pid"|"get_result"|"host"|"insert"|"last_error"|"last_notice"|"last_oid"| [...]
+	"php_check_syntax" |
+	"php_ini_scanned_files" |
+	"php_logo_guid" |
+	"php_sapi_name" |
+	"php_strip_whitespace" |
+	"php_uname" |
+	"phpcredits" |
+	"phpinfo" |
+	"phpversion" |
+	"pi" |
+	"png2wbmp" |
+	"popen" |
+	"pos" |
+	("posix_"("ctermid"|"get_last_error"|"getcwd"|"getegid"|"geteuid"|"getgid"|"getgrgid"|"getgrnam"|"getgroups"|"getlogin"|"getpgid"|"getpgrp"|"getpid"|"getppid"|"getpwnam"|"getpwuid"|"getrlimit"|"getsid"|"getuid"|"isatty"|"kill"|"mkfifo"|"setegid"|"seteuid"|"setgid"|"setpgid"|"setsid"|"setuid"|"strerror"|"times"|"ttyname"|"uname")) |
+	"pow" |
+	"prefix" |
+	"preg_grep" |
+	"preg_match" |
+	"preg_match_all" |
+	"preg_quote" |
+	"preg_replace" |
+	"preg_replace_callback" |
+	"preg_split" |
+	"prepare" |
+	"prev" |
+	"previous_sibling" |
+	"print_r" |
+	("printer_"("abort"|"close"|"create_brush"|"create_dc"|"create_font"|"create_pen"|"delete_brush"|"delete_dc"|"delete_font"|"delete_pen"|"draw_bmp"|"draw_chord"|"draw_elipse"|"draw_line"|"draw_pie"|"draw_rectangle"|"draw_roundrect"|"draw_text"|"end_doc"|"end_page"|"get_option"|"list"|"logical_fontheight"|"open"|"select_brush"|"select_font"|"select_pen"|"set_option"|"start_doc"|"start_page"|"write")) |
+	"printf" |
+	"proc_close" |
+	"proc_get_status" |
+	"proc_nice" |
+	"proc_open" |
+	"proc_terminate" |
+	"process" |
+	"public_id" |
+	"putenv" |
+	"qdom_error" |
+	"qdom_tree" |
+	"query" |
+	"quoted_printable_decode" |
+	"quotemeta" |
+	"rad2deg" |
+	"rand" |
+	"range" |
+	"rar_close" |
+	"rar_entry_get" |
+	"rar_list" |
+	"rar_open" |
+	"rawurldecode" |
+	"rawurlencode" |
+	"read" |
+	"read_exif_data" |
+	"readdir" |
+	"readfile" |
+	"readgzfile" |
+	"readline" |
+	("readline_"("add_history"|"callback_handler_install"|"callback_handler_remove"|"callback_read_char"|"clear_history"|"completion_function"|"info"|"list_history"|"on_new_line"|"read_history"|"redisplay"|"write_history")) |
+	"readlink" |
+	"realpath" |
+	"reason" |
+	"recode" |
+	"recode_file" |
+	"recode_string" |
+	"register_shutdown_function" |
+	"register_tick_function" |
+	"registernamespace" |
+	"relaxngvalidate" |
+	"relaxngvalidatesource" |
+	"remove" |
+	"remove_attribute" |
+	"remove_child" |
+	"removeattribute" |
+	"removeattributenode" |
+	"removeattributens" |
+	"removechild" |
+	"rename" |
+	"rename_function" |
+	"replace" |
+	"replace_child" |
+	"replace_node" |
+	"replacechild" |
+	"replacedata" |
+	"reset" |
+	"restore_error_handler" |
+	"restore_exception_handler" |
+	"restore_include_path" |
+	"result_dump_file" |
+	"result_dump_mem" |
+	"rewind" |
+	"rewinddir" |
+	"rmdir" |
+	"rollback" |
+	"rotate" |
+	"rotateto" |
+	"round" |
+	"rowcount" |
+	"rsort" |
+	"rtrim" |
+	"save" |
+	"savehtml" |
+	"savehtmlfile" |
+	"savexml" |
+	"scale" |
+	"scaleto" |
+	"scandir" |
+	"schemavalidate" |
+	"schemavalidatesource" |
+	"seek" |
+	"sem_acquire" |
+	"sem_get" |
+	"sem_release" |
+	"sem_remove" |
+	"serialize" |
+	("sesam_"("affected_rows"|"commit"|"connect"|"diagnostic"|"disconnect"|"errormsg"|"execimm"|"fetch_array"|"fetch_result"|"fetch_row"|"field_array"|"field_name"|"free_result"|"num_fields"|"query"|"rollback"|"seek_row"|"sesam_settransaction")) |
+	("session_"("cache_expire"|"cache_limiter"|"commit"|"decode"|"destroy"|"encode"|"get_cookie_params"|"id"|"is_registered"|"module_name"|"name"|"regenerate_id"|"register"|"save_path"|"set_cookie_params"|"set_save_handler"|"start"|"unregister"|"unset"|"write_close")) |
+	"set" |
+	("set"("_attribute"|"_content"|"_error_handler"|"_exception_handler"|"_file_buffer"|"_include_path"|"_magic_quotes_runtime"|"_name"|"_namespace"|"_time_limit"|"action"|"attribute"|"attributenode"|"attributenodens"|"attributens"|"background"|"bounds"|"buffering"|"class"|"color"|"commitedversion"|"cookie"|"depth"|"dimension"|"down"|"font"|"frames"|"height"|"hit"|"indentation"|"leftfill"|"leftmargin"|"line"|"linespacing"|"locale"|"margins"|"name"|"over"|"persistence"|"rate"|"ratio"|"rawcoo [...]
+	"sha1" |
+	"sha1_file" |
+	"shell_exec" |
+	"shm_attach" |
+	"shm_detach" |
+	"shm_get_var" |
+	"shm_put_var" |
+	"shm_remove" |
+	"shm_remove_var" |
+	"shmop_close" |
+	"shmop_delete" |
+	"shmop_open" |
+	"shmop_read" |
+	"shmop_size" |
+	"shmop_write" |
+	"show_source" |
+	"shuffle" |
+	"similar_text" |
+	"simplexml_import_dom" |
+	"simplexml_load_file" |
+	"simplexml_load_string" |
+	"sin" |
+	"sinh" |
+	"size" |
+	"sizeof" |
+	"skewx" |
+	"skewxto" |
+	"skewy" |
+	"skewyto" |
+	"sleep" |
+	("socket_"("accept"|"bind"|"clear_error"|"close"|"connect"|"create"|"create_listen"|"create_pair"|"get_option"|"get_status"|"getpeername"|"getsockname"|"last_error"|"listen"|"read"|"recv"|"recvfrom"|"select"|"send"|"sendto"|"set_block"|"set_blocking"|"set_nonblock"|"set_option"|"set_timeout"|"shutdown"|"strerror"|"write")) |
+	"sort" |
+	"soundex" |
+	"specified" |
+	"spl_classes" |
+	"split" |
+	"spliti" |
+	"splittext" |
+	"sprintf" |
+	"sql_regcase" |
+	"sqrt" |
+	"srand" |
+	"srcanchors" |
+	"srcsofdst" |
+	"sscanf" |
+	"stat" |
+	("str_"("ireplace"|"pad"|"repeat"|"replace"|"rot13"|"shuffle"|"split"|"word_count")) |
+	"strcasecmp" |
+	"strchr" |
+	"strcmp" |
+	"strcoll" |
+	"strcspn" |
+	("stream_"("context_create"|"context_get_default"|"context_get_options"|"context_set_option"|"context_set_params"|"copy_to_stream"|"filter_append"|"filter_prepend"|"filter_register"|"filter_remove"|"get_contents"|"get_filters"|"get_line"|"get_meta_data"|"get_transports"|"get_wrappers"|"register_wrapper"|"select"|"set_blocking"|"set_timeout"|"set_write_buffer"|"socket_accept"|"socket_client"|"socket_enable_crypto"|"socket_get_name"|"socket_recvfrom"|"socket_sendto"|"socket_server"|"wrapp [...]
+	("str"("eammp3"|"ftime"|"ip_tags"|"ipcslashes"|"ipos"|"ipslashes"|"istr"|"len"|"natcasecmp"|"natcmp"|"ncasecmp"|"ncmp"|"pbrk"|"pos"|"ptime"|"rchr"|"rev"|"ripos"|"rpos"|"spn"|"str"|"tok"|"tolower"|"totime"|"toupper"|"tr"|"val")) |
+	"substr" |
+	"substr_compare" |
+	"substr_count" |
+	"substr_replace" |
+	"substringdata" |
+	("swf_"("actiongeturl"|"actiongotoframe"|"actiongotolabel"|"actionnextframe"|"actionplay"|"actionprevframe"|"actionsettarget"|"actionstop"|"actiontogglequality"|"actionwaitforframe"|"addbuttonrecord"|"addcolor"|"closefile"|"definebitmap"|"definefont"|"defineline"|"definepoly"|"definerect"|"definetext"|"endbutton"|"enddoaction"|"endshape"|"endsymbol"|"fontsize"|"fontslant"|"fonttracking"|"getbitmapinfo"|"getfontinfo"|"getframe"|"labelframe"|"lookat"|"modifyobject"|"mulcolor"|"nextid"|"on [...]
+	"swfbutton_keypress" |
+	"symlink" |
+	"syslog" |
+	"system" |
+	"system_id" |
+	"tagname" |
+	"tan" |
+	"tanh" |
+	"target" |
+	"tcpwrap_check" |
+	"tell" |
+	"tempnam" |
+	"textdomain" |
+	("tidy_"("access_count"|"clean_repair"|"config_count"|"diagnose"|"error_count"|"get_body"|"get_config"|"get_error_buffer"|"get_head"|"get_html"|"get_html_ver"|"get_output"|"get_release"|"get_root"|"get_status"|"getopt"|"is_xhtml"|"is_xml"|"load_config"|"parse_file"|"parse_string"|"repair_file"|"repair_string"|"reset_config"|"save_config"|"set_encoding"|"setopt"|"warning_count")) |
+	"time" |
+	"time_nanosleep" |
+	"title" |
+	"tmpfile" |
+	"token_get_all" |
+	"token_name" |
+	"touch" |
+	"trigger_error" |
+	"trim" |
+	"truncate" |
+	"type" |
+	"uasort" |
+	"ucfirst" |
+	"ucwords" |
+	"uksort" |
+	"umask" |
+	"uniqid" |
+	"unixtojd" |
+	"unlink" |
+	"unlink_node" |
+	"unlock" |
+	"unpack" |
+	"unregister_tick_function" |
+	"unserialize" |
+	"urldecode" |
+	"urlencode" |
+	"user" |
+	"user_error" |
+	"userlist" |
+	"usleep" |
+	"usort" |
+	"utf8_"("decode"|"encode") |
+	"valid" |
+	"validate" |
+	"value" |
+	"values" |
+	"var_"("dump"|"export") |
+	("variant_"("abs"|"add"|"and"|"cast"|"cat"|"cmp"|"date_from_timestamp"|"date_to_timestamp"|"div"|"eqv"|"fix"|"get_type"|"idiv"|"imp"|"int"|"mod"|"mul"|"neg"|"not"|"or"|"pow"|"round"|"set"|"set_type"|"sub"|"xor")) |
+	"version_compare" |
+	"vfprintf" |
+	"virtual" |
+	("vpopmail_"("add_alias_domain"|"add_alias_domain_ex"|"add_domain"|"add_domain_ex"|"add_user"|"alias_add"|"alias_del"|"alias_del_domain"|"alias_get"|"alias_get_all"|"auth_user"|"del_domain"|"del_domain_ex"|"del_user"|"error"|"passwd"|"set_user_quota")) |
+	"vprintf" |
+	"vsprintf" |
+	("w32api_"("deftype"|"init_dtype"|"invoke_function"|"register_function"|"set_call_method")) |
+	"wddx_add_vars" |
+	"wddx_deserialize" |
+	"wddx_packet_end" |
+	"wddx_packet_start" |
+	"wddx_serialize_value" |
+	"wddx_serialize_vars" |
+	"wordwrap" |
+	"write" |
+	"writetemporary" |
+	"xattr_get" |
+	"xattr_list" |
+	"xattr_remove" |
+	"xattr_set" |
+	"xattr_supported" |
+	"xinclude" |
+	("xml"("_error_string"|"_get_current_byte_index"|"_get_current_column_number"|"_get_current_line_number"|"_get_error_code"|"_parse"|"_parse_into_struct"|"_parser_create"|"_parser_create_ns"|"_parser_free"|"_parser_get_option"|"_parser_set_option"|"_set_character_data_handler"|"_set_default_handler"|"_set_element_handler"|"_set_end_namespace_decl_handler"|"_set_external_entity_ref_handler"|"_set_notation_decl_handler"|"_set_object"|"_set_processing_instruction_handler"|"_set_start_namesp [...]
+	"xpath" |
+	"xpath_eval" |
+	"xpath_eval_expression" |
+	"xpath_new_context" |
+	"xptr_eval" |
+	"xptr_new_context" |
+	("xsl_xsltprocessor_"("get_parameter"|"has_exslt_support"|"import_stylesheet"|"register_php_functions"|"remove_parameter"|"set_parameter"|"transform_to_doc"|"transform_to_uri"|"transform_to_xml"|"xslt_backend_info")) |
+	("xslt_"("backend_name"|"backend_version"|"create"|"errno"|"error"|"free"|"getopt"|"process"|"set_base"|"set_encoding"|"set_error_handler"|"set_log"|"set_object"|"set_sax_handler"|"set_sax_handlers"|"set_scheme_handler"|"set_scheme_handlers"|"setopt")) |
+	("yp_"("all"|"cat"|"err_string"|"errno"|"first"|"get_default_domain"|"master"|"match"|"next"|"yp_order")) |
+	"zend_logo_guid" |
+	"zend_version" |
+	("zip_"("close"|"entry_close"|"entry_compressedsize"|"entry_compressionmethod"|"entry_filesize"|"entry_name"|"entry_open"|"entry_read"|"open"|"read")) |
+	"zlib_get_coding_type" |
+
+	/* mysql functions */
+	("mysql_"("affected_rows"|"client_encoding"|"close"|"connect"|"create_db"|"data_seek"|"db_"("name"|"query")|"drop_db"|"errno"|"error"|"escape_string"|"fetch_"("array"|"assoc"|"field"|"lengths"|"object"|"row")|"field_"("flags"|"len"|"name"|"seek"|"table"|"type")|"free_result"|"get_"("client_info"|"host_info"|"proto_info"|"server_info")|"info"|"insert_id"|"list_"("dbs"|"fields"|"processes"|"tables")|"num_"("fields"|"rows")|"pconnect"|"ping"|"query"|"real_escape_string"|"result"|"select_db [...]
+
+	/* Function aliases */
+	"apache_request_headers" |
+	"apache_response_headers" |
+	"attr_get" |
+	"attr_set" |
+	"autocommit" |
+	"bind_param" |
+	"bind_result" |
+	"bzclose" |
+	"bzflush" |
+	"bzwrite" |
+	"change_user" |
+	"character_set_name" |
+	"checkdnsrr" |
+	"chop" |
+	"client_encoding" |
+	"close" |
+	"commit" |
+	"connect" |
+	"data_seek" |
+	"debug" |
+	"disable_reads_from_master" |
+	"disable_rpl_parse" |
+	"diskfreespace" |
+	"doubleval" |
+	"dump_debug_info" |
+	"enable_reads_from_master" |
+	"enable_rpl_parse" |
+	"escape_string" |
+	"execute" |
+	"fbsql" |
+	"fbsql_tablename" |
+	"fetch" |
+	"fetch_array" |
+	"fetch_assoc" |
+	"fetch_field" |
+	"fetch_field_direct" |
+	"fetch_fields" |
+	"fetch_object" |
+	"fetch_row" |
+	"field_count" |
+	"field_seek" |
+	"fputs" |
+	"free" |
+	"free_result" |
+	"ftp_quit" |
+	"get_client_info" |
+	"get_required_files" |
+	"get_server_info" |
+	"getallheaders" |
+	"getmxrr" |
+	"gmp_div" |
+	("gz"("close"|"eof"|"getc"|"gets"|"getss"|"passthru"|"puts"|"read"|"rewind"|"seek"|"tell"|"gzwrite")) |
+	"imap_create" |
+	"imap_fetchtext" |
+	"imap_header" |
+	"imap_listmailbox" |
+	"imap_listsubscribed" |
+	"imap_rename" |
+	"ini_alter" |
+	"init" |
+	"is_double" |
+	"is_int" |
+	"is_integer" |
+	"is_real" |
+	"is_writeable" |
+	"join" |
+	"key_exists" |
+	"kill" |
+	"ldap_close" |
+	"ldap_modify" |
+	"magic_quotes_runtime" |
+	"master_query" |
+	"ming_keypress" |
+	"ming_setcubicthreshold" |
+	"ming_setscale" |
+	"ming_useconstants" |
+	"ming_useswfversion" |
+	"more_results" |
+	"next_result" |
+	"num_rows" |
+	("oci"("_free_cursor"|"bindbyname"|"cancel"|"collappend"|"collassignelem"|"collgetelem"|"collmax"|"collsize"|"colltrim"|"columnisnull"|"columnname"|"columnprecision"|"columnscale"|"columnsize"|"columntype"|"columntyperaw"|"commit"|"definebyname"|"error"|"execute"|"fetch"|"fetchstatement"|"freecollection"|"freecursor"|"freedesc"|"freestatement"|"internaldebug"|"loadlob"|"logoff"|"logon"|"newcollection"|"newcursor"|"newdescriptor"|"nlogon"|"numcols"|"parse"|"passwordchange"|"plogon"|"resu [...]
+	"odbc_do" |
+	"odbc_field_precision" |
+	"openssl_free_key" |
+	"openssl_get_privatekey" |
+	"openssl_get_publickey" |
+	"options" |
+	("pg_"("clientencoding"|"cmdtuples"|"errormessage"|"exec"|"fieldisnull"|"fieldname"|"fieldnum"|"fieldprtlen"|"fieldsize"|"fieldtype"|"freeresult"|"getlastoid"|"loclose"|"locreate"|"loexport"|"loimport"|"loopen"|"loread"|"loreadall"|"lounlink"|"lowrite"|"numfields"|"numrows"|"result"|"setclientencoding")) |
+	"ping" |
+	"pos" |
+	"posix_errno" |
+	"prepare" |
+	"query" |
+	"read_exif_data" |
+	"real_connect" |
+	"real_escape_string" |
+	"real_query" |
+	"recode" |
+	"reset" |
+	"result_metadata" |
+	"rollback" |
+	"rpl_parse_enabled" |
+	"rpl_probe" |
+	"rpl_query_type" |
+	"select_db" |
+	"send_long_data" |
+	"session_commit" |
+	"set_file_buffer" |
+	"set_local_infile_default" |
+	"set_local_infile_handler" |
+	"set_opt" |
+	"show_source" |
+	"sizeof" |
+	"slave_query" |
+	"snmpwalkoid" |
+	"socket_get_status" |
+	"socket_getopt" |
+	"socket_set_blocking" |
+	"socket_set_timeout" |
+	"socket_setopt" |
+	"sqlite_fetch_string" |
+	"sqlite_has_more" |
+	"ssl_set" |
+	"stat" |
+	"stmt" |
+	"stmt_init" |
+	"store_result" |
+	"strchr" |
+	"stream_register_wrapper" |
+	"thread_safe" |
+	"use_result" |
+	"user_error" |
+	("velocis_"("autocommit"|"close"|"commit"|"connect"|"exec"|"fetch"|"fieldname"|"fieldnum"|"freeresult"|"off_autocommit"|"result"|"rollback")) |
+	"virtual"							{ addToken(Token.FUNCTION); }
+
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+	{PHP_Variable}				{ addToken(Token.VARIABLE); }
+
+	{LineTerminator}				{ addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken; }
+	{JS_Identifier}				{ addToken(Token.IDENTIFIER); }
+	{Whitespace}					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	[\"]							{ start = zzMarkedPos-1; yybegin(PHP_STRING); }
+	[\']							{ start = zzMarkedPos-1; yybegin(PHP_CHAR); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{JS_MLCBegin}					{ start = zzMarkedPos-2; yybegin(PHP_MLC); }
+	{PHP_LineCommentBegin}.*			{ addToken(Token.COMMENT_EOL); addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken; }
+
+	/* Separators. */
+	{JS_Separator}					{ addToken(Token.SEPARATOR); }
+	{JS_Separator2}				{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{JS_Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{JS_IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{JS_HexLiteral}				{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{JS_FloatLiteral}				{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{JS_ErrorNumberFormat}			{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{JS_ErrorIdentifier}			{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken; }
+
+	/* Catch any other (unhandled) characters and assume they are okay. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+
+<PHP_MLC> {
+	// PHP MLC's.  This state is essentially Java's MLC state.
+	[^hwf\n\*]+					{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]						{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_PHP_MLC - phpInState); return firstToken; }
+	{JS_MLCEnd}					{ yybegin(PHP); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_PHP_MLC - phpInState); return firstToken; }
+}
+
+
+<PHP_STRING> {
+	[^\n\\\$\"]+		{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_IN_PHP_STRING - phpInState); return firstToken; }
+	\\.?				{ /* Skip escaped chars. */ }
+	{PHP_Variable}		{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	"$"					{}
+	\"					{ yybegin(PHP); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_IN_PHP_STRING - phpInState); return firstToken; }
+}
+
+
+<PHP_CHAR> {
+	[^\n\\\']+			{}
+	\\.?				{ /* Skip escaped single quotes only, but this should still work. */ }
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_IN_PHP_CHAR - phpInState); return firstToken; }
+	\'					{ yybegin(PHP); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_IN_PHP_CHAR - phpInState); return firstToken; }
+}
+
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.java
new file mode 100644
index 0000000..7809a9c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.java
@@ -0,0 +1,25424 @@
+/* The following code was generated by JFlex 1.4.1 on 3/23/13 9:46 AM */
+
+/*
+ * 01/28/2009
+ *
+ * PHPTokenMaker.java - Generates tokens for PHP syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for PHP files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated PHPTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+
+public class PHPTokenMaker extends AbstractMarkupTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int PHP = 18;
+  public static final int INATTR_SINGLE_SCRIPT = 9;
+  public static final int JS_CHAR = 14;
+  public static final int CSS_STRING = 25;
+  public static final int JS_MLC = 16;
+  public static final int CSS_CHAR_LITERAL = 26;
+  public static final int INTAG_SCRIPT = 7;
+  public static final int CSS_PROPERTY = 23;
+  public static final int CSS_C_STYLE_COMMENT = 27;
+  public static final int PHP_MLC = 19;
+  public static final int CSS = 22;
+  public static final int CSS_VALUE = 24;
+  public static final int COMMENT = 1;
+  public static final int INATTR_DOUBLE_SCRIPT = 8;
+  public static final int PHP_STRING = 20;
+  public static final int JAVASCRIPT = 13;
+  public static final int INTAG = 3;
+  public static final int INTAG_CHECK_TAG_NAME = 4;
+  public static final int INATTR_SINGLE_STYLE = 12;
+  public static final int DTD = 2;
+  public static final int PHP_CHAR = 21;
+  public static final int JS_EOL_COMMENT = 17;
+  public static final int INATTR_DOUBLE_STYLE = 11;
+  public static final int INATTR_SINGLE = 6;
+  public static final int YYINITIAL = 0;
+  public static final int INATTR_DOUBLE = 5;
+  public static final int JS_STRING = 15;
+  public static final int INTAG_STYLE = 10;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\4\1\2\1\0\1\1\1\33\22\0\1\4\1\51\1\7"+
+    "\1\34\1\36\1\50\1\5\1\106\1\103\1\102\1\37\1\42\1\45"+
+    "\1\31\1\43\1\10\1\25\1\135\1\130\1\134\1\132\1\123\1\131"+
+    "\1\27\1\136\1\24\1\53\1\6\1\3\1\46\1\17\1\52\1\101"+
+    "\1\110\1\26\1\12\1\114\1\22\1\41\1\116\1\122\1\14\1\124"+
+    "\1\117\1\21\1\113\1\112\1\111\1\15\1\120\1\13\1\11\1\16"+
+    "\1\115\1\121\1\23\1\40\1\20\1\23\1\105\1\35\1\105\1\47"+
+    "\1\30\1\0\1\63\1\100\1\72\1\73\1\61\1\62\1\56\1\67"+
+    "\1\55\1\133\1\76\1\64\1\75\1\71\1\70\1\66\1\127\1\60"+
+    "\1\65\1\57\1\32\1\77\1\107\1\104\1\74\1\125\1\126\1\47"+
+    "\1\44\1\54\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 =
+    "\5\0\2\1\1\0\2\1\1\0\2\1\13\0\1\2"+
+    "\3\0\2\2\1\3\1\4\1\5\1\6\1\1\1\7"+
+    "\5\1\1\10\1\11\3\12\1\13\1\14\1\15\1\16"+
+    "\1\17\1\20\1\21\1\22\2\20\2\22\3\20\2\22"+
+    "\1\20\1\22\7\20\1\22\1\1\1\23\1\24\1\1"+
+    "\1\25\1\14\1\26\1\27\1\30\1\31\1\32\1\33"+
+    "\1\1\1\34\1\1\1\35\1\36\2\16\1\2\1\37"+
+    "\1\16\2\2\1\16\2\40\1\16\1\2\1\35\2\16"+
+    "\1\2\1\41\17\2\1\42\2\2\1\1\1\43\1\44"+
+    "\1\45\1\1\1\46\1\47\1\50\1\1\1\51\6\1"+
+    "\1\52\4\1\1\53\1\16\1\54\1\16\2\2\1\55"+
+    "\1\2\1\16\24\2\1\35\1\2\1\56\4\2\1\1"+
+    "\1\57\2\1\1\60\1\61\1\62\1\1\1\63\1\64"+
+    "\1\65\1\66\1\67\1\66\1\70\1\66\1\71\1\66"+
+    "\1\72\1\66\1\73\1\74\1\75\1\76\2\75\1\77"+
+    "\1\75\1\100\1\101\1\102\1\103\1\102\1\104\2\2"+
+    "\1\40\1\2\2\102\1\105\1\106\1\107\1\110\1\111"+
+    "\1\112\1\113\1\1\1\4\2\114\1\115\1\116\1\6"+
+    "\5\0\1\117\32\20\2\22\2\20\1\22\44\20\1\120"+
+    "\1\121\2\0\1\117\1\0\1\122\1\0\1\123\1\16"+
+    "\1\35\1\2\1\16\1\124\1\40\1\124\2\125\1\124"+
+    "\1\126\1\124\1\2\1\77\1\2\1\77\44\2\1\77"+
+    "\7\2\1\127\1\130\1\131\1\0\1\132\11\0\1\133"+
+    "\10\2\1\134\1\135\100\2\1\77\37\2\1\136\20\2"+
+    "\1\77\36\2\1\136\1\2\1\77\34\2\1\137\24\2"+
+    "\1\140\1\62\1\141\1\64\1\0\1\142\1\134\15\0"+
+    "\1\143\1\40\5\0\1\40\1\0\1\144\1\145\2\114"+
+    "\2\0\1\146\4\0\1\12\14\20\1\22\63\20\3\0"+
+    "\1\147\1\0\1\35\1\2\1\125\1\0\2\126\3\2"+
+    "\1\71\25\2\1\150\33\2\14\0\12\2\1\77\53\2"+
+    "\1\136\32\2\1\136\44\2\1\136\5\2\1\136\27\2"+
+    "\1\77\23\2\2\136\5\2\1\136\20\2\1\136\50\2"+
+    "\1\136\63\2\1\136\6\2\1\136\4\2\1\136\25\2"+
+    "\1\136\21\2\1\136\3\2\1\136\4\2\1\77\16\2"+
+    "\1\35\27\2\25\0\2\114\1\151\3\0\1\152\1\12"+
+    "\22\20\1\22\7\20\1\22\10\20\3\0\1\153\1\35"+
+    "\7\2\1\154\4\2\1\155\5\2\1\71\17\2\1\0"+
+    "\1\1\3\0\1\156\3\0\1\157\15\2\1\136\16\2"+
+    "\1\136\72\2\1\136\15\2\1\136\15\2\1\136\21\2"+
+    "\1\136\1\2\1\77\12\2\1\160\3\2\1\136\6\2"+
+    "\1\136\4\2\1\136\15\2\1\136\15\2\1\136\4\2"+
+    "\1\136\11\2\1\136\11\2\1\136\2\2\1\136\105\2"+
+    "\1\136\110\2\1\136\1\2\1\136\54\2\2\136\42\2"+
+    "\1\136\44\2\1\35\27\2\20\0\1\77\3\0\2\114"+
+    "\1\116\2\0\1\117\11\20\1\22\12\20\1\120\1\0"+
+    "\1\117\1\35\5\2\1\77\3\2\1\77\12\2\6\0"+
+    "\63\2\1\136\153\2\1\136\23\2\2\136\16\2\1\136"+
+    "\4\2\1\136\5\2\1\77\131\2\1\136\12\2\1\136"+
+    "\60\2\1\77\217\2\1\77\1\136\1\77\5\2\1\136"+
+    "\1\77\22\2\1\136\37\2\1\136\36\2\1\136\10\2"+
+    "\1\136\1\2\1\35\5\2\1\136\5\2\1\136\20\2"+
+    "\16\0\1\114\1\161\12\20\1\0\1\35\13\2\2\0"+
+    "\14\2\1\136\3\2\1\136\31\2\1\136\43\2\1\136"+
+    "\134\2\4\136\53\2\2\136\2\2\1\136\41\2\1\136"+
+    "\72\2\1\136\35\2\1\77\52\2\1\77\51\2\2\136"+
+    "\31\2\1\136\102\2\1\136\61\2\1\136\1\2\1\136"+
+    "\5\2\1\136\110\2\1\35\41\2\12\0\1\162\3\20"+
+    "\1\0\6\2\2\0\25\2\1\136\11\2\1\77\7\2"+
+    "\1\136\143\2\1\136\1\2\1\136\11\2\1\136\2\2"+
+    "\1\136\6\2\1\136\1\2\1\136\33\2\1\136\27\2"+
+    "\3\136\133\2\1\136\172\2\1\136\237\2\1\136\116\2"+
+    "\1\136\25\2\1\35\36\2\6\0\1\20\1\0\2\2"+
+    "\2\0\161\2\1\136\37\2\1\136\32\2\1\136\24\2"+
+    "\1\77\47\2\1\136\46\2\1\136\161\2\1\136\16\2"+
+    "\1\136\1\2\1\136\30\2\1\136\37\2\1\136\322\2"+
+    "\1\163\4\0\1\20\1\164\1\2\1\165\1\166\31\2"+
+    "\1\136\22\2\1\136\1\2\1\136\13\2\1\136\12\2"+
+    "\1\136\1\2\1\136\37\2\1\136\15\2\1\136\53\2"+
+    "\1\136\155\2\1\136\13\2\1\136\116\2\1\136\35\2"+
+    "\2\136\14\2\1\136\230\2\1\136\42\2\1\136\22\2"+
+    "\3\0\214\2\1\136\2\2\1\136\66\2\1\136\51\2"+
+    "\1\136\36\2\1\136\73\2\1\136\6\2\1\136\253\2"+
+    "\1\136\33\2\3\0\1\167\26\2\1\136\14\2\1\136"+
+    "\10\2\1\136\101\2\1\136\3\2\1\136\71\2\1\136"+
+    "\114\2\1\136\31\2\1\136\204\2\1\136\126\2\1\136"+
+    "\22\2\1\136\2\2\1\136\160\2\1\136\15\2\1\136"+
+    "\10\2\1\136\10\2\1\136\4\2\2\136\2\2\1\136"+
+    "\112\2\1\136\207\2\1\136\2\2\1\136\104\2\1\136"+
+    "\23\2\1\136\24\2\1\136\24\2\1\136\43\2\1\136"+
+    "\73\2\1\136\27\2\2\136\105\2\1\136\65\2\1\136"+
+    "\3\2\1\136\1\2\1\136\14\2\1\136\17\2\1\136"+
+    "\53\2\1\136\22\2\1\136\7\2\1\136\5\2\1\136"+
+    "\257\2\1\136\4\2\1\136\113\2\1\136\1\2\1\136"+
+    "\1\2\1\136\13\2\1\136\125\2\1\136\37\2\1\136"+
+    "\22\2\1\136\45\2\1\136\27\2\1\136\154\2\1\136"+
+    "\171\2\1\136\32\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[7921];
+    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\137\0\276\0\u011d\0\u017c\0\u01db\0\u023a\0\u0299"+
+    "\0\u02f8\0\u0357\0\u03b6\0\u0415\0\u0474\0\u04d3\0\u0532\0\u0591"+
+    "\0\u05f0\0\u064f\0\u06ae\0\u070d\0\u076c\0\u07cb\0\u082a\0\u0889"+
+    "\0\u08e8\0\u0947\0\u09a6\0\u0a05\0\u0a64\0\u0ac3\0\u0b22\0\u0b81"+
+    "\0\u0be0\0\u0c3f\0\u0c9e\0\u0b22\0\u0cfd\0\u0d5c\0\u0dbb\0\u0e1a"+
+    "\0\u0e79\0\u0b22\0\u0b22\0\u0ed8\0\u0f37\0\u0f96\0\u0b22\0\u0ff5"+
+    "\0\u0b22\0\u0b22\0\u0b22\0\u1054\0\u0b22\0\u10b3\0\u1112\0\u1171"+
+    "\0\u11d0\0\u122f\0\u128e\0\u12ed\0\u134c\0\u13ab\0\u140a\0\u1469"+
+    "\0\u14c8\0\u1527\0\u1586\0\u15e5\0\u1644\0\u16a3\0\u1702\0\u1761"+
+    "\0\u1054\0\u17c0\0\u181f\0\u0b22\0\u187e\0\u0b22\0\u18dd\0\u0b22"+
+    "\0\u0b22\0\u0b22\0\u0b22\0\u0b22\0\u0b22\0\u193c\0\u0b22\0\u199b"+
+    "\0\u19fa\0\u0b22\0\u1a59\0\u1ab8\0\u0b22\0\u0b22\0\u1b17\0\u1b76"+
+    "\0\u1bd5\0\u1c34\0\u1c93\0\u1cf2\0\u1d51\0\u1db0\0\u0b22\0\u1e0f"+
+    "\0\u1e6e\0\u1ecd\0\u0b22\0\u1f2c\0\u1f8b\0\u1fea\0\u2049\0\u20a8"+
+    "\0\u2107\0\u2166\0\u21c5\0\u2224\0\u2283\0\u22e2\0\u2341\0\u23a0"+
+    "\0\u23ff\0\u245e\0\u0b22\0\u24bd\0\u251c\0\u257b\0\u0b22\0\u25da"+
+    "\0\u0b22\0\u2639\0\u0b22\0\u0b22\0\u25da\0\u2698\0\u0b22\0\u26f7"+
+    "\0\u2756\0\u27b5\0\u2814\0\u2873\0\u28d2\0\u0b22\0\u2931\0\u2990"+
+    "\0\u29ef\0\u2a4e\0\u0b22\0\u2aad\0\u0b22\0\u2b0c\0\u2b6b\0\u2bca"+
+    "\0\u2c29\0\u2c88\0\u2ce7\0\u2d46\0\u2da5\0\u2e04\0\u2e63\0\u2ec2"+
+    "\0\u2f21\0\u2f80\0\u2fdf\0\u303e\0\u309d\0\u30fc\0\u315b\0\u31ba"+
+    "\0\u3219\0\u3278\0\u32d7\0\u3336\0\u3395\0\u33f4\0\u3453\0\u34b2"+
+    "\0\u3511\0\u0b22\0\u3570\0\u35cf\0\u362e\0\u368d\0\u36ec\0\u0b22"+
+    "\0\u374b\0\u37aa\0\u0b22\0\u0b22\0\u3809\0\u3868\0\u0b22\0\u38c7"+
+    "\0\u0b22\0\u0b22\0\u0b22\0\u3926\0\u0b22\0\u3985\0\u39e4\0\u3a43"+
+    "\0\u3aa2\0\u3b01\0\u0b22\0\u0b22\0\u0b22\0\u0b22\0\u3926\0\u3985"+
+    "\0\u3b60\0\u3bbf\0\u0b22\0\u0b22\0\u0b22\0\u0b22\0\u3926\0\u0b22"+
+    "\0\u3c1e\0\u3c7d\0\u3cdc\0\u3d3b\0\u3d9a\0\u3df9\0\u0b22\0\u0b22"+
+    "\0\u0b22\0\u0b22\0\u0b22\0\u0b22\0\u0b22\0\u3e58\0\u3eb7\0\u3f16"+
+    "\0\u3f75\0\u3fd4\0\u4033\0\u0b22\0\u4092\0\u40f1\0\u4150\0\u41af"+
+    "\0\u420e\0\u426d\0\u42cc\0\u432b\0\u438a\0\u43e9\0\u4448\0\u44a7"+
+    "\0\u4506\0\u4565\0\u45c4\0\u4623\0\u4682\0\u46e1\0\u4740\0\u479f"+
+    "\0\u47fe\0\u485d\0\u48bc\0\u491b\0\u497a\0\u49d9\0\u4a38\0\u4a97"+
+    "\0\u4af6\0\u4b55\0\u4bb4\0\u4c13\0\u4c72\0\u4cd1\0\u4d30\0\u4d8f"+
+    "\0\u4dee\0\u4e4d\0\u4eac\0\u4f0b\0\u4f6a\0\u4fc9\0\u5028\0\u5087"+
+    "\0\u50e6\0\u5145\0\u51a4\0\u5203\0\u5262\0\u52c1\0\u5320\0\u537f"+
+    "\0\u53de\0\u543d\0\u549c\0\u54fb\0\u555a\0\u55b9\0\u5618\0\u5677"+
+    "\0\u56d6\0\u5735\0\u5794\0\u57f3\0\u5852\0\u58b1\0\u5910\0\u596f"+
+    "\0\u59ce\0\u5a2d\0\u5a8c\0\u5aeb\0\u5b4a\0\u5ba9\0\u0b22\0\u1e0f"+
+    "\0\u5c08\0\u5c67\0\u5cc6\0\u0b22\0\u5d25\0\u5d84\0\u5cc6\0\u5de3"+
+    "\0\u5e42\0\u5ea1\0\u5f00\0\u5f00\0\u5f5f\0\u5f00\0\u5fbe\0\u601d"+
+    "\0\u607c\0\u60db\0\u613a\0\u1b76\0\u6199\0\u61f8\0\u6257\0\u62b6"+
+    "\0\u6315\0\u6374\0\u63d3\0\u6432\0\u6491\0\u64f0\0\u654f\0\u65ae"+
+    "\0\u660d\0\u666c\0\u66cb\0\u672a\0\u6789\0\u67e8\0\u6847\0\u68a6"+
+    "\0\u6905\0\u6964\0\u69c3\0\u6a22\0\u6a81\0\u6ae0\0\u6b3f\0\u6b9e"+
+    "\0\u6bfd\0\u6c5c\0\u6cbb\0\u6d1a\0\u6d79\0\u6dd8\0\u6e37\0\u6e96"+
+    "\0\u6ef5\0\u6f54\0\u6fb3\0\u7012\0\u7071\0\u70d0\0\u712f\0\u718e"+
+    "\0\u71ed\0\u724c\0\u0b22\0\u72ab\0\u730a\0\u7369\0\u0b22\0\u73c8"+
+    "\0\u7427\0\u7486\0\u74e5\0\u7544\0\u75a3\0\u7602\0\u7661\0\u76c0"+
+    "\0\u5d84\0\u771f\0\u777e\0\u77dd\0\u783c\0\u789b\0\u78fa\0\u7959"+
+    "\0\u79b8\0\u7a17\0\u0b22\0\u7a76\0\u7ad5\0\u7b34\0\u7b93\0\u7bf2"+
+    "\0\u7c51\0\u7cb0\0\u7d0f\0\u7d6e\0\u7dcd\0\u7e2c\0\u7e8b\0\u7eea"+
+    "\0\u7f49\0\u7fa8\0\u8007\0\u8066\0\u80c5\0\u8124\0\u8183\0\u81e2"+
+    "\0\u8241\0\u82a0\0\u82ff\0\u835e\0\u83bd\0\u841c\0\u847b\0\u84da"+
+    "\0\u8539\0\u8598\0\u85f7\0\u8656\0\u86b5\0\u8714\0\u8773\0\u87d2"+
+    "\0\u8831\0\u8890\0\u88ef\0\u894e\0\u89ad\0\u8a0c\0\u8a6b\0\u8aca"+
+    "\0\u8b29\0\u8b88\0\u8be7\0\u8c46\0\u8ca5\0\u8d04\0\u8d63\0\u8dc2"+
+    "\0\u8e21\0\u8e80\0\u8edf\0\u8f3e\0\u8f9d\0\u8ffc\0\u905b\0\u90ba"+
+    "\0\u9119\0\u9178\0\u91d7\0\u9236\0\u9295\0\u92f4\0\u9353\0\u93b2"+
+    "\0\u9411\0\u9470\0\u94cf\0\u952e\0\u958d\0\u95ec\0\u964b\0\u96aa"+
+    "\0\u9709\0\u9768\0\u97c7\0\u9826\0\u9885\0\u98e4\0\u9943\0\u99a2"+
+    "\0\u9a01\0\u9a60\0\u9abf\0\u9b1e\0\u9b7d\0\u9bdc\0\u9c3b\0\u9c9a"+
+    "\0\u9cf9\0\u9d58\0\u9db7\0\u9e16\0\u9e75\0\u9ed4\0\u9f33\0\u9f92"+
+    "\0\u9ff1\0\ua050\0\ua0af\0\ua10e\0\ua16d\0\ua1cc\0\ua22b\0\ua28a"+
+    "\0\ua2e9\0\ua348\0\ua3a7\0\ua406\0\ua465\0\ua4c4\0\ua523\0\ua582"+
+    "\0\ua5e1\0\ua640\0\ua69f\0\ua6fe\0\ua75d\0\ua7bc\0\ua81b\0\ua87a"+
+    "\0\ua8d9\0\ua938\0\ua997\0\ua9f6\0\uaa55\0\uaab4\0\uab13\0\uab72"+
+    "\0\uabd1\0\uac30\0\uac8f\0\uacee\0\uad4d\0\uadac\0\uae0b\0\uae6a"+
+    "\0\uaec9\0\uaf28\0\uaf87\0\u1b76\0\uafe6\0\ub045\0\ub0a4\0\ub103"+
+    "\0\ub162\0\ub1c1\0\ub220\0\ub27f\0\ub2de\0\ub33d\0\ub39c\0\ub3fb"+
+    "\0\ub45a\0\ub4b9\0\ub518\0\ub577\0\ub5d6\0\ub635\0\ub694\0\ub6f3"+
+    "\0\ub752\0\ub7b1\0\ub810\0\ub86f\0\ub8ce\0\ub92d\0\ub98c\0\ub9eb"+
+    "\0\uba4a\0\ubaa9\0\ubb08\0\ubb67\0\ubbc6\0\ubc25\0\ubc84\0\ubce3"+
+    "\0\ubd42\0\ubda1\0\ube00\0\ube5f\0\ubebe\0\ubf1d\0\ubf7c\0\ubfdb"+
+    "\0\uc03a\0\uc099\0\uc0f8\0\uc157\0\uc1b6\0\uc215\0\uc274\0\u0b22"+
+    "\0\u0b22\0\uc2d3\0\u0b22\0\uc332\0\u0b22\0\uc391\0\uc3f0\0\uc44f"+
+    "\0\uc4ae\0\uc50d\0\uc56c\0\uc5cb\0\uc62a\0\uc689\0\uc6e8\0\uc747"+
+    "\0\uc7a6\0\uc805\0\uc864\0\uc8c3\0\u0b22\0\uc922\0\uc981\0\uc9e0"+
+    "\0\uca3f\0\uca9e\0\u3d9a\0\ucafd\0\u0b22\0\u3eb7\0\ucb5c\0\ucbbb"+
+    "\0\ucc1a\0\ucc79\0\u0b22\0\uccd8\0\ucd37\0\ucd96\0\ucdf5\0\uce54"+
+    "\0\uceb3\0\ucf12\0\ucf71\0\ucfd0\0\ud02f\0\ud08e\0\ud0ed\0\ud14c"+
+    "\0\ud1ab\0\ud20a\0\ud269\0\ud2c8\0\ud327\0\ud386\0\ud3e5\0\ud444"+
+    "\0\ud4a3\0\ud502\0\ud561\0\ud5c0\0\ud61f\0\ud67e\0\ud6dd\0\ud73c"+
+    "\0\ud79b\0\ud7fa\0\ud859\0\ud8b8\0\ud917\0\ud976\0\u4cd1\0\ud9d5"+
+    "\0\uda34\0\uda93\0\udaf2\0\udb51\0\udbb0\0\udc0f\0\udc6e\0\udccd"+
+    "\0\udd2c\0\udd8b\0\uddea\0\ude49\0\udea8\0\udf07\0\udf66\0\udfc5"+
+    "\0\u140a\0\ue024\0\ue083\0\ue0e2\0\ue141\0\ue1a0\0\ue1ff\0\ue25e"+
+    "\0\ue2bd\0\ue31c\0\ue37b\0\ue3da\0\ue439\0\ue498\0\ue4f7\0\ue556"+
+    "\0\ue5b5\0\ue614\0\ue673\0\ue6d2\0\ue731\0\ue790\0\ue7ef\0\ue84e"+
+    "\0\ue8ad\0\u5f00\0\ue90c\0\ue96b\0\ue9ca\0\uea29\0\uea88\0\ueae7"+
+    "\0\ueb46\0\ueba5\0\uec04\0\uec63\0\uecc2\0\ued21\0\ued80\0\ueddf"+
+    "\0\uee3e\0\uee9d\0\ueefc\0\uef5b\0\uefba\0\uf019\0\uf078\0\uf0d7"+
+    "\0\uf136\0\uf195\0\uf1f4\0\uf253\0\u1b76\0\uf2b2\0\uf311\0\uf370"+
+    "\0\uf3cf\0\uf42e\0\uf48d\0\uf4ec\0\uf54b\0\uf5aa\0\uf609\0\uf668"+
+    "\0\uf6c7\0\uf726\0\uf785\0\uf7e4\0\uf843\0\uf8a2\0\uf901\0\uf960"+
+    "\0\uf9bf\0\ufa1e\0\ufa7d\0\ufadc\0\ufb3b\0\ufb9a\0\ufbf9\0\ufc58"+
+    "\0\ufcb7\0\ufd16\0\ufd75\0\ufdd4\0\ufe33\0\ufe92\0\ufef1\0\uff50"+
+    "\0\uffaf\1\16\1\155\1\314\1\u012b\1\u018a\1\u01e9\1\u0248"+
+    "\1\u02a7\1\u0306\1\u0365\1\u03c4\1\u0423\1\u0482\1\u04e1\1\u0540"+
+    "\1\u059f\1\u05fe\1\u065d\1\u06bc\1\u071b\1\u077a\1\u07d9\1\u0838"+
+    "\1\u0897\1\u08f6\1\u0955\1\u09b4\1\u0a13\1\u0a72\1\u0ad1\1\u0b30"+
+    "\1\u0b8f\1\u0bee\1\u0c4d\1\u0cac\1\u0d0b\1\u0d6a\1\u0dc9\1\u0e28"+
+    "\1\u0e87\1\u0ee6\1\u0f45\1\u0fa4\1\u1003\1\u1062\1\u10c1\1\u1120"+
+    "\1\u117f\1\u11de\1\u123d\1\u129c\1\u12fb\1\u135a\1\u13b9\1\u1418"+
+    "\1\u1477\1\u14d6\1\u1535\1\u1594\1\u15f3\1\u1652\1\u16b1\1\u1710"+
+    "\1\u176f\1\u17ce\1\u182d\1\u188c\1\u18eb\1\u194a\1\u19a9\1\u1a08"+
+    "\1\u1a67\1\u1ac6\1\u1b25\1\u1b84\1\u1be3\1\u1c42\1\u1ca1\1\u1d00"+
+    "\1\u1d5f\1\u1dbe\1\u1e1d\1\u1e7c\1\u1edb\1\u1f3a\1\u1f99\1\u1ff8"+
+    "\1\u2057\1\u20b6\1\u2115\1\u2174\1\u21d3\1\u2232\1\u2291\1\u22f0"+
+    "\1\u234f\1\u23ae\1\u240d\1\u246c\1\u24cb\1\u252a\1\u2589\1\u25e8"+
+    "\1\u2647\1\u26a6\1\u2705\1\u2764\1\u27c3\1\u2822\1\u2881\1\u28e0"+
+    "\1\u293f\1\u299e\1\u29fd\1\u2a5c\1\u2abb\1\u1f3a\1\u2b1a\1\u2b79"+
+    "\1\u2bd8\1\u2c37\1\u2c96\1\u2cf5\1\u2d54\1\u2db3\1\u2e12\1\u2e71"+
+    "\1\u2ed0\1\u2f2f\1\u2f8e\1\u2fed\1\u304c\1\u30ab\1\u310a\1\u3169"+
+    "\1\u31c8\1\u3227\1\u3286\1\u32e5\1\u3344\1\u33a3\1\u3402\1\u3461"+
+    "\1\u34c0\1\u351f\1\u357e\1\u35dd\1\u363c\1\u369b\1\u36fa\1\u3759"+
+    "\1\u37b8\1\u3817\1\u3876\1\u38d5\1\u3934\1\u3993\1\u39f2\1\u3a51"+
+    "\1\u3ab0\1\u3b0f\1\u3b6e\1\u3bcd\1\u3c2c\1\u3c8b\1\u3cea\1\u3d49"+
+    "\1\u3da8\1\u3e07\1\u3e66\1\u3ec5\1\u3f24\0\uf253\1\u3f83\1\u3fe2"+
+    "\1\u4041\1\u40a0\1\u40ff\1\u415e\1\u41bd\1\u421c\1\u427b\1\u42da"+
+    "\1\u4339\1\u4398\1\u43f7\1\u4456\1\u44b5\1\u4514\1\u4573\1\u45d2"+
+    "\1\u4631\1\u4690\1\u46ef\1\u474e\1\u47ad\1\u480c\1\u486b\1\u48ca"+
+    "\1\u4929\1\u4988\1\u49e7\1\u4a46\1\u4aa5\1\u4b04\1\u4b63\1\u4bc2"+
+    "\1\u4c21\1\u4c80\1\u4cdf\1\u4d3e\1\u4d9d\1\u4dfc\1\u4e5b\1\u4eba"+
+    "\1\u4f19\1\u4f78\1\u4fd7\1\u5036\1\u5095\1\u50f4\1\u5153\1\u51b2"+
+    "\1\u5211\1\u5270\1\u52cf\1\u532e\1\u538d\1\u53ec\1\u544b\1\u54aa"+
+    "\1\u5509\1\u5568\1\u55c7\1\u5626\1\u5685\1\u56e4\1\u5743\1\u57a2"+
+    "\1\u5801\1\u5860\1\u58bf\1\u591e\1\u597d\1\u59dc\1\u5a3b\1\u5a9a"+
+    "\1\u5af9\1\u5b58\1\u5bb7\1\u5c16\1\u5c75\1\u5cd4\1\u5d33\1\u5d92"+
+    "\1\u5df1\1\u5e50\1\u5eaf\1\u5f0e\1\u5f6d\1\u5fcc\1\u602b\1\u608a"+
+    "\1\u60e9\1\u6148\1\u61a7\1\u6206\1\u6265\1\u62c4\1\u6323\1\u6382"+
+    "\1\u63e1\1\u6440\1\u649f\1\u64fe\1\u655d\1\u65bc\1\u661b\1\u667a"+
+    "\1\u66d9\1\u6738\1\u6797\1\u67f6\1\u6855\1\u68b4\1\u6913\1\u6972"+
+    "\1\u69d1\1\u6a30\1\u6a8f\1\u6aee\1\u6b4d\1\u6bac\1\u6c0b\1\u6c6a"+
+    "\1\u6cc9\1\u6d28\1\u6d87\1\u6de6\1\u6e45\1\u1e7c\1\u6ea4\1\u6f03"+
+    "\1\u6f62\1\u6fc1\1\u7020\1\u707f\1\u70de\1\u713d\1\u719c\1\u71fb"+
+    "\1\u725a\1\u72b9\1\u7318\1\u7377\1\u73d6\1\u7435\1\u7494\1\u74f3"+
+    "\1\u7552\1\u75b1\1\u7610\1\u766f\1\u76ce\1\u772d\1\u778c\1\u77eb"+
+    "\1\u784a\1\u78a9\1\u7908\1\u7967\1\u79c6\1\u7a25\1\u7a84\1\u7ae3"+
+    "\1\u7b42\1\u7ba1\1\u7c00\1\u7c5f\1\u7cbe\1\u7d1d\1\u7d7c\1\u7ddb"+
+    "\1\u7e3a\1\u7e99\1\u7ef8\1\u7f57\1\u7fb6\1\u8015\1\u8074\1\u80d3"+
+    "\1\u8132\1\u8191\1\u81f0\1\u824f\1\u82ae\1\u830d\1\u836c\1\u83cb"+
+    "\1\u842a\1\u8489\1\u84e8\1\u8547\1\u85a6\1\u8605\1\u8664\1\u86c3"+
+    "\1\u8722\1\u8781\1\u87e0\1\u883f\1\u889e\1\u88fd\1\u895c\1\u89bb"+
+    "\1\u8a1a\1\u8a79\1\u8ad8\1\u8b37\1\u8b96\1\u8bf5\1\u8c54\1\u8cb3"+
+    "\1\u8d12\1\u8d71\1\u8dd0\1\u8e2f\1\u8e8e\1\u8eed\1\u8f4c\1\u8fab"+
+    "\1\u900a\1\u9069\1\u90c8\1\u9127\1\u9186\1\u91e5\1\u9244\1\u92a3"+
+    "\1\u9302\1\u9361\1\u93c0\1\u941f\1\u947e\1\u94dd\1\u953c\1\u959b"+
+    "\1\u95fa\1\u9659\1\u96b8\1\u9717\0\u0b22\1\u9776\1\u97d5\1\u9834"+
+    "\1\u9893\1\u98f2\1\u9951\1\u99b0\1\u9a0f\1\u9a6e\1\u9acd\1\u9b2c"+
+    "\1\u9b8b\1\u9bea\1\u9c49\1\u9ca8\1\u9d07\1\u9d66\1\u9dc5\1\u9e24"+
+    "\1\u9e83\1\u9ee2\1\u9f41\1\u9fa0\1\u9fff\1\ua05e\1\ua0bd\1\ua11c"+
+    "\1\ua17b\1\ua1da\1\ua239\1\ua298\0\ud859\0\u4dee\1\ua2f7\1\ua356"+
+    "\1\ua3b5\1\ua414\1\ua473\1\ua4d2\1\ua531\1\ua590\1\ua5ef\1\ua64e"+
+    "\0\u0b22\1\ua6ad\1\ua70c\1\ua76b\1\ua7ca\1\ua829\1\ua888\1\ua8e7"+
+    "\1\ua946\0\u1b76\1\ua9a5\1\uaa04\1\uaa63\1\uaac2\0\u1b76\1\uab21"+
+    "\1\uab80\1\uabdf\1\uac3e\1\uac9d\0\u1b76\1\uacfc\1\uad5b\1\uadba"+
+    "\1\uae19\1\uae78\1\uaed7\1\uaf36\1\uaf95\1\uaff4\1\ub053\1\ub0b2"+
+    "\1\ub111\1\ub170\1\ub1cf\1\ub22e\0\u730a\0\u0b22\1\ub28d\1\ub2ec"+
+    "\1\ub34b\1\ub3aa\1\ub409\1\ub468\1\ub4c7\1\ub526\1\ub585\1\ub5e4"+
+    "\1\ub643\1\ub6a2\1\ub701\1\ub760\1\ub7bf\1\ub81e\1\ub87d\1\ub8dc"+
+    "\1\ub93b\1\ub99a\1\ub9f9\1\uba58\1\ubab7\1\ubb16\1\ubb75\1\ubbd4"+
+    "\1\ubc33\1\ubc92\1\ubcf1\1\ubd50\1\ubdaf\1\ube0e\1\ube6d\1\ubecc"+
+    "\1\ubf2b\1\ubf8a\1\ubfe9\1\uc048\1\uc0a7\1\uc106\1\uc165\1\uc1c4"+
+    "\1\uc223\1\uc282\1\uc2e1\1\uc340\1\uc39f\1\uc3fe\1\uc45d\1\uc4bc"+
+    "\1\uc51b\1\uc57a\1\uc5d9\1\uc638\1\uc697\1\uc6f6\1\uc755\1\uc7b4"+
+    "\1\uc813\1\ubfe9\1\uc872\1\uc8d1\1\uc930\1\uc98f\1\uc9ee\1\uca4d"+
+    "\1\ucaac\1\ucb0b\1\ucb6a\1\ucbc9\1\ucc28\1\ucc87\1\ucce6\1\ucd45"+
+    "\1\ucda4\1\uce03\1\uce62\1\ucec1\1\ucf20\1\ucf7f\1\ucfde\1\ud03d"+
+    "\1\ud09c\1\ud0fb\1\ud15a\1\ud1b9\1\ud218\1\ud277\1\ud2d6\1\ud335"+
+    "\1\ud394\1\ud3f3\1\ud452\1\ud4b1\1\ud510\0\u88ef\1\ud56f\1\ud5ce"+
+    "\1\ud62d\1\ud68c\1\ud6eb\1\ud74a\1\ud7a9\1\ud808\1\ud867\1\ud8c6"+
+    "\1\ud925\1\ud984\1\ud9e3\1\uda42\1\udaa1\1\udb00\1\udb5f\1\udbbe"+
+    "\1\udc1d\1\udc7c\1\udcdb\1\udd3a\1\udd99\1\uddf8\1\ude57\1\udeb6"+
+    "\1\udf15\1\udf74\1\udfd3\1\ue032\1\ue091\1\ue0f0\1\ue14f\1\ue1ae"+
+    "\1\ue20d\1\ue26c\1\ue2cb\1\ue32a\1\ue389\1\ue3e8\1\ue447\1\ue4a6"+
+    "\1\ue505\1\ue564\1\ue5c3\1\ue622\1\ue681\1\ue6e0\1\ue73f\1\ue79e"+
+    "\1\ue7fd\1\ue85c\1\ue8bb\1\ue91a\1\ue979\1\ue9d8\1\uea37\1\uea96"+
+    "\0\u1b76\1\ueaf5\1\ueb54\1\uebb3\1\uec12\1\uec71\1\uecd0\1\ued2f"+
+    "\1\ued8e\1\ueded\1\uee4c\1\ueeab\1\uef0a\1\uef69\1\uefc8\1\uf027"+
+    "\1\uf086\1\uf0e5\1\uf144\1\uf1a3\1\uf202\1\uf261\1\uf2c0\1\uf31f"+
+    "\1\uf37e\1\uf3dd\1\uf43c\1\uf49b\1\uf4fa\1\uf559\1\uf5b8\1\uf617"+
+    "\1\uf676\1\uf6d5\1\uf734\1\uf793\1\uf7f2\1\uf851\1\uf8b0\1\uf90f"+
+    "\1\uf96e\1\uf9cd\1\ufa2c\1\ufa8b\1\u15f3\1\ufaea\1\ufb49\1\ufba8"+
+    "\1\ufc07\1\ufc66\1\ufcc5\1\ufd24\1\ufd83\1\ufde2\1\ufe41\1\ufea0"+
+    "\1\ufeff\1\uff5e\1\uffbd\2\34\2\173\2\332\2\u0139\2\u0198"+
+    "\2\u01f7\2\u0256\2\u02b5\2\u0314\2\u0373\1\uacfc\2\u03d2\2\u0431"+
+    "\2\u0490\2\u04ef\2\u054e\2\u05ad\2\u060c\2\u066b\2\u06ca\2\u0729"+
+    "\2\u0788\2\u07e7\2\u0846\2\u08a5\2\u0904\2\u0963\2\u09c2\2\u0a21"+
+    "\2\u0a80\2\u0adf\2\u0b3e\2\u0b9d\2\u0bfc\2\u0c5b\2\u0cba\2\u0d19"+
+    "\2\u0d78\2\u0dd7\2\u0e36\2\u0e95\2\u0ef4\2\u0f53\2\u0fb2\2\u1011"+
+    "\2\u1070\2\u10cf\2\u112e\2\u118d\2\u11ec\2\u124b\2\u12aa\2\u1309"+
+    "\2\u1368\2\u13c7\2\u1426\2\u1485\2\u14e4\2\u1543\2\u15a2\2\u1601"+
+    "\2\u1660\2\u16bf\2\u171e\2\u177d\2\u17dc\2\u183b\2\u189a\2\u18f9"+
+    "\2\u1958\2\u19b7\2\u1a16\2\u1a75\2\u1ad4\2\u1b33\2\u1b92\2\u1bf1"+
+    "\2\u1c50\2\u1caf\2\u1d0e\2\u1d6d\2\u1dcc\2\u1e2b\2\u1e8a\2\u1ee9"+
+    "\2\u1f48\2\u1fa7\2\u2006\2\u2065\2\u20c4\2\u2123\2\u2182\2\u21e1"+
+    "\2\u2240\2\u229f\2\u22fe\2\u235d\2\u23bc\2\u241b\2\u247a\2\u24d9"+
+    "\2\u2538\2\u2597\2\u25f6\2\u2655\2\u26b4\2\u2713\2\u2772\2\u27d1"+
+    "\2\u2830\1\u6a30\2\u288f\2\u28ee\2\u294d\2\u29ac\2\u2a0b\2\u2a6a"+
+    "\2\u2ac9\2\u2b28\2\u2b87\2\u2be6\2\u2c45\2\u2ca4\2\u2d03\2\u2d62"+
+    "\2\u2dc1\2\u2e20\2\u2e7f\2\u2ede\2\u2f3d\2\u2f9c\2\u2ffb\2\u305a"+
+    "\2\u30b9\2\u3118\2\u3177\2\u31d6\2\u3235\2\u3294\2\u32f3\2\u3352"+
+    "\2\u33b1\2\u3410\2\u346f\2\u34ce\2\u352d\2\u358c\2\u35eb\2\u364a"+
+    "\2\u36a9\2\u3708\2\u3767\2\u37c6\2\u3825\2\u3884\2\u38e3\2\u3942"+
+    "\2\u39a1\2\u3a00\2\u3a5f\2\u3abe\2\u3b1d\2\u3b7c\2\u3bdb\2\u3c3a"+
+    "\2\u3c99\2\u3cf8\2\u3d57\2\u3db6\2\u3e15\2\u3e74\2\u3ed3\2\u3f32"+
+    "\2\u3f91\2\u3ff0\2\u404f\2\u40ae\2\u410d\2\u416c\2\u41cb\2\u422a"+
+    "\2\u4289\2\u42e8\2\u4347\2\u43a6\2\u4405\2\u4464\2\u44c3\2\u4522"+
+    "\2\u4581\2\u45e0\2\u463f\2\u469e\2\u46fd\2\u475c\2\u47bb\2\u481a"+
+    "\2\u4879\2\u48d8\2\u4937\2\u4996\2\u49f5\2\u4a54\2\u4ab3\2\u4b12"+
+    "\2\u4b71\2\u4bd0\2\u4c2f\2\u4c8e\2\u4ced\2\u4d4c\2\u4dab\2\u4e0a"+
+    "\2\u4e69\2\u4ec8\2\u4f27\2\u4f86\2\u4fe5\2\u5044\2\u50a3\2\u5102"+
+    "\2\u5161\2\u51c0\2\u521f\2\u527e\2\u52dd\2\u533c\2\u539b\2\u53fa"+
+    "\2\u5459\2\u54b8\2\u5517\2\u5576\2\u55d5\2\u5634\2\u5693\2\u56f2"+
+    "\2\u5751\2\u57b0\2\u580f\2\u586e\2\u58cd\2\u592c\2\u598b\2\u59ea"+
+    "\2\u5a49\2\u5aa8\2\u5b07\2\u5b66\2\u5bc5\2\u5c24\2\u5c83\2\u5ce2"+
+    "\2\u5d41\2\u5da0\2\u5dff\2\u5e5e\2\u5ebd\2\u5f1c\2\u5f7b\2\u5fda"+
+    "\2\u6039\2\u6098\2\u60f7\2\u6156\2\u61b5\2\u6214\2\u6273\2\u62d2"+
+    "\2\u6331\2\u6390\2\u63ef\2\u644e\2\u64ad\2\u650c\2\u656b\2\u65ca"+
+    "\2\u6629\2\u6688\2\u66e7\2\u6746\2\u67a5\2\u6804\2\u6863\2\u68c2"+
+    "\2\u6921\2\u6980\2\u69df\2\u6a3e\2\u6a9d\2\u6afc\2\u6b5b\2\u6bba"+
+    "\2\u6c19\2\u6c78\2\u6cd7\2\u6d36\2\u6d95\2\u6df4\2\u6e53\2\u6eb2"+
+    "\2\u6f11\2\u6f70\2\u6fcf\2\u702e\2\u708d\2\u70ec\2\u714b\2\u71aa"+
+    "\2\u7209\2\u7268\2\u72c7\2\u7326\2\u7385\2\u73e4\2\u7443\0\u0b22"+
+    "\2\u74a2\2\u7501\2\u7560\2\u75bf\2\u761e\0\u0b22\2\u767d\1\u9893"+
+    "\0\u0ed8\2\u76dc\2\u773b\2\u779a\2\u77f9\2\u7858\2\u78b7\2\u7916"+
+    "\2\u7975\2\u79d4\2\u7a33\2\u7a33\2\u7a92\2\u7af1\2\u7b50\2\u7baf"+
+    "\2\u7c0e\2\u7c6d\2\u7ccc\2\u7d2b\2\u7d8a\0\u0b22\2\u7de9\0\u0b22"+
+    "\2\u7e48\2\u7ea7\2\u7f06\2\u7f65\2\u7fc4\2\u8023\0\uecc2\2\u8082"+
+    "\2\u80e1\2\u8140\2\u819f\2\u81fe\2\u825d\2\u82bc\2\u831b\2\u837a"+
+    "\2\u83d9\2\u8438\2\u8497\2\u84f6\2\u8555\2\u85b4\2\u8613\1\ub3aa"+
+    "\2\u8672\2\u86d1\1\ub526\2\u8730\2\u878f\2\u87ee\2\u884d\2\u88ac"+
+    "\2\u890b\2\u896a\2\u89c9\2\u8a28\2\u8a87\2\u8ae6\2\u8b45\2\u8ba4"+
+    "\2\u8c03\2\u8c62\2\u8cc1\2\u8d20\2\u8d7f\2\u8dde\2\u8e3d\2\u8e9c"+
+    "\2\u8efb\2\u8f5a\0\u9e16\2\u8fb9\2\u9018\2\u9077\2\u90d6\2\u9135"+
+    "\2\u9194\2\u91f3\2\u9252\2\u92b1\2\u9310\2\u936f\2\u93ce\2\u942d"+
+    "\2\u948c\2\u94eb\2\u954a\2\u95a9\2\u9608\2\u9667\2\u96c6\2\u9725"+
+    "\2\u9784\2\u97e3\2\u9842\2\u98a1\2\u9900\2\u995f\2\u99be\2\u9a1d"+
+    "\2\u9a7c\2\u9adb\2\u9b3a\2\u9b99\2\u9bf8\2\u9c57\2\u9cb6\2\u9d15"+
+    "\2\u9d74\2\u9dd3\2\u9e32\2\u9e91\2\u9ef0\2\u9f4f\2\u9fae\2\ua00d"+
+    "\2\ua06c\2\ua0cb\2\ua12a\2\ua189\2\ua1e8\2\ua247\2\ua2a6\2\ua305"+
+    "\2\ua364\2\ua3c3\2\ua422\2\ua481\2\ua4e0\2\ua53f\2\ua59e\2\ua5fd"+
+    "\2\ua65c\2\ua6bb\2\ua71a\2\ua779\2\ua7d8\2\ua837\2\ua896\2\ua8f5"+
+    "\2\ua954\2\ua9b3\2\uaa12\2\uaa71\2\uaad0\2\uab2f\2\uab8e\2\uabed"+
+    "\2\uac4c\2\uacab\2\uad0a\2\uad69\2\uadc8\2\uae27\2\uae86\2\uaee5"+
+    "\2\uaf44\2\uafa3\2\ub002\2\ub061\2\ub0c0\2\ub11f\2\ub17e\2\ub1dd"+
+    "\2\ub23c\2\ub29b\2\ub2fa\2\ub359\2\ub3b8\2\ub417\2\ub476\2\ub4d5"+
+    "\2\ub534\2\ub593\2\ub5f2\2\ub651\2\ub6b0\2\ub70f\2\ub76e\2\ub7cd"+
+    "\2\ub82c\2\ub88b\2\ub8ea\2\ub949\2\ub9a8\2\uba07\2\uba66\2\ubac5"+
+    "\2\ubb24\2\ubb83\2\ubbe2\2\ubc41\2\ubca0\2\ubcff\2\ubd5e\2\ubdbd"+
+    "\2\ube1c\2\ube7b\2\ubeda\2\ubf39\2\ubf98\2\ubff7\2\uc056\2\uc0b5"+
+    "\2\uc114\2\uc173\2\uc1d2\2\uc231\2\uc290\2\uc2ef\2\uc34e\2\uc3ad"+
+    "\2\uc40c\2\uc46b\2\uc4ca\2\uc529\2\uc588\2\uc5e7\2\uc646\2\uc6a5"+
+    "\2\uc704\2\uc763\2\uc7c2\2\uc821\2\uc880\2\uc8df\2\ub651\2\uc93e"+
+    "\2\uc99d\2\uc9fc\2\uca5b\2\ucaba\2\ucb19\2\ucb78\2\ucbd7\2\ucc36"+
+    "\2\ucc95\2\uccf4\2\ucd53\2\ucdb2\2\uce11\2\uce70\2\ucecf\2\ucf2e"+
+    "\2\ucf8d\2\uc93e\2\ucfec\2\ud04b\2\ud0aa\2\ud109\2\ud168\2\ud1c7"+
+    "\2\ud226\2\ud285\2\ud2e4\2\ud343\2\ud3a2\2\ud401\2\ud460\2\ud4bf"+
+    "\2\ud51e\2\ud57d\2\ud5dc\2\ud63b\2\ud69a\2\ud6f9\2\ud758\2\ud7b7"+
+    "\2\ud816\2\ud875\2\ud8d4\2\ud933\2\ud992\2\ud9f1\2\uda50\2\udaaf"+
+    "\2\udb0e\2\udb6d\2\udbcc\2\udc2b\2\udc8a\2\udce9\2\udd48\2\udda7"+
+    "\2\ude06\2\ude65\2\udec4\2\udf23\2\udf82\2\udfe1\2\ue040\2\ue09f"+
+    "\2\ue0fe\2\ue15d\2\ue1bc\2\ue21b\2\ue27a\2\ue2d9\2\ue338\2\ue397"+
+    "\2\ue3f6\1\uf086\2\ue455\2\ue4b4\2\ue513\2\ue572\2\ue5d1\2\ue630"+
+    "\2\ue68f\2\ue6ee\2\ue74d\2\ue7ac\2\ue80b\2\ue86a\2\ue8c9\2\ue928"+
+    "\2\ue987\2\ue9e6\2\uea45\2\ueaa4\2\ueb03\2\ueb62\2\uebc1\2\uec20"+
+    "\2\uec7f\2\uecde\2\ued3d\2\ued9c\2\uedfb\2\uee5a\2\ueeb9\2\uef18"+
+    "\2\uef77\2\uefd6\2\uf035\2\uf094\2\uf0f3\2\uf152\2\uf1b1\2\uf210"+
+    "\2\uf26f\2\uf2ce\2\uf32d\2\uf38c\2\uf3eb\2\uf44a\2\uf4a9\2\uf508"+
+    "\2\uf567\2\uf5c6\2\uf625\2\uf684\2\uf6e3\2\uf742\2\uf7a1\2\uf800"+
+    "\2\uf85f\2\uf8be\2\uf91d\2\uf97c\2\uf9db\2\ufa3a\2\ufa99\2\ufaf8"+
+    "\2\ufb57\2\ufbb6\2\ufc15\2\ufc74\2\ufcd3\2\ufd32\2\ufd91\2\ufdf0"+
+    "\2\ufe4f\2\ufeae\2\uff0d\2\uff6c\2\uffcb\3\52\3\211\3\350"+
+    "\3\u0147\3\u01a6\3\u0205\3\u0264\3\u02c3\3\u0322\3\u0381\3\u03e0"+
+    "\3\u043f\3\u049e\3\u04fd\3\u055c\3\u05bb\3\u061a\3\u0679\3\u06d8"+
+    "\3\u0737\3\u0796\3\u07f5\3\u0854\3\u08b3\3\u0912\3\u0971\3\u09d0"+
+    "\3\u0a2f\3\u0a8e\3\u0aed\3\u0b4c\3\u0bab\3\u0c0a\3\u0c69\3\u0cc8"+
+    "\3\u0d27\3\u0d86\3\u0de5\3\u0e44\3\u0ea3\3\u0f02\3\u0f61\3\u0fc0"+
+    "\3\u101f\3\u107e\3\u10dd\3\u113c\3\u119b\3\u11fa\3\u1259\3\u12b8"+
+    "\3\u1317\3\u1376\3\u13d5\3\u1434\3\u1493\3\u14f2\3\u1551\3\u15b0"+
+    "\3\u160f\3\u166e\3\u16cd\3\u172c\3\u178b\3\u17ea\3\u1849\3\u18a8"+
+    "\3\u1907\3\u1966\3\u19c5\3\u1a24\3\u1a83\3\u1ae2\3\u1b41\3\u1ba0"+
+    "\3\u1bff\3\u1c5e\3\u1cbd\3\u1d1c\3\u1d7b\3\u1dda\3\u1e39\3\u1e98"+
+    "\3\u1ef7\3\u1f56\3\u1fb5\3\u2014\3\u2073\3\u20d2\3\u2131\3\u2190"+
+    "\3\u21ef\3\u224e\3\u22ad\3\u230c\3\u236b\3\u23ca\3\u2429\3\u2488"+
+    "\3\u24e7\3\u2546\3\u25a5\3\u2604\3\u2663\3\u26c2\3\u2721\3\u2780"+
+    "\3\u27df\3\u283e\3\u289d\3\u28fc\3\u295b\3\u29ba\3\u2a19\3\u2a78"+
+    "\3\u2ad7\3\u2b36\3\u2b95\3\u2bf4\3\u2c53\3\u2cb2\3\u2d11\3\u2d70"+
+    "\3\u2dcf\3\u2e2e\3\u2e8d\3\u2eec\3\u2f4b\3\u2faa\3\u3009\3\u3068"+
+    "\3\u30c7\3\u3126\3\u3185\3\u31e4\3\u3243\3\u32a2\3\u3301\3\u3360"+
+    "\3\u33bf\3\u341e\3\u347d\3\u34dc\3\u353b\3\u359a\3\u35f9\3\u3658"+
+    "\3\u36b7\3\u3716\3\u3775\3\u37d4\3\u3833\3\u3892\3\u38f1\3\u3950"+
+    "\3\u39af\3\u3a0e\3\u3a6d\3\u3acc\3\u3b2b\3\u3b8a\3\u3be9\3\u3c48"+
+    "\3\u3ca7\3\u3d06\3\u3d65\3\u3dc4\3\u3e23\3\u3e82\3\u3ee1\3\u3f40"+
+    "\3\u3f9f\3\u3ffe\3\u405d\3\u40bc\3\u411b\3\u417a\3\u41d9\3\u4238"+
+    "\3\u4297\3\u42f6\3\u4355\3\u43b4\3\u4413\3\u4472\3\u44d1\3\u4530"+
+    "\3\u458f\3\u45ee\3\u464d\3\u46ac\3\u470b\3\u476a\3\u47c9\3\u4828"+
+    "\3\u4887\3\u48e6\3\u4945\3\u49a4\3\u4a03\3\u4a62\3\u4ac1\3\u4b20"+
+    "\3\u4b7f\3\u4bde\3\u4c3d\3\u4c9c\3\u4cfb\3\u4d5a\3\u4db9\3\u4e18"+
+    "\3\u4e77\3\u4ed6\3\u4f35\3\u4f94\3\u4ff3\3\u5052\3\u50b1\3\u5110"+
+    "\3\u516f\3\u51ce\3\u522d\3\u528c\3\u52eb\3\u534a\3\u53a9\3\u5408"+
+    "\3\u5467\3\u54c6\3\u5525\3\u5584\3\u55e3\3\u5642\3\u56a1\3\u5700"+
+    "\3\u575f\3\u57be\3\u581d\3\u587c\3\u58db\3\u593a\3\u5999\3\u59f8"+
+    "\3\u5a57\3\u5ab6\3\u5b15\3\u5b74\3\u5bd3\3\u5c32\3\u5c91\3\u5cf0"+
+    "\3\u5d4f\3\u5dae\3\u5e0d\3\u5e6c\3\u5ecb\3\u5f2a\3\u5f89\3\u5fe8"+
+    "\3\u6047\3\u60a6\1\u1710\3\u6105\3\u6164\3\u61c3\3\u6222\3\u6281"+
+    "\3\u62e0\3\u633f\3\u639e\3\u63fd\3\u645c\3\u64bb\3\u651a\3\u6579"+
+    "\3\u65d8\3\u6637\3\u6696\3\u66f5\3\u6754\3\u67b3\3\u6812\3\u6871"+
+    "\3\u68d0\3\u692f\3\u698e\3\u69ed\3\u6a4c\3\u6aab\3\u6b0a\3\u6b69"+
+    "\3\u6bc8\3\u6c27\3\u6c86\3\u6ce5\3\u6d44\3\u6da3\3\u6e02\3\u6e61"+
+    "\3\u6ec0\3\u6f1f\3\u6f7e\3\u6fdd\3\u703c\3\u709b\3\u70fa\3\u7159"+
+    "\3\u71b8\3\u7217\3\u7276\3\u72d5\3\u7334\3\u7393\3\u73f2\3\u7451"+
+    "\3\u74b0\0\u3f75\3\u750f\3\u756e\3\u75cd\3\u762c\3\u768b\3\u76ea"+
+    "\3\u7749\3\u77a8\3\u7807\3\u7866\3\u78c5\3\u7924\3\u7983\3\u79e2"+
+    "\3\u7a41\3\u7aa0\3\u7aff\3\u7b5e\3\u7bbd\3\u7c1c\3\u7c7b\3\u7cda"+
+    "\3\u7d39\3\u7d98\3\u7df7\3\u7e56\3\u7eb5\3\u7f14\3\u7f73\3\u7fd2"+
+    "\3\u8031\3\u8090\3\u80ef\3\u814e\3\u81ad\3\u820c\3\u826b\3\u82ca"+
+    "\3\u8329\3\u8388\3\u83e7\3\u8446\3\u84a5\3\u8504\3\u8563\3\u85c2"+
+    "\3\u8621\3\u8680\3\u86df\3\u873e\3\u879d\3\u87fc\3\u885b\3\u88ba"+
+    "\3\u8919\3\u8978\3\u89d7\3\u8a36\3\u8a95\3\u8af4\3\u8b53\3\u8bb2"+
+    "\3\u8c11\3\u8c70\3\u8ccf\3\u8d2e\3\u8d8d\3\u8dec\3\u8e4b\3\u8eaa"+
+    "\3\u8f09\3\u8f68\3\u8fc7\3\u9026\3\u9085\3\u90e4\3\u9143\3\u91a2"+
+    "\3\u9201\3\u9260\3\u92bf\3\u931e\3\u937d\3\u93dc\3\u943b\3\u949a"+
+    "\3\u94f9\3\u9558\3\u95b7\3\u9616\3\u9675\3\u96d4\3\u9733\3\u9792"+
+    "\3\u97f1\3\u9850\3\u98af\3\u990e\3\u996d\3\u99cc\3\u9a2b\3\u9a8a"+
+    "\3\u9ae9\3\u9b48\3\u9ba7\3\u9c06\3\u9c65\3\u9cc4\3\u9d23\3\u9d82"+
+    "\3\u9de1\3\u9e40\3\u9e9f\3\u9efe\3\u9f5d\3\u9fbc\3\ua01b\3\ua07a"+
+    "\3\ua0d9\3\ua138\3\ua197\3\ua1f6\3\ua255\3\ua2b4\3\ua313\3\ua372"+
+    "\3\ua3d1\3\ua430\3\ua48f\3\ua4ee\3\ua54d\3\ua5ac\3\ua60b\3\ua66a"+
+    "\3\ua6c9\3\ua728\3\ua787\3\ua7e6\3\ua845\3\ua8a4\3\ua903\3\ua962"+
+    "\3\ua9c1\3\uaa20\3\uaa7f\3\uaade\3\uab3d\3\uab9c\3\uabfb\3\uac5a"+
+    "\3\uacb9\3\uad18\3\uad77\3\uadd6\3\uae35\3\uae94\3\uaef3\3\uaf52"+
+    "\3\uafb1\3\ub010\3\ub06f\3\ub0ce\3\ub12d\3\ub18c\3\ub1eb\3\ub24a"+
+    "\3\ub2a9\3\ub308\3\ub367\3\ub3c6\3\ub425\3\ub484\3\ub4e3\3\ub542"+
+    "\3\ub5a1\3\ub600\3\ub65f\3\ub6be\3\ub71d\3\ub77c\3\ub7db\3\ub83a"+
+    "\3\ub899\3\ub8f8\3\ub957\3\ub9b6\3\uba15\3\uba74\3\ubad3\3\ubb32"+
+    "\3\ubb91\3\ubbf0\3\ubc4f\3\ubcae\3\ubd0d\3\ubd6c\3\ubdcb\3\ube2a"+
+    "\3\ube89\0\u8598\3\ubee8\3\ubf47\3\ubfa6\3\uc005\3\uc064\3\uc0c3"+
+    "\3\uc122\3\uc181\3\uc1e0\3\uc23f\3\uc29e\3\uc2fd\3\uc35c\3\uc3bb"+
+    "\3\uc41a\3\uc479\3\uc4d8\3\uc537\3\uc596\3\uc5f5\3\uc654\3\uc6b3"+
+    "\3\uc712\3\uc771\3\uc7d0\3\uc82f\3\uc88e\3\uc8ed\3\uc94c\3\uc9ab"+
+    "\3\uca0a\3\uca69\3\ucac8\3\ucb27\3\ucb86\3\ucbe5\3\ucc44\3\ucca3"+
+    "\3\ucd02\3\ucd61\3\ucdc0\3\uce1f\3\uce7e\3\ucedd\3\ucf3c\3\ucf9b"+
+    "\3\ucffa\3\ud059\3\ud0b8\3\ud117\3\ud176\3\ud1d5\3\ud234\3\ud293"+
+    "\3\ud2f2\3\ud351\3\ud3b0\3\ud40f\3\ud46e\3\ud4cd\3\ud52c\3\ud58b"+
+    "\3\ud5ea\3\ud649\3\ud6a8\3\ud707\3\ud766\3\ud7c5\3\ud824\3\ud883"+
+    "\3\ud8e2\3\ud941\3\ud9a0\3\ud9ff\3\uda5e\3\udabd\3\udb1c\3\udb7b"+
+    "\3\udbda\3\udc39\3\udc98\3\udcf7\3\udd56\3\uddb5\3\ude14\3\ude73"+
+    "\3\uded2\3\udf31\3\udf90\3\udfef\3\ue04e\3\ue0ad\3\ue10c\3\ue16b"+
+    "\3\ue1ca\3\ue229\3\ue288\3\ue2e7\3\ue346\3\ue3a5\3\ue404\3\ue463"+
+    "\3\ue4c2\3\ue521\3\ue580\3\ue5df\3\ue63e\3\ue69d\3\ue6fc\3\ue75b"+
+    "\3\ue7ba\3\ue819\3\ue878\3\ue8d7\3\ue936\3\ue995\3\ue9f4\3\uea53"+
+    "\3\ueab2\3\ueb11\3\ueb70\3\uebcf\3\uec2e\3\uec8d\3\uecec\3\ued4b"+
+    "\3\uedaa\3\uee09\3\uee68\3\ueec7\3\uef26\3\uef85\3\uefe4\3\uf043"+
+    "\3\uf0a2\3\uf101\3\uf160\3\uf1bf\3\uf21e\3\uf27d\3\uf2dc\3\uf33b"+
+    "\3\uf39a\3\uf3f9\3\uf458\3\uf4b7\3\uf516\3\uf575\3\uf5d4\3\uf633"+
+    "\3\uf692\3\uf6f1\3\uf750\3\uf7af\3\uf80e\3\uf86d\3\uf8cc\3\uf92b"+
+    "\3\uf98a\3\uf9e9\3\ufa48\3\ufaa7\3\ufb06\3\ufb65\3\ufbc4\3\ufc23"+
+    "\3\ufc82\3\ufce1\3\ufd40\3\ufd9f\3\uf2dc\3\ufdfe\3\ufe5d\3\ufebc"+
+    "\3\uff1b\3\uff7a\3\uffd9\4\70\4\227\4\366\4\u0155\4\u01b4"+
+    "\4\u0213\4\u0272\4\u02d1\4\u0330\4\u038f\4\u03ee\4\u044d\4\u04ac"+
+    "\4\u050b\4\u056a\4\u05c9\4\u0628\4\u0687\4\u06e6\4\u0745\4\u07a4"+
+    "\4\u0803\4\u0862\4\u08c1\4\u0920\4\u097f\4\u09de\4\u0a3d\4\u0a9c"+
+    "\4\u0afb\4\u0b5a\4\u0bb9\4\u0c18\4\u0c77\4\u0cd6\4\u0d35\4\u0d94"+
+    "\4\u0df3\4\u0e52\4\u0eb1\4\u0f10\4\u0f6f\4\u0fce\4\u102d\4\u108c"+
+    "\4\u10eb\4\u114a\4\u11a9\4\u1208\4\u1267\4\u12c6\4\u1325\4\u1384"+
+    "\4\u13e3\4\u1442\4\u14a1\4\u1500\4\u155f\4\u15be\4\u161d\4\u167c"+
+    "\4\u16db\4\u173a\4\u1799\4\u17f8\4\u1857\4\u18b6\4\u1915\4\u1974"+
+    "\4\u19d3\4\u1a32\4\u1a91\4\u1af0\4\u1b4f\4\u1bae\4\u1c0d\4\u1c6c"+
+    "\4\u1ccb\4\u1d2a\2\uabed\4\u1d89\4\u1de8\4\u1e47\4\u1ea6\4\u1f05"+
+    "\4\u1f64\4\u1fc3\4\u2022\4\u2081\4\u20e0\4\u213f\4\u219e\4\u21fd"+
+    "\4\u225c\4\u22bb\4\u231a\4\u2379\4\u23d8\4\u2437\4\u2496\4\u24f5"+
+    "\4\u2554\4\u25b3\4\u2612\4\u2671\4\u26d0\4\u272f\4\u278e\4\u27ed"+
+    "\4\u284c\4\u28ab\4\u290a\4\u2969\4\u29c8\4\u2a27\4\u2a86\4\u2ae5"+
+    "\4\u2b44\4\u2ba3\4\u2c02\4\u2c61\4\u2cc0\4\u2d1f\4\u2d7e\4\u2ddd"+
+    "\4\u2e3c\4\u2e9b\4\u2efa\4\u2f59\4\u2fb8\4\u3017\4\u3076\4\u30d5"+
+    "\4\u3134\4\u3193\4\u31f2\4\u3251\4\u32b0\4\u330f\4\u336e\4\u33cd"+
+    "\4\u342c\4\u348b\4\u34ea\4\u3549\4\u35a8\4\u3607\4\u3666\4\u36c5"+
+    "\4\u3724\4\u3783\4\u37e2\4\u3841\4\u38a0\4\u38ff\4\u395e\4\u39bd"+
+    "\4\u3a1c\4\u3a7b\4\u3ada\4\u3b39\4\u3b98\4\u3bf7\4\u3c56\4\u3cb5"+
+    "\4\u3d14\4\u3d73\4\u3dd2\4\u3e31\4\u3e90\4\u3eef\4\u3f4e\4\u3fad"+
+    "\4\u400c\4\u406b\4\u40ca\4\u4129\4\u4188\4\u41e7\4\u4246\4\u42a5"+
+    "\4\u4304\4\u4363\4\u43c2\4\u4421\4\u4480\4\u44df\4\u453e\4\u459d"+
+    "\4\u45fc\4\u465b\4\u46ba\4\u4719\4\u4778\4\u47d7\4\u4836\4\u4895"+
+    "\4\u48f4\4\u4953\4\u49b2\4\u4a11\4\u4a70\4\u4acf\4\u4b2e\4\u4b8d"+
+    "\4\u4bec\4\u4c4b\4\u4caa\4\u4d09\4\u4d68\4\u4dc7\4\u4e26\4\u4e85"+
+    "\4\u4ee4\4\u4f43\4\u4fa2\4\u5001\4\u5060\4\u50bf\4\u511e\4\u517d"+
+    "\4\u51dc\4\u523b\4\u529a\4\u52f9\4\u5358\4\u53b7\4\u5416\4\u5475"+
+    "\4\u54d4\4\u5533\4\u5592\4\u55f1\4\u5650\4\u56af\4\u570e\4\u576d"+
+    "\4\u57cc\4\u582b\4\u588a\4\u58e9\4\u5948\4\u59a7\4\u5a06\4\u5a65"+
+    "\4\u5ac4\4\u5b23\4\u5b82\4\u5be1\1\u7e99\4\u5c40\4\u5c9f\4\u5cfe"+
+    "\4\u5d5d\4\u5dbc\4\u5e1b\4\u5e7a\4\u5ed9\4\u5f38\4\u5f97\4\u5ff6"+
+    "\4\u6055\4\u60b4\4\u6113\4\u6172\4\u61d1\4\u6230\4\u628f\4\u62ee"+
+    "\4\u634d\4\u63ac\4\u640b\4\u646a\4\u64c9\4\u6528\4\u6587\4\u65e6"+
+    "\4\u6645\4\u66a4\4\u6703\4\u6762\4\u67c1\4\u6820\4\u687f\4\u68de"+
+    "\4\u693d\4\u699c\4\u69fb\4\u6a5a\4\u6ab9\4\u6b18\4\u6b77\4\u6bd6"+
+    "\4\u6c35\4\u6c94\4\u6cf3\4\u6d52\4\u6db1\4\u6e10\4\u6e6f\4\u6ece"+
+    "\4\u6f2d\4\u6f8c\4\u6feb\4\u704a\4\u70a9\4\u7108\4\u7167\4\u71c6"+
+    "\4\u7225\4\u7284\4\u72e3\4\u7342\4\u73a1\4\u7400\4\u745f\4\u74be"+
+    "\4\u751d\4\u757c\4\u75db\4\u763a\4\u7699\4\u76f8\4\u7757\4\u77b6"+
+    "\4\u7815\4\u7874\4\u78d3\4\u7932\4\u7991\4\u79f0\4\u7a4f\4\u7aae"+
+    "\4\u7b0d\4\u7b6c\4\u7bcb\4\u7c2a\4\u7c89\4\u7ce8\4\u7d47\4\u7da6"+
+    "\4\u7e05\4\u7e64\4\u7ec3\4\u7f22\4\u7f81\4\u7fe0\0\u3f75\4\u803f"+
+    "\4\u809e\4\u80fd\4\u815c\4\u81bb\4\u821a\4\u8279\4\u82d8\4\u8337"+
+    "\4\u8396\4\u83f5\4\u8454\4\u84b3\4\u8512\4\u8571\4\u85d0\4\u862f"+
+    "\4\u868e\4\u86ed\4\u874c\4\u87ab\4\u880a\4\u8869\4\u88c8\4\u8927"+
+    "\4\u8986\4\u89e5\4\u8a44\4\u8aa3\4\u8b02\4\u8b61\4\u8bc0\4\u8c1f"+
+    "\4\u8c7e\4\u8cdd\4\u8d3c\4\u8d9b\4\u8dfa\4\u8e59\4\u8eb8\4\u8f17"+
+    "\4\u8f76\4\u8fd5\4\u9034\4\u9093\4\u90f2\4\u9151\4\u91b0\4\u920f"+
+    "\4\u926e\4\u92cd\2\u3db6\4\u932c\4\u938b\4\u93ea\4\u9449\4\u94a8"+
+    "\4\u9507\4\u9566\4\u95c5\4\u9624\4\u9683\4\u96e2\4\u9741\4\u97a0"+
+    "\4\u97ff\4\u985e\4\u98bd\4\u991c\4\u997b\4\u99da\4\u9a39\4\u9a98"+
+    "\4\u9af7\4\u9b56\4\u9bb5\4\u9c14\4\u9c73\4\u9cd2\4\u9d31\4\u9d90"+
+    "\4\u9def\4\u9e4e\4\u9ead\4\u9f0c\4\u9f6b\4\u9fca\4\ua029\4\ua088"+
+    "\4\ua0e7\4\ua146\4\ua1a5\4\ua204\4\ua263\4\ua2c2\4\ua321\4\ua380"+
+    "\4\ua3df\4\ua43e\4\ua49d\4\ua4fc\4\ua55b\4\ua5ba\4\ua619\4\ua678"+
+    "\4\ua6d7\4\ua736\4\ua795\4\ua7f4\4\ua853\4\ua8b2\4\ua911\4\ua970"+
+    "\4\ua9cf\4\uaa2e\4\uaa8d\4\uaaec\4\uab4b\4\uabaa\4\uac09\4\uac68"+
+    "\4\uacc7\4\uad26\4\uad85\4\uade4\4\uae43\4\uaea2\4\uaf01\4\uaf60"+
+    "\4\uafbf\4\ub01e\4\ub07d\4\ub0dc\4\ub13b\4\ub19a\4\ub1f9\4\ub258"+
+    "\4\ub2b7\4\ub316\4\ub375\4\ub3d4\4\ub433\4\ub492\4\ub4f1\4\ub550"+
+    "\4\ub5af\4\ub60e\4\ub66d\4\ub6cc\4\ub72b\4\ub78a\4\ub7e9\4\ub848"+
+    "\4\ub8a7\4\ub906\3\u63fd\4\ub965\4\ub9c4\4\uba23\4\uba82\4\ubae1"+
+    "\4\ubb40\4\ubb9f\4\ubbfe\4\ubc5d\4\ubcbc\1\u0a72\4\ubd1b\4\ubd7a"+
+    "\4\ubdd9\4\ube38\4\ube97\4\ubef6\1\uddf8\4\ubf55\4\ubfb4\4\uc013"+
+    "\4\uc072\4\uc0d1\4\uc130\4\uc18f\4\uc1ee\4\uc24d\4\uc2ac\4\uc30b"+
+    "\4\uc36a\4\uc3c9\4\uc428\4\uc487\4\uc4e6\4\uc545\4\uc5a4\4\uc603"+
+    "\4\uc662\4\uc6c1\4\uc720\4\uc77f\4\uc7de\4\uc83d\4\uc89c\4\uc8fb"+
+    "\4\uc95a\4\uc9b9\4\uca18\4\uca77\4\ucad6\4\ucb35\4\ucb94\4\ucbf3"+
+    "\4\ucc52\4\uccb1\4\ucd10\4\ucd6f\4\ucdce\4\uce2d\4\uce8c\4\uceeb"+
+    "\4\ucf4a\4\ucfa9\4\ud008\4\ud067\4\ud0c6\4\ud125\4\ud184\4\ud1e3"+
+    "\4\ud242\4\ud2a1\4\ud300\4\ud35f\4\ud3be\4\ud41d\4\ud35f\4\ud47c"+
+    "\4\ud4db\4\ud53a\4\ud599\4\ud5f8\4\ud657\4\ud6b6\4\ud715\4\ud774"+
+    "\4\ud7d3\4\ud832\4\ud891\4\ud8f0\4\ud94f\4\ud9ae\4\uda0d\4\uda6c"+
+    "\4\udacb\4\udb2a\4\udb89\4\udbe8\4\udc47\4\udca6\4\udd05\4\udd64"+
+    "\4\uddc3\4\ude22\4\ude81\4\udee0\4\udf3f\4\udf9e\4\udffd\4\ue05c"+
+    "\4\ue0bb\4\ue11a\4\ue179\4\ue1d8\4\ue237\4\ue296\4\ue2f5\4\ue354"+
+    "\4\ue3b3\4\ue412\4\ue471\4\ue4d0\4\ue52f\4\ue58e\4\ue5ed\4\ue64c"+
+    "\4\ue6ab\4\ue70a\4\ue769\4\ue7c8\4\ue827\4\ue886\4\ue8e5\4\ue944"+
+    "\4\ue9a3\4\uea02\4\uea61\4\ueac0\4\ueb1f\4\ueb7e\4\uebdd\4\uec3c"+
+    "\4\uec9b\4\uecfa\4\ued59\4\uedb8\4\uee17\4\uee76\4\ueed5\4\uef34"+
+    "\4\uef93\4\ueff2\4\uf051\4\uf0b0\4\uf10f\4\uf16e\4\uf1cd\4\uf22c"+
+    "\4\uf28b\4\uf2ea\4\uf349\4\uf3a8\4\uf407\4\uf466\4\uf4c5\4\ub8a7"+
+    "\4\uf524\4\uf583\4\uf5e2\4\uf641\4\uf6a0\4\uf6ff\4\uf75e\4\uf7bd"+
+    "\4\uf81c\4\uf87b\4\uf8da\4\uf939\4\uf998\4\uf9f7\4\ufa56\4\ufab5"+
+    "\4\ufb14\4\ufb73\4\ufbd2\4\ufc31\4\ufc90\4\ufcef\4\ufd4e\4\ufdad"+
+    "\4\ufe0c\4\ufe6b\4\ufeca\4\uff29\4\uff88\4\uffe7\5\106\5\245"+
+    "\5\u0104\5\u0163\5\u01c2\5\u0221\5\u0280\5\u02df\5\u033e\5\u039d"+
+    "\5\u03fc\5\u045b\5\u04ba\5\u0519\5\u0578\5\u05d7\5\u0636\5\u0695"+
+    "\5\u06f4\5\u0753\5\u07b2\5\u0811\5\u0870\5\u08cf\5\u092e\5\u098d"+
+    "\5\u09ec\5\u0a4b\5\u0aaa\5\u0b09\5\u0b68\5\u0bc7\5\u0c26\5\u0c85"+
+    "\5\u0ce4\5\u0d43\5\u0da2\5\u0e01\5\u0e60\5\u0ebf\5\u0f1e\5\u0f7d"+
+    "\5\u0fdc\5\u103b\5\u109a\5\u10f9\5\u1158\5\u11b7\5\u1216\5\u1275"+
+    "\5\u12d4\5\u1333\5\u1392\5\u13f1\5\u1450\5\u14af\5\u150e\5\u156d"+
+    "\5\u15cc\5\u162b\5\u168a\5\u16e9\5\u1748\5\u17a7\5\u1806\5\u1865"+
+    "\5\u18c4\5\u1923\5\u1982\5\u19e1\5\u1a40\5\u1a9f\5\u1afe\5\u1b5d"+
+    "\5\u1bbc\5\u1c1b\5\u1c7a\5\u1cd9\5\u1d38\5\u1d97\5\u1df6\5\u1e55"+
+    "\5\u1eb4\5\u1f13\5\u1f72\5\u1fd1\5\u2030\5\u208f\5\u20ee\5\u214d"+
+    "\5\u21ac\5\u220b\5\u226a\1\u8d71\5\u22c9\5\u2328\5\u2387\5\u23e6"+
+    "\5\u2445\5\u24a4\5\u2503\5\u2562\5\u25c1\5\u2620\5\u267f\5\u26de"+
+    "\5\u273d\5\u279c\5\u27fb\5\u285a\5\u28b9\5\u2918\5\u2977\5\u29d6"+
+    "\5\u2a35\5\u2a94\5\u2af3\5\u2b52\5\u2bb1\5\u2c10\5\u2c6f\5\u2cce"+
+    "\5\u2d2d\5\u2d8c\5\u2deb\5\u2e4a\5\u2ea9\5\u2f08\5\u2f67\5\u2fc6"+
+    "\5\u3025\5\u3084\5\u30e3\5\u3142\5\u31a1\5\u3200\5\u325f\5\u32be"+
+    "\5\u331d\5\u337c\5\u33db\5\u343a\5\u3499\5\u34f8\5\u3557\5\u35b6"+
+    "\5\u3615\5\u3674\5\u36d3\5\u3732\5\u3791\5\u37f0\5\u384f\5\u38ae"+
+    "\5\u390d\5\u396c\5\u39cb\5\u3a2a\5\u3a89\5\u3ae8\5\u3b47\5\u3ba6"+
+    "\5\u3c05\5\u3c64\5\u3cc3\5\u3d22\1\uec12\5\u3d81\5\u3de0\5\u3e3f"+
+    "\5\u3e9e\5\u3efd\5\u3f5c\5\u3fbb\5\u401a\5\u4079\5\u40d8\5\u4137"+
+    "\5\u4196\5\u41f5\5\u4254\5\u42b3\5\u4312\5\u4371\5\u43d0\5\u442f"+
+    "\5\u448e\5\u44ed\5\u454c\5\u45ab\5\u460a\5\u4669\5\u46c8\5\u4727"+
+    "\5\u4786\5\u47e5\5\u4844\5\u48a3\5\u4902\5\u4961\5\u49c0\5\u4a1f"+
+    "\5\u4a7e\5\u4add\5\u4b3c\5\u4b9b\5\u4bfa\5\u4c59\5\u4cb8\5\u4d17"+
+    "\5\u4d76\5\u4dd5\5\u4e34\5\u4e93\5\u4ef2\5\u4f51\5\u4fb0\5\u500f"+
+    "\5\u506e\5\u50cd\5\u512c\5\u518b\5\u51ea\5\u5249\5\u52a8\5\u5307"+
+    "\5\u5366\5\u53c5\5\u5424\5\u5483\5\u54e2\5\u5541\5\u55a0\5\u55ff"+
+    "\5\u565e\5\u56bd\5\u571c\5\u577b\5\u57da\5\u5839\5\u5898\5\u58f7"+
+    "\5\u5956\5\u59b5\5\u5a14\5\u5a73\5\u5ad2\5\u5b31\5\u5b90\5\u5bef"+
+    "\5\u5c4e\5\u5cad\5\u5d0c\5\u5d6b\5\u5dca\5\u5e29\5\u5e88\5\u5ee7"+
+    "\5\u5f46\5\u5fa5\5\u6004\5\u6063\5\u60c2\5\u6121\5\u6180\5\u61df"+
+    "\5\u623e\5\u629d\5\u62fc\5\u635b\5\u63ba\5\u6419\5\u6478\5\u64d7"+
+    "\5\u6536\5\u6595\5\u65f4\5\u6653\5\u66b2\5\u6711\5\u6770\5\u67cf"+
+    "\5\u682e\5\u688d\5\u68ec\5\u694b\5\u69aa\5\u6a09\5\u6a68\5\u6ac7"+
+    "\5\u6b26\5\u6b85\5\u6be4\5\u6c43\5\u6ca2\5\u6d01\5\u6d60\5\u6dbf"+
+    "\5\u6e1e\5\u6e7d\5\u6edc\5\u6f3b\5\u6f9a\5\u6ff9\5\u7058\5\u70b7"+
+    "\5\u7116\5\u7175\5\u71d4\5\u7233\5\u7292\5\u72f1\5\u7350\5\u73af"+
+    "\5\u740e\5\u746d\5\u74cc\5\u752b\5\u758a\5\u75e9\5\u7648\5\u76a7"+
+    "\5\u7706\5\u7765\5\u77c4\5\u7823\5\u7882\5\u78e1\5\u7940\5\u799f"+
+    "\5\u79fe\5\u7a5d\5\u7abc\5\u7b1b\5\u7b7a\5\u7bd9\5\u7c38\5\u7c97"+
+    "\5\u7cf6\5\u7d55\5\u7db4\5\u7e13\5\u7e72\5\u7ed1\5\u7f30\5\u7f8f"+
+    "\5\u7fee\5\u804d\5\u80ac\5\u810b\5\u816a\5\u81c9\5\u8228\5\u8287"+
+    "\5\u82e6\5\u8345\5\u83a4\5\u8403\5\u8462\5\u84c1\5\u8520\5\u857f"+
+    "\5\u85de\5\u863d\5\u869c\5\u86fb\5\u875a\5\u87b9\5\u8818\5\u8877"+
+    "\5\u88d6\5\u8935\5\u8994\5\u89f3\5\u8a52\5\u8ab1\5\u8b10\5\u8b6f"+
+    "\5\u8bce\5\u8c2d\5\u8c8c\5\u8ceb\5\u8d4a\5\u8da9\5\u8e08\5\u8e67"+
+    "\5\u8ec6\5\u8f25\5\u8f84\5\u8fe3\5\u9042\5\u90a1\5\u9100\5\u915f"+
+    "\5\u91be\5\u921d\5\u927c\5\u92db\5\u933a\5\u9399\5\u93f8\5\u9457"+
+    "\5\u94b6\5\u9515\5\u9574\5\u95d3\5\u9632\5\u9691\5\u96f0\3\u82ca"+
+    "\5\u974f\5\u97ae\5\u980d\5\u986c\5\u98cb\5\u992a\5\u9989\5\u99e8"+
+    "\5\u9a47\5\u9aa6\5\u9b05\5\u9b64\5\u9bc3\5\u9c22\5\u9c81\5\u9ce0"+
+    "\5\u9d3f\5\u9d9e\5\u9dfd\5\u9e5c\5\u9ebb\5\u9f1a\5\u9f79\5\u9fd8"+
+    "\5\ua037\5\ua096\5\ua0f5\5\ua154\5\ua1b3\5\ua212\5\ua271\5\ua2d0"+
+    "\5\ua32f\5\ua38e\5\ua3ed\5\ua44c\5\ua4ab\5\ua50a\5\ua569\5\ua5c8"+
+    "\5\ua627\5\ua686\5\ua6e5\5\ua744\5\ua7a3\5\ua802\5\ua861\5\ua8c0"+
+    "\5\ua91f\5\ua97e\5\ua9dd\5\uaa3c\5\uaa9b\5\uaafa\5\uab59\5\uabb8"+
+    "\5\uac17\5\uac76\5\uacd5\5\uad34\5\uad93\5\uadf2\5\uae51\5\uaeb0"+
+    "\5\uaf0f\5\uaf6e\5\uafcd\5\ub02c\5\ub08b\5\ub0ea\5\ub149\5\ub1a8"+
+    "\5\ub207\5\ub266\5\ub2c5\5\ub324\5\ub383\5\ub3e2\5\ub441\5\ub4a0"+
+    "\5\ub4ff\5\ub55e\5\ub5bd\5\ub61c\5\ub67b\5\ub6da\5\ub739\5\ub798"+
+    "\5\ub7f7\5\ub856\5\ub8b5\5\ub914\5\ub973\5\ub9d2\5\uba31\5\uba90"+
+    "\5\ubaef\5\ubb4e\5\ubbad\5\ubc0c\5\ubc6b\5\ubcca\5\ubd29\5\ubd88"+
+    "\5\ubde7\5\ube46\5\ubea5\5\ubf04\5\ubf63\5\ubfc2\5\uc021\5\uc080"+
+    "\5\uc0df\5\uc13e\5\uc19d\5\uc1fc\5\uc25b\5\uc2ba\5\uc319\5\uc378"+
+    "\5\uc3d7\5\uc436\5\uc495\5\uc4f4\5\uc553\5\uc5b2\5\uc611\5\uc670"+
+    "\5\uc6cf\5\uc72e\5\uc78d\5\uc7ec\5\uc84b\5\uc8aa\5\uc909\5\uc968"+
+    "\5\uc9c7\5\uca26\5\uca85\5\ucae4\5\ucb43\5\ucba2\5\ucc01\5\ucc60"+
+    "\5\uccbf\5\ucd1e\5\ucd7d\5\ucddc\5\uce3b\5\uce9a\5\ucef9\5\ucf58"+
+    "\5\ucfb7\5\ud016\5\ud075\5\ud0d4\5\ud133\5\ud192\5\ud1f1\5\ud250"+
+    "\5\ud2af\5\ud30e\5\ud36d\5\ud3cc\5\ud42b\5\ud48a\5\ud4e9\5\ud548"+
+    "\5\ud5a7\5\ud606\5\ud665\5\ud6c4\5\ud723\5\ud782\5\ud7e1\5\ud840"+
+    "\5\ud89f\5\ud8fe\5\ud95d\5\ud9bc\1\u7e99\5\uda1b\5\uda7a\5\udad9"+
+    "\5\udb38\5\udb97\5\udbf6\5\udc55\5\udcb4\5\udd13\5\udd72\5\uddd1"+
+    "\5\ude30\5\ude8f\5\udeee\5\udf4d\5\udfac\5\ue00b\5\ue06a\5\ue0c9"+
+    "\5\ue128\5\ue187\5\ue1e6\5\ue245\5\ue2a4\5\ue303\5\ue362\5\ue3c1"+
+    "\5\ue420\5\ue47f\5\ue4de\5\ue53d\5\ue59c\5\ue5fb\5\ue65a\5\ue6b9"+
+    "\5\ue718\5\ue777\5\ue7d6\5\ue835\1\u2174\5\ue894\5\ue8f3\5\ue952"+
+    "\5\ue9b1\5\uea10\5\uea6f\5\ueace\5\ueb2d\5\ueb8c\5\uebeb\5\uec4a"+
+    "\5\ueca9\5\ued08\5\ued67\5\uedc6\5\uee25\5\uee84\5\ueee3\5\uef42"+
+    "\5\uefa1\5\uf000\5\uf05f\5\uf0be\5\uf11d\5\uf17c\5\uf1db\5\uf23a"+
+    "\5\uf299\5\uf2f8\5\uf357\5\uf3b6\5\uf415\5\uf474\5\uf4d3\5\uf532"+
+    "\5\uf591\5\uf5f0\5\uf64f\5\ue718\5\uf6ae\5\uf70d\5\uf76c\5\uf7cb"+
+    "\5\uf82a\5\uf889\5\uf8e8\5\uf947\5\uf9a6\5\ufa05\5\ufa64\5\ufac3"+
+    "\5\ufb22\5\ufb81\5\ufbe0\5\ufc3f\5\ufc9e\5\ufcfd\5\ufd5c\5\ufdbb"+
+    "\5\ufe1a\5\ufe79\5\ufed8\5\uff37\5\uff96\5\ufff5\6\124\6\263"+
+    "\6\u0112\6\u0171\6\u01d0\6\u022f\6\u028e\6\u02ed\6\u034c\6\u03ab"+
+    "\6\u040a\6\u0469\6\u04c8\6\u0527\6\u0586\6\u05e5\6\u0644\6\u06a3"+
+    "\6\u0702\6\u0761\6\u07c0\6\u081f\6\u087e\6\u08dd\6\u093c\6\u099b"+
+    "\6\u09fa\6\u0a59\6\u0ab8\6\u0b17\6\u0b76\6\u0bd5\6\u0c34\6\u0c93"+
+    "\6\u0cf2\6\u0d51\6\u0db0\6\u0e0f\6\u0e6e\6\u0ecd\6\u0f2c\6\u0f8b"+
+    "\6\u0fea\6\u1049\6\u10a8\6\u1107\6\u1166\6\u11c5\6\u1224\6\u1283"+
+    "\6\u12e2\4\u52f9\6\u1341\6\u13a0\6\u13ff\6\u145e\6\u14bd\6\u151c"+
+    "\6\u157b\6\u15da\6\u1639\6\u1698\6\u16f7\6\u1756\6\u17b5\6\u1814"+
+    "\6\u1873\6\u18d2\6\u1931\6\u1990\6\u19ef\6\u1a4e\6\u1aad\6\u1b0c"+
+    "\6\u1b6b\6\u1bca\6\u1c29\6\u1c88\6\u1ce7\6\u1d46\6\u1da5\6\u1e04"+
+    "\6\u1e63\6\u1ec2\6\u1f21\6\u1f80\6\u1fdf\6\u203e\6\u209d\6\u20fc"+
+    "\6\u215b\2\uf7a1\6\u21ba\6\u2219\6\u2278\6\u22d7\6\u2336\6\u2395"+
+    "\6\u23f4\6\u2453\6\u24b2\6\u2511\6\u2570\6\u25cf\6\u262e\6\u268d"+
+    "\6\u26ec\6\u274b\6\u27aa\6\u2809\6\u2868\6\u28c7\6\u2926\6\u2985"+
+    "\6\u29e4\6\u2a43\6\u2aa2\6\u2b01\6\u2b60\6\u2bbf\6\u2c1e\6\u2c7d"+
+    "\6\u2cdc\6\u2d3b\6\u2d9a\6\u2df9\6\u2e58\6\u2eb7\6\u2f16\6\u2f75"+
+    "\6\u2fd4\6\u3033\6\u3092\6\u30f1\6\u3150\6\u31af\6\u320e\6\u326d"+
+    "\6\u32cc\6\u332b\6\u338a\6\u33e9\6\u3448\6\u34a7\6\u3506\6\u3565"+
+    "\6\u35c4\6\u3623\6\u3682\6\u36e1\6\u3740\6\u379f\6\u37fe\6\u385d"+
+    "\6\u38bc\6\u391b\6\u397a\6\u39d9\6\u3a38\6\u3a97\6\u3af6\6\u3b55"+
+    "\6\u3bb4\6\u3c13\6\u3c72\6\u3cd1\6\u3d30\6\u3d8f\6\u3dee\6\u3e4d"+
+    "\6\u3eac\6\u3f0b\6\u3f6a\6\u3fc9\6\u4028\6\u4087\6\u40e6\6\u4145"+
+    "\6\u41a4\6\u4203\6\u4262\6\u42c1\6\u4320\6\u437f\6\u43de\6\u443d"+
+    "\6\u449c\6\u44fb\6\u455a\6\u45b9\6\u4618\6\u4677\3\ubdcb\6\u46d6"+
+    "\6\u4735\6\u4794\6\u47f3\6\u4852\6\u48b1\6\u4910\6\u496f\6\u49ce"+
+    "\6\u4a2d\6\u4a8c\6\u4aeb\6\u4b4a\6\u4ba9\6\u4c08\6\u4c67\6\u4cc6"+
+    "\6\u4d25\6\u4d84\6\u4de3\6\u4e42\6\u4ea1\6\u4f00\6\u4f5f\6\u4fbe"+
+    "\6\u501d\6\u507c\6\u50db\6\u513a\6\u5199\6\u51f8\6\u5257\6\u52b6"+
+    "\6\u5315\6\u5374\6\u53d3\6\u5432\6\u5491\6\u54f0\6\u554f\6\u55ae"+
+    "\6\u560d\6\u566c\6\u56cb\6\u572a\6\u5789\6\u57e8\6\u5847\6\u58a6"+
+    "\6\u5905\6\u5964\6\u59c3\6\u5a22\6\u5a81\6\u5ae0\6\u5b3f\6\u5b9e"+
+    "\6\u5bfd\6\u5c5c\6\u5cbb\6\u5d1a\6\u5d79\6\u5dd8\6\u5e37\6\u5e96"+
+    "\6\u5ef5\6\u5f54\6\u5fb3\6\u6012\6\u6071\6\u60d0\6\u612f\6\u618e"+
+    "\6\u61ed\6\u624c\6\u62ab\6\u630a\6\u6369\6\u63c8\6\u6427\6\u6486"+
+    "\6\u64e5\6\u6544\6\u65a3\6\u6602\6\u6661\6\u66c0\6\u671f\6\u677e"+
+    "\6\u67dd\6\u683c\6\u689b\6\u68fa\6\u6959\6\u69b8\6\u6a17\6\u6a76"+
+    "\6\u6ad5\6\u6b34\6\u6b93\6\u6bf2\6\u6c51\6\u6cb0\6\u6d0f\6\u6d6e"+
+    "\6\u6dcd\6\u6e2c\6\u6e8b\6\u6eea\6\u6f49\6\u6fa8\6\u7007\6\u7066"+
+    "\6\u70c5\6\u7124\6\u7183\6\u71e2\6\u7241\6\u72a0\6\u72ff\6\u735e"+
+    "\6\u73bd\6\u741c\6\u747b\6\u74da\6\u7539\6\u7598\6\u75f7\6\u7656"+
+    "\6\u76b5\6\u7714\6\u7773\6\u77d2\6\u7831\6\u7890\6\u78ef\6\u794e"+
+    "\6\u79ad\6\u7a0c\6\u7a6b\6\u7aca\6\u7b29\6\u7b88\6\u7be7\6\u7c46"+
+    "\6\u7ca5\6\u7d04\6\u7d63\6\u7dc2\6\u7e21\6\u7e80\6\u7edf\6\u7f3e"+
+    "\6\u7f9d\6\u7ffc\6\u805b\6\u80ba\6\u8119\6\u8178\6\u81d7\6\u8236"+
+    "\6\u8295\6\u82f4\6\u8353\6\u83b2\6\u8411\6\u8470\6\u84cf\6\u852e"+
+    "\6\u858d\6\u85ec\6\u864b\6\u86aa\6\u8709\6\u8768\6\u87c7\6\u8826"+
+    "\6\u8885\6\u88e4\0\u0b22\6\u8943\6\u89a2\6\u8a01\6\u8a60\6\u8abf"+
+    "\0\u0b22\6\u8b1e\0\u0b22\0\u0b22\6\u8b7d\6\u8bdc\6\u8c3b\6\u8c9a"+
+    "\6\u8cf9\6\u8d58\6\u8db7\6\u8e16\6\u8e75\6\u8ed4\6\u8f33\6\u8f92"+
+    "\6\u8ff1\6\u9050\6\u90af\6\u910e\6\u916d\6\u91cc\6\u922b\6\u928a"+
+    "\6\u92e9\6\u9348\6\u93a7\6\u9406\6\u9465\6\u94c4\6\u9523\6\u9582"+
+    "\6\u95e1\6\u9640\6\u969f\6\u96fe\6\u975d\6\u97bc\6\u981b\6\u987a"+
+    "\6\u98d9\6\u9938\6\u9997\6\u99f6\6\u9a55\6\u9ab4\6\u9b13\6\u9b72"+
+    "\3\ua4ee\6\u9bd1\6\u9c30\6\u9c8f\6\u9cee\6\u9d4d\6\u9dac\6\u9e0b"+
+    "\6\u9e6a\6\u9ec9\6\u9f28\6\u9f87\6\u9fe6\6\ua045\6\ua0a4\6\ua103"+
+    "\6\ua162\6\ua1c1\6\ua220\6\ua27f\6\ua2de\6\ua33d\6\ua39c\6\ua3fb"+
+    "\6\ua45a\6\ua4b9\6\ua518\2\u890b\6\ua577\3\uf2dc\6\ua5d6\6\ua635"+
+    "\6\ua694\6\ua6f3\6\ua752\6\ua7b1\6\ua810\6\ua86f\6\ua8ce\6\ua92d"+
+    "\6\ua98c\6\ua9eb\6\uaa4a\6\uaaa9\6\uab08\6\uab67\6\uabc6\6\uac25"+
+    "\6\uac84\6\uace3\6\uad42\6\uada1\6\uae00\6\uae5f\6\uaebe\6\uaf1d"+
+    "\6\uaf7c\6\uafdb\6\ub03a\6\ub099\6\ub0f8\6\ub157\6\ub1b6\6\ub215"+
+    "\6\ub274\6\ub2d3\6\ub332\6\ub391\6\ub3f0\6\ub44f\6\ub4ae\6\ub50d"+
+    "\6\ub56c\1\uc638\6\ub5cb\6\ub62a\6\ub689\6\ub6e8\6\ub747\6\ub7a6"+
+    "\6\ub805\6\ub864\6\ub8c3\6\ub922\6\ub981\6\ub9e0\6\uba3f\6\uba9e"+
+    "\4\u8c7e\6\ubafd\6\ubb5c\6\ubbbb\6\ubc1a\6\ubc79\6\ubcd8\6\ubd37"+
+    "\6\ubd96\6\ubdf5\6\ube54\6\ubeb3\6\ubf12\6\ubf71\6\ubfd0\6\uc02f"+
+    "\6\uc08e\6\uc0ed\6\uc14c\6\uc1ab\6\uc20a\6\uc269\6\uc2c8\6\uc327"+
+    "\6\uc386\6\uc3e5\6\uc444\6\uc4a3\6\uc502\6\uc561\6\uc5c0\6\uc61f"+
+    "\6\uc67e\6\uc6dd\6\uc73c\6\uc79b\6\uc7fa\6\uc859\6\uc8b8\6\uc917"+
+    "\6\uc976\6\uc9d5\6\uca34\6\uca93\6\ucaf2\6\ucb51\6\ucbb0\6\ucc0f"+
+    "\6\ucc6e\6\ucccd\6\ucd2c\6\ucd8b\6\ucdea\6\uce49\6\ucea8\6\ucf07"+
+    "\6\ucf66\6\ucfc5\6\ud024\6\ud083\6\ud0e2\6\ud141\6\ud1a0\6\ud1ff"+
+    "\6\ud25e\6\ud2bd\6\ud31c\6\ud37b\6\ud3da\6\ud439\6\ud498\6\ud4f7"+
+    "\6\ud556\6\ud5b5\6\ud614\6\ud673\6\ud6d2\6\ud731\6\ud790\6\ud7ef"+
+    "\6\ud84e\6\ud8ad\6\ud90c\6\ud96b\6\ud9ca\6\uda29\6\uda88\6\udae7"+
+    "\6\udb46\6\udba5\6\udc04\6\udc63\6\udcc2\6\udd21\6\udd80\6\udddf"+
+    "\6\ude3e\6\ude9d\6\udefc\6\udf5b\6\udfba\6\ue019\6\ue078\6\ue0d7"+
+    "\6\ue136\6\ue195\6\ue1f4\6\ue253\6\ue2b2\6\ue311\6\ue370\6\ue3cf"+
+    "\6\ue42e\6\ue48d\6\ue4ec\6\ue54b\6\ue5aa\6\ue609\6\ue668\6\ue6c7"+
+    "\6\ue726\6\ue785\6\ue7e4\6\ue843\6\ue8a2\6\ue901\6\ue960\6\ue9bf"+
+    "\6\uea1e\6\uea7d\6\ueadc\6\ueb3b\6\ueb9a\6\uebf9\6\uec58\6\uecb7"+
+    "\6\ued16\6\ued75\6\uedd4\6\uee33\6\uee92\6\ueef1\6\uef50\6\uefaf"+
+    "\6\uf00e\6\uf06d\6\uf0cc\6\uf12b\6\uf18a\6\uf1e9\6\uf248\5\u980d"+
+    "\6\uf2a7\6\uf306\6\uf365\6\uf3c4\6\uf423\6\uf482\6\uf4e1\6\uf540"+
+    "\6\uf59f\6\uf5fe\6\uf65d\6\uf6bc\6\uf71b\6\uf77a\6\uf7d9\6\uf838"+
+    "\6\uf897\6\uf8f6\6\uf955\6\uf9b4\6\ufa13\6\ufa72\1\u7d1d\6\ufad1"+
+    "\6\ufb30\6\ufb8f\6\ufbee\6\ufc4d\6\ufcac\6\ufd0b\6\ufd6a\6\ufdc9"+
+    "\6\ufe28\6\ufe87\6\ufee6\6\uff45\6\uffa4\7\3\7\142\7\301"+
+    "\7\u0120\7\u017f\7\u01de\7\u023d\7\u029c\7\u02fb\7\u035a\7\u03b9"+
+    "\7\u0418\7\u0477\7\u04d6\7\u0535\7\u0594\7\u05f3\7\u0652\7\u06b1"+
+    "\7\u0710\7\u076f\7\u07ce\7\u082d\7\u088c\7\u08eb\7\u094a\7\u09a9"+
+    "\7\u0a08\7\u0a67\7\u0ac6\7\u0b25\7\u0b84\7\u0be3\7\u0c42\7\u0ca1"+
+    "\7\u0d00\7\u0d5f\7\u0dbe\7\u0e1d\7\u0e7c\7\u0edb\7\u0f3a\7\u0f99"+
+    "\7\u0ff8\7\u1057\3\ube2a\7\u10b6\7\u1115\7\u1174\7\u11d3\7\u1232"+
+    "\7\u1291\7\u12f0\7\u134f\7\u13ae\7\u140d\7\u146c\7\u14cb\7\u152a"+
+    "\7\u1589\7\u15e8\7\u1647\7\u16a6\7\u1705\7\u1764\7\u17c3\7\u1822"+
+    "\7\u1881\7\u18e0\7\u193f\7\u199e\1\ud8c6\7\u19fd\7\u1a5c\7\u1abb"+
+    "\7\u1b1a\7\u1b79\7\u1bd8\7\u1c37\7\u1c96\7\u1cf5\7\u1d54\7\u1db3"+
+    "\7\u1e12\7\u1e71\7\u1ed0\7\u1f2f\7\u1f8e\7\u1fed\7\u204c\7\u20ab"+
+    "\7\u210a\7\u2169\7\u21c8\7\u2227\7\u2286\7\u22e5\7\u2344\7\u23a3"+
+    "\7\u2402\7\u2461\7\u24c0\7\u251f\7\u257e\7\u25dd\7\u263c\7\u269b"+
+    "\7\u26fa\7\u2759\7\u27b8\7\u2817\7\u2876\7\u28d5\7\u2934\7\u2993"+
+    "\7\u29f2\7\u2a51\7\u2ab0\7\u2b0f\7\u2b6e\7\u2bcd\7\u2c2c\7\u2c8b"+
+    "\7\u2cea\7\u2d49\7\u2da8\7\u2e07\7\u2e66\7\u2ec5\7\u2f24\7\u2f83"+
+    "\7\u2fe2\7\u3041\7\u30a0\7\u30ff\7\u315e\7\u31bd\7\u321c\7\u327b"+
+    "\7\u32da\7\u3339\7\u3398\7\u33f7\7\u3456\7\u34b5\7\u3514\7\u3573"+
+    "\7\u35d2\7\u3631\7\u3690\7\u36ef\7\u374e\7\u37ad\7\u380c\7\u386b"+
+    "\7\u38ca\7\u3929\7\u3988\7\u39e7\7\u3a46\7\u3aa5\7\u3b04\7\u3b63"+
+    "\7\u3bc2\7\u3c21\7\u3c80\7\u3cdf\7\u3d3e\7\u3d9d\7\u3dfc\7\u3e5b"+
+    "\7\u3eba\7\u3f19\7\u3f78\7\u3fd7\7\u4036\7\u4095\7\u40f4\7\u4153"+
+    "\7\u41b2\7\u4211\7\u4270\7\u42cf\7\u432e\7\u438d\7\u43ec\7\u444b"+
+    "\7\u44aa\7\u4509\7\u4568\7\u45c7\7\u4626\7\u4685\7\u46e4\7\u4743"+
+    "\7\u47a2\7\u4801\7\u4860\7\u48bf\7\u491e\7\u497d\7\u49dc\7\u4a3b"+
+    "\7\u4a9a\7\u4af9\7\u4b58\7\u4bb7\7\u4c16\7\u4c75\7\u4cd4\7\u4d33"+
+    "\7\u4d92\7\u4df1\7\u4e50\7\u4eaf\7\u4f0e\7\u4f6d\7\u4fcc\7\u502b"+
+    "\7\u508a\7\u50e9\7\u5148\7\u51a7\7\u5206\7\u5265\7\u52c4\7\u5323"+
+    "\7\u5382\7\u53e1\7\u5440\7\u549f\7\u54fe\7\u555d\7\u55bc\7\u561b"+
+    "\7\u567a\7\u56d9\7\u5738\5\uf0be\7\u5797\7\u57f6\7\u5855\7\u58b4"+
+    "\7\u5913\7\u5972\7\u59d1\7\u5a30\7\u5a8f\7\u5aee\7\u5b4d\7\u5bac"+
+    "\7\u5c0b\7\u5c6a\7\u5cc9\7\u5d28\7\u5d87\7\u5de6\7\u5e45\7\u5ea4"+
+    "\7\u5f03\7\u5f62\7\u5fc1\7\u6020\7\u607f\7\u60de\7\u613d\7\u619c"+
+    "\7\u61fb\7\u625a\7\u62b9\7\u6318\7\u6377\7\u63d6\7\u6435\7\u6494"+
+    "\7\u64f3\7\u6552\7\u65b1\7\u6610\7\u666f\7\u66ce\7\u672d\7\u678c"+
+    "\7\u67eb\7\u684a\7\u68a9\7\u6908\7\u6967\7\u69c6\7\u6a25\7\u6a84"+
+    "\7\u6ae3\7\u6b42\7\u6ba1\7\u6c00\7\u6c5f\7\u6cbe\7\u6d1d\7\u6d7c"+
+    "\7\u6ddb\7\u6e3a\7\u6e99\7\u6ef8\7\u6f57\7\u6fb6\7\u7015\7\u7074"+
+    "\7\u70d3\7\u7132\7\u7191\7\u71f0\7\u724f\7\u72ae\7\u730d\7\u736c"+
+    "\7\u73cb\7\u742a\7\u7489\7\u74e8\7\u7547\7\u75a6\7\u7605\7\u7664"+
+    "\7\u76c3\7\u7722\7\u7781\7\u77e0\7\u783f\7\u789e\7\u78fd\7\u795c"+
+    "\7\u79bb\7\u7a1a\7\u7a79\7\u7ad8\7\u7b37\7\u7b96\7\u7bf5\7\u7c54"+
+    "\7\u7cb3\7\u7d12\7\u7d71\7\u7dd0\7\u7e2f\7\u7e8e\7\u7eed\7\u7f4c"+
+    "\7\u7fab\7\u800a\7\u8069\7\u80c8\7\u8127\7\u8186\7\u81e5\7\u8244"+
+    "\7\u82a3\7\u8302\7\u8361\7\u83c0\7\u841f\7\u847e\7\u84dd\7\u853c"+
+    "\7\u859b\7\u85fa\7\u8659\7\u86b8\7\u8717\7\u8776\7\u87d5\7\u8834"+
+    "\7\u8893\7\u88f2\7\u8951\7\u89b0\7\u8a0f\7\u8a6e\7\u8acd\7\u8b2c"+
+    "\7\u8b8b\7\u8bea\7\u8c49\7\u8ca8\7\u8d07\7\u8d66\7\u8dc5\7\u8e24"+
+    "\7\u8e83\7\u8ee2\7\u8f41\7\u8fa0\7\u8fff\7\u905e\7\u90bd\7\u911c"+
+    "\7\u917b\7\u91da\7\u9239\7\u9298\7\u92f7\7\u9356\7\u93b5\7\u9414"+
+    "\7\u9473\7\u94d2\7\u9531\7\u9590\7\u95ef\7\u964e\7\u96ad\7\u970c"+
+    "\7\u976b\7\u97ca\7\u9829\7\u9888\7\u98e7\7\u9946\7\u99a5\7\u9a04"+
+    "\7\u9a63\7\u9ac2\7\u9b21\7\u9b80\7\u9bdf\7\u9c3e\7\u9c9d\7\u9cfc"+
+    "\7\u9d5b\7\u9dba\7\u9e19\7\u9e78\7\u9ed7\7\u9f36\7\u9f95\7\u9ff4"+
+    "\7\ua053\7\ua0b2\7\ua111\7\ua170\7\ua1cf\7\ua22e\7\ua28d\7\ua2ec"+
+    "\7\ua34b\7\ua3aa\7\ua409\7\ua468\7\ua4c7\7\ua526\7\ua585\7\ua5e4"+
+    "\7\ua643\7\ua6a2\7\ua701\7\ua760\7\ua7bf\7\ua81e\7\ua87d\7\ua8dc"+
+    "\7\ua93b\7\ua99a\7\ua9f9\7\uaa58\7\uaab7\7\uab16\7\uab75\7\uabd4"+
+    "\7\uac33\7\uac92\7\uacf1\7\uad50\7\uadaf\7\uae0e\7\uae6d\7\uaecc"+
+    "\7\uaf2b\7\uaf8a\7\uafe9\7\ub048\7\ub0a7\7\ub106\7\ub165\7\ub1c4"+
+    "\7\ub223\7\ub282\7\ub2e1\7\ub340\7\ub39f\7\ub3fe\7\ub45d\7\ub4bc"+
+    "\7\ub51b\7\ub57a\4\ub1f9\7\ub5d9\7\ub638\7\ub697\7\ub6f6\7\ub755"+
+    "\7\ub7b4\7\ub813\7\ub872\7\ub8d1\7\ub930\7\ub98f\7\ub9ee\7\uba4d"+
+    "\3\u4297\7\ubaac\7\ubb0b\7\ubb6a\7\ubbc9\7\ubc28\7\ubc87\7\ubce6"+
+    "\7\ubd45\7\ubda4\7\ube03\7\ube62\7\ubec1\7\ubf20\7\ubf7f\7\ubfde"+
+    "\7\uc03d\7\uc09c\7\uc0fb\7\uc15a\7\uc1b9\7\uc218\7\uc277\7\uc2d6"+
+    "\7\uc335\7\uc394\7\uc3f3\7\uc452\7\uc4b1\7\uc510\7\uc56f\7\uc5ce"+
+    "\7\uc62d\7\uc68c\7\uc6eb\7\uc74a\7\uc7a9\7\uc808\7\uc867\7\uc8c6"+
+    "\7\uc925\7\uc984\7\uc9e3\7\uca42\7\ucaa1\7\ucb00\7\ucb5f\7\ucbbe"+
+    "\7\ucc1d\7\ucc7c\7\uccdb\7\ucd3a\7\ucd99\7\ucdf8\7\uce57\7\uceb6"+
+    "\7\ucf15\7\ucf74\7\ucfd3\3\u21ef\7\ud032\7\ud091\7\ud0f0\7\ud14f"+
+    "\7\ud1ae\7\ud20d\7\ud26c\7\ud2cb\7\ud32a\7\ud389\7\ud3e8\7\ud447"+
+    "\7\ud4a6\7\ud505\7\ud564\7\ud5c3\7\ud622\7\ud681\7\ud6e0\7\ud73f"+
+    "\7\ud79e\7\ud7fd\7\ud85c\7\ud8bb\7\ud91a\7\ud979\7\ud9d8\7\uda37"+
+    "\7\uda96\7\udaf5\7\udb54\7\udbb3\7\udc12\7\udc71\7\udcd0\7\udd2f"+
+    "\7\udd8e\7\udded\7\ude4c\7\udeab\7\udf0a\7\udf69\7\udfc8\7\ue027"+
+    "\7\ue086\7\ue0e5\7\ue144\7\ue1a3\7\ue202\7\ue261\7\ue2c0\7\ue31f"+
+    "\7\ue37e\7\ue3dd\7\ue43c\7\ue49b\7\ue4fa\7\ue559\7\ue5b8\7\ue617"+
+    "\7\ue676\7\ue6d5\7\ue734\7\ue793\7\ue7f2\7\ue851\4\u3134\7\ue8b0"+
+    "\7\ue90f\7\ue96e\7\ue9cd\7\uea2c\7\uea8b\7\ueaea\7\ueb49\7\ueba8"+
+    "\7\uec07\7\uec66\7\uecc5\7\ued24\7\ued83\7\uede2\7\uee41\7\ueea0"+
+    "\7\ueeff\7\uef5e\7\uefbd\7\uf01c\7\uf07b\7\uf0da\7\uf139\7\uf198"+
+    "\7\uf1f7\3\ucedd\7\uf256\7\uf2b5\7\uf314\7\uf373\7\uf3d2\7\uf431"+
+    "\7\uf490\7\uf4ef\7\uf54e\7\uf5ad\7\uf60c\7\uf66b\7\uf6ca\7\uf729"+
+    "\7\uf788\7\uf7e7\7\uf846\7\uf8a5\7\uf904\7\uf963\7\uf9c2\7\ufa21"+
+    "\7\ufa80\7\ufadf\7\ufb3e\7\ufb9d\7\ufbfc\7\ufc5b\7\ufcba\7\ufd19"+
+    "\7\ufd78\7\ufdd7\7\ufe36\7\ufe95\7\ufef4\7\uff53\7\uffb2\10\21"+
+    "\10\160\10\317\10\u012e\10\u018d\10\u01ec\10\u024b\10\u02aa\10\u0309"+
+    "\10\u0368\10\u03c7\10\u0426\10\u0485\10\u04e4\10\u0543\10\u05a2\10\u0601"+
+    "\10\u0660\10\u06bf\10\u071e\10\u077d\10\u07dc\10\u083b\10\u089a\10\u08f9"+
+    "\10\u0958\10\u09b7\10\u0a16\10\u0a75\10\u0ad4\10\u0b33\10\u0b92\10\u0bf1"+
+    "\10\u0c50\10\u0caf\10\u0d0e\10\u0d6d\10\u0dcc\10\u0e2b\10\u0e8a\10\u0ee9"+
+    "\10\u0f48\10\u0fa7\10\u1006\10\u1065\10\u10c4\10\u1123\10\u1182\10\u11e1"+
+    "\10\u1240\10\u129f\10\u12fe\10\u135d\10\u13bc\10\u141b\10\u147a\10\u14d9"+
+    "\10\u1538\10\u1597\10\u15f6\10\u1655\10\u16b4\10\u1713\10\u1772\10\u17d1"+
+    "\10\u1830\10\u188f\10\u18ee\10\u194d\10\u19ac\10\u1a0b\10\u1a6a\10\u1ac9"+
+    "\10\u1b28\10\u1b87\10\u1be6\10\u1c45\10\u1ca4\2\u4b12\10\u1d03\10\u1d62"+
+    "\10\u1dc1\10\u1e20\10\u1e7f\10\u1ede\10\u1f3d\10\u1f9c\10\u1ffb\10\u205a"+
+    "\10\u20b9\10\u2118\10\u2177\10\u21d6\10\u2235\10\u2294\10\u22f3\10\u2352"+
+    "\10\u23b1\10\u2410\10\u246f\10\u24ce\10\u252d\10\u258c\10\u25eb\10\u264a"+
+    "\10\u26a9\10\u2708\10\u2767\10\u27c6\10\u2825\10\u2884\10\u28e3\10\u2942"+
+    "\10\u29a1\10\u2a00\10\u2a5f\10\u2abe\10\u2b1d\10\u2b7c\10\u2bdb\10\u2c3a"+
+    "\10\u2c99\10\u2cf8\10\u2d57\10\u2db6\10\u2e15\10\u2e74\10\u2ed3\10\u2f32"+
+    "\10\u2f91\10\u2ff0\10\u304f\10\u30ae\10\u310d\10\u316c\10\u31cb\10\u322a"+
+    "\10\u3289\0\u0b22\10\u32e8\10\u3347\10\u33a6\10\u3405\10\u3464\10\u34c3"+
+    "\10\u3522\10\u3581\10\u35e0\10\u363f\10\u369e\10\u36fd\10\u375c\10\u37bb"+
+    "\10\u381a\10\u3879\10\u38d8\10\u3937\10\u3996\10\u39f5\10\u3a54\10\u3ab3"+
+    "\10\u3b12\10\u3b71\10\u3bd0\10\u3c2f\10\u3c8e\10\u3ced\10\u3d4c\10\u3dab"+
+    "\10\u3e0a\10\u3e69\10\u3ec8\10\u3f27\10\u3f86\6\ua27f\10\u3fe5\10\u4044"+
+    "\10\u40a3\10\u4102\10\u4161\10\u41c0\10\u421f\10\u427e\10\u42dd\10\u433c"+
+    "\10\u439b\10\u43fa\10\u4459\10\u44b8\10\u4517\10\u4576\10\u45d5\10\u4634"+
+    "\10\u4693\10\u46f2\10\u4751\10\u47b0\10\u480f\10\u486e\10\u48cd\10\u492c"+
+    "\10\u498b\10\u49ea\10\u4a49\10\u4aa8\10\u4b07\10\u4b66\10\u4bc5\10\u4c24"+
+    "\10\u4c83\10\u4ce2\10\u4d41\10\u4da0\10\u4dff\10\u4e5e\10\u4ebd\10\u4f1c"+
+    "\10\u4f7b\10\u4fda\10\u5039\10\u5098\10\u50f7\10\u5156\10\u51b5\10\u5214"+
+    "\10\u5273\10\u52d2\10\u5331\10\u5390\10\u53ef\10\u544e\10\u54ad\10\u550c"+
+    "\10\u556b\10\u55ca\10\u5629\10\u5688\10\u56e7\10\u5746\10\u57a5\10\u5804"+
+    "\10\u5863\10\u58c2\10\u5921\10\u5980\10\u59df\10\u5a3e\10\u5a9d\10\u5afc"+
+    "\10\u5b5b\10\u5bba\10\u5c19\10\u5c78\10\u5cd7\10\u5d36\10\u5d95\10\u5df4"+
+    "\10\u5e53\10\u5eb2\10\u5f11\10\u5f70\10\u5fcf\10\u602e\10\u608d\10\u60ec"+
+    "\10\u614b\10\u61aa\10\u6209\10\u6268\10\u62c7\10\u6326\10\u6385\10\u63e4"+
+    "\10\u6443\10\u64a2\10\u6501\10\u6560\10\u65bf\10\u661e\10\u667d\10\u66dc"+
+    "\10\u673b\10\u679a\10\u67f9\10\u6858\10\u68b7\10\u6916\10\u6975\10\u69d4"+
+    "\10\u6a33\10\u6a92\10\u6af1\10\u6b50\6\u2f75\10\u6baf\10\u6c0e\10\u6c6d"+
+    "\10\u6ccc\10\u6d2b\10\u6d8a\10\u6de9\10\u6e48\10\u6ea7\10\u6f06\10\u6f65"+
+    "\10\u6fc4\10\u7023\10\u7082\10\u70e1\10\u7140\10\u719f\10\u71fe\10\u725d"+
+    "\10\u72bc\10\u731b\10\u737a\10\u73d9\10\u7438\10\u7497\10\u74f6\10\u7555"+
+    "\10\u75b4\10\u7613\10\u7672\10\u76d1\10\u7730\10\u778f\10\u77ee\10\u784d"+
+    "\10\u78ac\10\u790b\10\u796a\10\u79c9\10\u7a28\10\u7a87\10\u7ae6\10\u7b45"+
+    "\10\u7ba4\10\u7c03\10\u7c62\10\u7cc1\10\u7d20\10\u7d7f\10\u7dde\10\u7e3d"+
+    "\10\u7e9c\10\u7efb\10\u7f5a\10\u7fb9\10\u8018\10\u8077\10\u80d6\10\u8135"+
+    "\10\u8194\10\u81f3\10\u8252\10\u82b1\10\u8310\10\u836f\10\u83ce\10\u842d"+
+    "\10\u848c\10\u84eb\10\u854a\10\u85a9\10\u8608\10\u8667\10\u86c6\10\u8725"+
+    "\10\u8784\10\u87e3\10\u8842\10\u88a1\10\u8900\10\u895f\10\u89be\10\u8a1d"+
+    "\10\u8a7c\10\u8adb\10\u8b3a\10\u8b99\10\u8bf8\10\u8c57\10\u8cb6\10\u8d15"+
+    "\10\u8d74\10\u8dd3\10\u8e32\10\u8e91\10\u8ef0\10\u8f4f\10\u8fae\10\u900d"+
+    "\10\u906c\10\u90cb\10\u912a\10\u9189\10\u91e8\10\u9247\10\u92a6\10\u9305"+
+    "\10\u9364\10\u93c3\10\u9422\10\u9481\10\u94e0\10\u953f\10\u959e\10\u95fd"+
+    "\10\u965c\10\u96bb\10\u971a\10\u9779\10\u97d8\10\u9837\10\u9896\10\u98f5"+
+    "\10\u9954\10\u99b3\10\u9a12\10\u9a71\10\u9ad0\10\u9b2f\10\u9b8e\10\u9bed"+
+    "\10\u9c4c\10\u9cab\10\u9d0a\10\u9d69\10\u9dc8\10\u9e27\10\u9e86\10\u9ee5"+
+    "\10\u9f44\10\u9fa3\10\ua002\10\ua061\10\ua0c0\10\ua11f\10\ua17e\10\ua1dd"+
+    "\10\ua23c\10\ua29b\10\ua2fa\10\ua359\10\ua3b8\10\ua417\10\ua476\10\ua4d5"+
+    "\10\ua534\10\ua593\10\ua5f2\10\ua651\10\ua6b0\10\ua70f\10\ua76e\10\ua7cd"+
+    "\10\ua82c\10\ua88b\10\ua8ea\10\ua949\10\ua9a8\10\uaa07\10\uaa66\10\uaac5"+
+    "\10\uab24\10\uab83\10\uabe2\10\uac41\10\uaca0\10\uacff\10\uad5e\10\uadbd"+
+    "\10\uae1c\10\uae7b\10\uaeda\10\uaf39\10\uaf98\10\uaff7\10\ub056\10\ub0b5"+
+    "\10\ub114\10\ub173\10\ub1d2\10\ub231\10\ub290\10\ub2ef\10\ub34e\10\ub3ad"+
+    "\10\ub40c\10\ub46b\10\ub4ca\10\ub529\10\ub588\10\ub5e7\10\ub646\10\ub6a5"+
+    "\10\ub704\10\ub763\10\ub7c2\10\ub821\10\ub880\10\ub8df\10\ub93e\10\ub99d"+
+    "\10\ub9fc\10\uba5b\10\ubaba\10\ubb19\10\ubb78\10\ubbd7\10\ubc36\10\ubc95"+
+    "\10\ubcf4\10\ubd53\10\ubdb2\10\ube11\10\ube70\10\ubecf\10\ubf2e\10\ubf8d"+
+    "\10\ubfec\10\uc04b\10\uc0aa\10\uc109\10\uc168\10\uc1c7\10\uc226\10\uc285"+
+    "\10\uc2e4\10\uc343\10\uc3a2\10\uc401\10\uc460\10\uc4bf\10\uc51e\10\uc57d"+
+    "\10\uc5dc\10\uc63b\10\uc69a\10\uc6f9\10\uc758\10\uc7b7\10\uc816\10\uc875"+
+    "\10\uc8d4\10\uc933\6\ube54\10\uc992\10\uc9f1\10\uca50\10\ucaaf\10\ucb0e"+
+    "\10\ucb6d\10\ucbcc\10\ucc2b\10\ucc8a\10\ucce9\10\ucd48\10\ucda7\10\uce06"+
+    "\10\uce65\10\ucec4\10\ucf23\10\ucf82\10\ucfe1\10\ud040\10\ud09f\10\ud0fe"+
+    "\10\ud15d\10\ud1bc\10\ud21b\10\ud27a\10\ud2d9\10\ud338\10\ud397\10\ud3f6"+
+    "\10\ud455\10\ud4b4\10\ud513\10\ud572\10\ud5d1\10\ud630\10\ud68f\10\ud6ee"+
+    "\10\ud74d\10\ud7ac\10\ud80b\10\ud86a\10\ud8c9\10\ud928\10\ud987\2\34"+
+    "\10\ud9e6\10\uda45\10\udaa4\10\udb03\10\udb62\10\udbc1\10\udc20\10\udc7f"+
+    "\10\udcde\10\udd3d\10\udd9c\10\uddfb\10\ude5a\10\udeb9\10\udf18\10\udf77"+
+    "\10\udfd6\10\ue035\10\ue094\10\ue0f3\10\ue152\10\ue1b1\10\ue210\10\ue26f"+
+    "\10\ue2ce\10\ue32d\10\ue38c\10\ue3eb\10\ue44a\10\ue4a9\10\ue508\10\ue567"+
+    "\10\ue5c6\10\ue625\10\ue684\10\ue6e3\10\ue742\10\ue7a1\10\ue800\10\ue85f"+
+    "\10\ue8be\10\ue91d\10\ue97c\10\ue9db\10\uea3a\10\uea99\10\ueaf8\10\ueb57"+
+    "\10\uebb6\10\uec15\10\uec74\10\uecd3\10\ued32\10\ued91\10\uedf0\10\uee4f"+
+    "\10\ueeae\10\uef0d\10\uef6c\10\uefcb\10\uf02a\10\uf089\10\uf0e8\3\u26c2"+
+    "\10\uf147\10\uf1a6\10\uf205\10\uf264\10\uf2c3\10\uf322\10\uf381\10\uf3e0"+
+    "\10\uf43f\10\uf49e\10\uf4fd\10\uf55c\10\uf5bb\10\uf61a\10\uf679\10\uf6d8"+
+    "\10\uf737\10\uf796\10\uf7f5\10\uf854\10\uf8b3\10\uf912\10\uf971\10\uf9d0"+
+    "\10\ufa2f\10\ufa8e\10\ufaed\10\ufb4c\10\ufbab\10\ufc0a\10\ufc69\10\ufcc8"+
+    "\10\ufd27\10\ufd86\10\ufde5\10\ufe44\10\ufea3\10\uff02\10\uff61\10\uffc0"+
+    "\11\37\11\176\11\335\11\u013c\11\u019b\11\u01fa\11\u0259\11\u02b8"+
+    "\11\u0317\11\u0376\11\u03d5\11\u0434\11\u0493\11\u04f2\11\u0551\11\u05b0"+
+    "\11\u060f\11\u066e\11\u06cd\11\u072c\11\u078b\11\u07ea\11\u0849\11\u08a8"+
+    "\11\u0907\11\u0966\11\u09c5\11\u0a24\11\u0a83\11\u0ae2\11\u0b41\11\u0ba0"+
+    "\11\u0bff\11\u0c5e\11\u0cbd\11\u0d1c\11\u0d7b\11\u0dda\11\u0e39\11\u0e98"+
+    "\11\u0ef7\11\u0f56\11\u0fb5\11\u1014\11\u1073\11\u10d2\11\u1131\11\u1190"+
+    "\11\u11ef\11\u124e\11\u12ad\11\u130c\11\u136b\11\u13ca\11\u1429\11\u1488"+
+    "\11\u14e7\11\u1546\11\u15a5\11\u1604\11\u1663\11\u16c2\11\u1721\11\u1780"+
+    "\11\u17df\11\u183e\11\u189d\11\u18fc\11\u195b\11\u19ba\11\u1a19\11\u1a78"+
+    "\11\u1ad7\11\u1b36\11\u1b95\11\u1bf4\11\u1c53\11\u1cb2\11\u1d11\11\u1d70"+
+    "\11\u1dcf\11\u1e2e\11\u1e8d\11\u1eec\11\u1f4b\11\u1faa\11\u2009\11\u2068"+
+    "\11\u20c7\11\u2126\11\u2185\11\u21e4\11\u2243\11\u22a2\11\u2301\11\u2360"+
+    "\11\u23bf\11\u241e\11\u247d\11\u24dc\11\u253b\11\u259a\11\u25f9\11\u2658"+
+    "\10\u89be\11\u26b7\11\u2716\11\u2775\11\u27d4\11\u2833\11\u2892\11\u28f1"+
+    "\11\u2950\11\u29af\11\u2a0e\11\u2a6d\11\u2acc\11\u2b2b\11\u2b8a\11\u2be9"+
+    "\11\u2c48\11\u2ca7\11\u2d06\11\u2d65\11\u2dc4\11\u2e23\11\u2e82\11\u2ee1"+
+    "\11\u2f40\11\u2f9f\11\u2ffe\11\u305d\11\u30bc\11\u311b\11\u317a\11\u31d9"+
+    "\11\u3238\11\u3297\11\u32f6\11\u3355\11\u33b4\11\u3413\11\u3472\11\u34d1"+
+    "\11\u3530\11\u358f\11\u35ee\11\u364d\11\u36ac\11\u370b\11\u376a\11\u37c9"+
+    "\11\u3828\11\u3887\11\u38e6\11\u3945\11\u39a4\11\u3a03\11\u3a62\11\u3ac1"+
+    "\11\u3b20\11\u3b7f\11\u3bde\11\u3c3d\11\u3c9c\11\u3cfb\11\u3d5a\11\u3db9"+
+    "\11\u3e18\11\u3e77\11\u3ed6\11\u3f35\11\u3f94\11\u3ff3\11\u4052\11\u40b1"+
+    "\11\u4110\11\u416f\11\u41ce\11\u422d\11\u428c\11\u42eb\11\u434a\11\u43a9"+
+    "\11\u4408\11\u4467\11\u44c6\11\u4525\11\u4584\11\u45e3\11\u4642\11\u46a1"+
+    "\11\u4700\11\u475f\11\u47be\11\u481d\11\u487c\11\u48db\11\u493a\11\u4999"+
+    "\11\u49f8\11\u4a57\11\u4ab6\11\u4b15\11\u4b74\11\u4bd3\11\u4c32\11\u4c91"+
+    "\11\u4cf0\11\u4d4f\11\u4dae\11\u4e0d\11\u4e6c\11\u4ecb\11\u4f2a\11\u4f89"+
+    "\11\u4fe8\11\u5047\11\u50a6\11\u5105\11\u5164\11\u51c3\11\u5222\11\u5281"+
+    "\3\ucf3c\11\u52e0\11\u533f\11\u539e\11\u53fd\11\u545c\11\u54bb\11\u551a"+
+    "\11\u5579\11\u55d8\11\u5637\11\u5696\11\u56f5\11\u5754\11\u57b3\11\u5812"+
+    "\11\u5871\11\u58d0\11\u592f\11\u598e\11\u59ed\11\u5a4c\11\u5aab\11\u5b0a"+
+    "\11\u5b69\11\u5bc8\11\u5c27\11\u5c86\11\u5ce5\11\u5d44\11\u5da3\11\u5e02"+
+    "\11\u5e61\11\u5ec0\11\u5f1f\11\u5f7e\11\u5fdd\11\u603c\11\u609b\11\u60fa"+
+    "\11\u6159\11\u61b8\11\u6217\11\u6276\11\u62d5\11\u6334\11\u6393\11\u63f2"+
+    "\11\u6451\11\u64b0\11\u650f\11\u656e\11\u65cd\11\u662c\11\u668b\11\u66ea"+
+    "\11\u6749\11\u67a8\11\u6807\11\u6866\11\u68c5\11\u6924\11\u6983\11\u69e2"+
+    "\11\u6a41\11\u6aa0\11\u6aff\11\u6b5e\11\u6bbd\11\u6c1c\11\u6c7b\11\u6cda"+
+    "\11\u6d39\11\u6d98\11\u6df7\11\u6e56\11\u6eb5\11\u6f14\11\u6f73\11\u6fd2"+
+    "\11\u7031\11\u7090\11\u70ef\11\u714e\11\u71ad\11\u720c\11\u726b\11\u72ca"+
+    "\11\u7329\11\u7388\11\u73e7\11\u7446\11\u74a5\11\u7504\11\u7563\11\u75c2"+
+    "\11\u7621\11\u7680\11\u76df\11\u773e\0\uefba\11\u779d\11\u77fc\11\u785b"+
+    "\11\u78ba\11\u7919\11\u7978\11\u79d7\11\u7a36\11\u7a95\11\u7af4\11\u7b53"+
+    "\11\u7bb2\11\u7c11\11\u7c70\11\u7ccf\11\u7d2e\11\u7d8d\11\u7dec\11\u7e4b"+
+    "\11\u7eaa\11\u7f09\11\u7f68\11\u7fc7\11\u8026\11\u8085\11\u80e4\11\u8143"+
+    "\11\u81a2\11\u8201\11\u8260\11\u82bf\11\u831e\11\u837d\11\u83dc\11\u843b"+
+    "\11\u849a\11\u84f9\11\u8558\11\u85b7\11\u8616\11\u8675\11\u86d4\11\u8733"+
+    "\11\u8792\11\u87f1\11\u8850\11\u88af\11\u890e\11\u896d\11\u89cc\11\u8a2b"+
+    "\11\u8a8a\11\u8ae9\11\u8b48\11\u8ba7\11\u8c06\11\u8c65\11\u8cc4\11\u8d23"+
+    "\11\u8d82\11\u8de1\11\u8e40\11\u8e9f\11\u8efe\11\u8f5d\11\u8fbc\11\u901b"+
+    "\11\u907a\11\u90d9\11\u9138\11\u9197\11\u91f6\11\u9255\11\u92b4\11\u9313"+
+    "\11\u9372\11\u93d1\11\u9430\11\u948f\11\u94ee\11\u954d\11\u95ac\11\u960b"+
+    "\11\u966a\11\u96c9\11\u9728\11\u9787\11\u97e6\11\u9845\11\u98a4\11\u9903"+
+    "\11\u9962\11\u99c1\11\u9a20\11\u9a7f\11\u9ade\11\u9b3d\11\u9b9c\11\u9bfb"+
+    "\11\u9c5a\11\u9cb9\11\u9d18\11\u9d77\11\u9dd6\11\u9e35\11\u9e94\11\u9ef3"+
+    "\4\uf524\11\u9f52\11\u9fb1\11\ua010\11\ua06f\11\ua0ce\11\ua12d\11\ua18c"+
+    "\11\ua1eb\11\ua24a\11\ua2a9\11\ua308\11\ua367\11\ua3c6\11\ua425\11\ua484"+
+    "\11\ua4e3\11\ua542\11\ua5a1\11\ua600\11\ua65f\11\ua6be\11\ua71d\11\ua77c"+
+    "\11\ua7db\11\ua83a\11\ua899\11\ua8f8\11\ua957\11\ua9b6\11\uaa15\11\uaa74"+
+    "\11\uaad3\11\uab32\11\uab91\11\uabf0\11\uac4f\11\uacae\11\uad0d\11\uad6c"+
+    "\11\uadcb\11\uae2a\11\uae89\11\uaee8\11\uaf47\11\uafa6\11\ub005\11\ub064"+
+    "\11\ub0c3\11\ub122\11\ub181\11\ub1e0\11\ub23f\11\ub29e\11\ub2fd\11\ub35c"+
+    "\11\ub3bb\11\ub41a\11\ub479\11\ub4d8\11\ub537\11\ub596\5\ubf63\11\ub5f5"+
+    "\11\ub654\11\ub6b3\11\ub712\11\ub771\11\ub7d0\11\ub82f\11\ub88e\11\ub8ed"+
+    "\11\ub94c\11\ub9ab\11\uba0a\11\uba69\11\ubac8\11\ubb27\11\ubb86\11\ubbe5"+
+    "\11\ubc44\11\ubca3\11\ubd02\11\ubd61\11\ubdc0\11\ube1f\11\ube7e\11\ubedd"+
+    "\11\ubf3c\11\ubf9b\11\ubffa\11\uc059\11\uc0b8\11\uc117\11\uc176\11\uc1d5"+
+    "\11\uc234\11\uc293\11\uc2f2\11\uc351\11\uc3b0\11\uc40f\11\uc46e\11\uc4cd"+
+    "\11\uc52c\11\uc58b\11\uc5ea\11\uc649\11\uc6a8\11\uc707\11\uc766\11\uc7c5"+
+    "\11\uc824\11\uc883\11\uc8e2\11\uc941\11\uc9a0\11\uc9ff\11\uca5e\11\ucabd"+
+    "\11\ucb1c\11\ucb7b\11\ucbda\11\ucc39\11\ucc98\11\uccf7\11\ucd56\11\ucdb5"+
+    "\11\uce14\11\uce73\11\uced2\11\ucf31\11\ucf90\11\ucfef\11\ud04e\11\ud0ad"+
+    "\11\ud10c\11\ud16b\11\ud1ca\11\ud229\11\ud288\11\ud2e7\11\ud346\11\ud3a5"+
+    "\11\ud404\11\ud463\11\ud4c2\7\ue559\11\ud521\11\ud580\11\ud5df\11\ud63e"+
+    "\11\ud69d\11\ud6fc\11\ud75b\11\ud7ba\11\ud819\11\ud878\11\ud8d7\11\ud936"+
+    "\11\ud995\11\ud9f4\11\uda53\11\udab2\11\udb11\11\udb70\11\udbcf\11\udc2e"+
+    "\11\udc8d\11\udcec\11\udd4b\11\uddaa\11\ude09\11\ude68\11\udec7\11\udf26"+
+    "\11\udf85\11\udfe4\11\ue043\11\ue0a2\11\ue101\11\ue160\11\ue1bf\11\ue21e"+
+    "\11\ue27d\11\ue2dc\11\ue33b\11\ue39a\11\ue3f9\11\ue458\11\ue4b7\11\ue516"+
+    "\11\ue575\11\ue5d4\11\ue633\11\ue692\11\ue6f1\11\ue750\11\ue7af\11\ue80e"+
+    "\11\ue86d\11\ue8cc\11\ue92b\11\ue98a\11\ue9e9\11\uea48\11\ueaa7\11\ueb06"+
+    "\11\ueb65\11\uebc4\11\uec23\11\uec82\11\uece1\11\ued40\11\ued9f\11\uedfe"+
+    "\11\uee5d\2\uf44a\11\ueebc\11\uef1b\11\uef7a\11\uefd9\11\uf038\11\uf097"+
+    "\11\uf0f6\11\uf155\11\uf1b4\11\uf213\11\uf272\11\uf2d1\11\uf330\11\uf38f"+
+    "\11\ua899\11\uf3ee\11\uf44d\11\uf4ac\11\uf50b\11\uf56a\11\uf5c9\11\uf628"+
+    "\11\uf687\11\uf6e6\11\uf745\11\uf7a4\11\uf803\11\uf862\11\uf8c1\11\uf920"+
+    "\11\uf97f\11\uf9de\11\ufa3d\11\ufa9c\11\ufafb\11\ufb5a\11\ufbb9\11\ufc18"+
+    "\11\ufc77\11\ufcd6\11\ufd35\11\ufd94\11\ufdf3\11\ufe52\11\ufeb1\11\uff10"+
+    "\11\uff6f\11\uffce\12\55\12\214\12\353\12\u014a\12\u01a9\12\u0208"+
+    "\12\u0267\12\u02c6\12\u0325\12\u0384\12\u03e3\10\u3405\12\u0442\12\u04a1"+
+    "\12\u0500\12\u055f\12\u05be\12\u061d\12\u067c\12\u06db\12\u073a\12\u0799"+
+    "\12\u07f8\12\u0857\12\u08b6\12\u0915\12\u0974\12\u09d3\12\u0a32\12\u0a91"+
+    "\12\u0af0\12\u0b4f\12\u0bae\12\u0c0d\12\u0c6c\12\u0ccb\12\u0d2a\12\u0d89"+
+    "\12\u0de8\12\u0e47\12\u0ea6\12\u0f05\12\u0f64\12\u0fc3\12\u1022\12\u1081"+
+    "\12\u10e0\12\u113f\12\u119e\12\u11fd\12\u125c\12\u12bb\12\u131a\12\u1379"+
+    "\12\u13d8\12\u1437\12\u1496\12\u14f5\12\u1554\12\u15b3\12\u1612\12\u1671"+
+    "\12\u16d0\12\u172f\12\u178e\12\u17ed\12\u184c\12\u18ab\12\u190a\12\u1969"+
+    "\12\u19c8\12\u1a27\12\u1a86\12\u1ae5\12\u1b44\12\u1ba3\12\u1c02\12\u1c61"+
+    "\12\u1cc0\12\u1d1f\12\u1d7e\12\u1ddd\12\u1e3c\12\u1e9b\6\u98d9\12\u1efa"+
+    "\12\u1f59\12\u1fb8\12\u2017\12\u2076\12\u20d5\12\u2134\12\u2193\12\u21f2"+
+    "\12\u2251\12\u22b0\12\u230f\12\u236e\12\u23cd\12\u242c\12\u248b\12\u24ea"+
+    "\12\u2549\12\u25a8\12\u2607\12\u2666\12\u26c5\12\u2724\12\u2783\12\u27e2"+
+    "\12\u2841\11\u82bf\12\u28a0\12\u28ff\12\u295e\12\u29bd\12\u2a1c\12\u2a7b"+
+    "\12\u2ada\12\u2b39\12\u2b98\12\u2bf7\12\u2c56\12\u2cb5\12\u2d14\12\u2d73"+
+    "\12\u2dd2\12\u2e31\12\u2e90\12\u2eef\12\u2f4e\12\u2fad\12\u300c\12\u306b"+
+    "\12\u30ca\12\u3129\12\u3188\12\u31e7\12\u3246\12\u32a5\12\u3304\12\u3363"+
+    "\12\u33c2\12\u3421\12\u3480\12\u34df\12\u353e\12\u359d\12\u35fc\12\u365b"+
+    "\12\u36ba\12\u3719\12\u3778\12\u37d7\12\u3836\12\u3895\12\u38f4\12\u3953"+
+    "\12\u39b2\12\u3a11\12\u3a70\12\u3acf\12\u3b2e\12\u3b8d\12\u3bec\10\u9837"+
+    "\12\u3c4b\12\u3caa\12\u3d09\12\u3d68\12\u3dc7\12\u3e26\12\u3e85\12\u3ee4"+
+    "\12\u3f43\12\u3fa2\12\u4001\12\u4060\12\u40bf\12\u411e\12\u417d\12\u41dc"+
+    "\12\u423b\12\u429a\12\u42f9\12\u4358\12\u43b7\12\u4416\12\u4475\12\u44d4"+
+    "\12\u4533\12\u4592\12\u45f1\12\u4650\12\u46af\12\u470e\12\u476d\12\u47cc"+
+    "\12\u482b\12\u488a\12\u48e9\12\u4948\12\u49a7\12\u4a06\12\u4a65\12\u4ac4"+
+    "\12\u4b23\12\u4b82\12\u4be1\12\u4c40\12\u4c9f\12\u4cfe\12\u4d5d\12\u4dbc"+
+    "\12\u4e1b\12\u4e7a\12\u4ed9\12\u4f38\12\u4f97\12\u4ff6\12\u5055\12\u50b4"+
+    "\12\u5113\12\u5172\12\u51d1\12\u5230\12\u528f\12\u52ee\12\u534d\12\u53ac"+
+    "\12\u540b\12\u546a\12\u54c9\12\u5528\12\u5587\12\u55e6\12\u5645\12\u56a4"+
+    "\12\u5703\12\u5762\12\u57c1\12\u5820\12\u587f\12\u58de\12\u593d\12\u599c"+
+    "\12\u59fb\12\u5a5a\12\u5ab9\12\u5b18\12\u5b77\12\u5bd6\12\u5c35\12\u5c94"+
+    "\12\u5cf3\12\u5d52\12\u5db1\12\u5e10\12\u5e6f\12\u5ece\12\u5f2d\12\u5f8c"+
+    "\12\u5feb\12\u604a\12\u60a9\12\u6108\12\u6167\12\u61c6\12\u6225\12\u6284"+
+    "\12\u62e3\12\u6342\12\u63a1\12\u6400\12\u645f\12\u64be\12\u651d\12\u657c"+
+    "\12\u65db\12\u663a\12\u6699\12\u66f8\12\u6757\12\u67b6\12\u6815\12\u6874"+
+    "\12\u68d3\12\u6932\12\u6991\12\u69f0\12\u6a4f\12\u6aae\12\u6b0d\3\u8621"+
+    "\12\u6b6c\12\u6bcb\12\u6c2a\12\u6c89\5\uf05f\12\u6ce8\12\u6d47\12\u6da6"+
+    "\12\u6e05\12\u6e64\12\u6ec3\12\u6f22\12\u6f81\12\u6fe0\12\u703f\12\u709e"+
+    "\12\u70fd\12\u715c\12\u71bb\12\u721a\12\u7279\12\u72d8\12\u7337\12\u7396"+
+    "\12\u73f5\12\u7454\12\u74b3\12\u7512\12\u7571\12\u75d0\12\u762f\12\u768e"+
+    "\12\u76ed\12\u774c\12\u77ab\12\u780a\12\u7869\12\u78c8\12\u7927\12\u7986"+
+    "\12\u79e5\12\u7a44\12\u7aa3\12\u7b02\12\u7b61\12\u7bc0\12\u7c1f\12\u7c7e"+
+    "\12\u7cdd\12\u7d3c\12\u7d9b\12\u7dfa\12\u7e59\12\u7eb8\12\u7f17\12\u7f76"+
+    "\12\u7fd5\12\u8034\12\u8093\12\u80f2\12\u8151\12\u81b0\12\u820f\12\u826e"+
+    "\12\u82cd\12\u832c\12\u838b\12\u83ea\12\u8449\12\u84a8\12\u8507\12\u8566"+
+    "\12\u85c5\12\u8624\12\u8683\12\u86e2\12\u8741\12\u87a0\12\u87ff\12\u885e"+
+    "\11\uabf0\12\u88bd\12\u891c\12\u897b\12\u89da\12\u8a39\12\u8a98\12\u8af7"+
+    "\12\u8b56\12\u8bb5\12\u8c14\12\u8c73\12\u8cd2\12\u8d31\12\u8d90\12\u8def"+
+    "\12\u8e4e\12\u8ead\12\u8f0c\12\u8f6b\12\u8fca\12\u9029\12\u9088\12\u90e7"+
+    "\12\u9146\12\u91a5\12\u9204\12\u9263\12\u92c2\12\u9321\12\u9380\12\u93df"+
+    "\12\u943e\12\u949d\12\u94fc\12\u955b\12\u95ba\12\u9619\12\u9678\12\u96d7"+
+    "\12\u9736\12\u9795\12\u97f4\12\u9853\12\u98b2\12\u9911\12\u9970\12\u99cf"+
+    "\12\u9a2e\12\u9a8d\12\u9aec\12\u9b4b\12\u9baa\12\u9c09\12\u9c68\12\u9cc7"+
+    "\12\u9d26\12\u9d85\12\u9de4\12\u9e43\12\u9ea2\12\u9f01\12\u9f60\12\u9fbf"+
+    "\12\ua01e\12\ua07d\12\ua0dc\12\ua13b\12\ua19a\12\ua1f9\12\ua258\12\ua2b7"+
+    "\12\ua316\12\ua375\12\ua3d4\12\ua433\12\ua492\12\ua4f1\12\ua550\12\ua5af"+
+    "\12\ua60e\12\ua66d\12\ua6cc\12\ua72b\12\ua78a\12\ua7e9\12\ua848\12\ua8a7"+
+    "\12\ua906\12\ua965\12\ua9c4\12\uaa23\12\uaa82\12\uaae1\12\uab40\12\uab9f"+
+    "\12\uabfe\12\uac5d\12\uacbc\12\uad1b\12\uad7a\12\uadd9\12\uae38\12\uae97"+
+    "\12\uaef6\12\uaf55\12\uafb4\12\ub013\12\ub072\12\ub0d1\12\ub130\12\ub18f"+
+    "\12\ub1ee\12\ub24d\12\ub2ac\12\ub30b\12\ub36a\12\ub3c9\10\u71fe\12\ub428"+
+    "\12\ub487\12\ub4e6\12\ub545\12\ub5a4\12\ub603\12\ub662\12\ub6c1\12\ub720"+
+    "\12\ub77f\6\u203e\12\ub7de\12\ub83d\12\ub89c\12\ub8fb\12\ub95a\12\ub9b9"+
+    "\12\uba18\12\uba77\12\ubad6\12\ubb35\12\ubb94\12\ubbf3\12\ubc52\12\ubcb1"+
+    "\12\ubd10\12\ubd6f\12\ubdce\12\ube2d\12\ube8c\12\ubeeb\12\ubf4a\12\ubfa9"+
+    "\12\uc008\12\u067c\12\uc067\12\uc0c6\12\uc125\12\uc184\12\uc1e3\12\uc242"+
+    "\12\uc2a1\12\uc300\12\uc35f\12\uc3be\12\uc41d\12\uc47c\12\uc4db\12\uc53a"+
+    "\12\uc599\12\uc5f8\12\uc657\12\uc6b6\12\uc715\12\uc774\12\uc7d3\12\uc832"+
+    "\12\uc891\12\uc8f0\12\uc94f\12\uc9ae\12\uca0d\12\uca6c\12\ucacb\12\ucb2a"+
+    "\12\ucb89\12\ucbe8\12\ucc47\12\ucca6\12\ucd05\12\ucd64\12\ucdc3\12\uce22"+
+    "\12\uce81\12\ucee0\12\ucf3f\12\ucf9e\12\ucffd\12\ud05c\12\ud0bb\12\ud11a"+
+    "\12\ud179\12\ud1d8\12\ud237\12\ud296\12\ud2f5\12\ud354\12\ud3b3\12\ud412"+
+    "\12\ud471\12\ud4d0\12\ud52f\12\ud58e\12\ud5ed\12\ud64c\12\ud6ab\12\ud70a"+
+    "\12\ud769\12\ud7c8\12\ud827\12\ud886\12\ud8e5\12\ud944\12\ud9a3\12\uda02"+
+    "\12\uda61\12\udac0\12\udb1f\12\udb7e\12\udbdd\12\udc3c\12\udc9b\12\udcfa"+
+    "\12\udd59\12\uddb8\12\ude17\12\ude76\12\uded5\12\udf34\12\udf93\12\udff2"+
+    "\12\ue051\12\ue0b0\12\ue10f\12\ue16e\12\ue1cd\12\ue22c\12\ue28b\12\ue2ea"+
+    "\12\ue349\12\ue3a8\12\ue407\12\ue466\12\ue4c5\12\ue524\12\ue583\12\ue5e2"+
+    "\12\ue641\12\ue6a0\12\ue6ff\12\ue75e\12\ue7bd\12\ue81c\12\ue87b\12\ue8da"+
+    "\12\ue939\12\ue998\12\ue9f7\12\uea56\12\ueab5\12\ueb14\12\ueb73\12\uebd2"+
+    "\12\uec31\12\uec90\12\uecef\12\ued4e\12\uedad\12\uee0c\12\uee6b\12\ueeca"+
+    "\12\uef29\12\uef88\12\uefe7\12\uf046\4\ud3be\12\uf0a5\12\uf104\12\uf163"+
+    "\12\uf1c2\12\uf221\12\uf280\12\uf2df\12\uf33e\12\uf39d\12\uf3fc\12\uf45b"+
+    "\12\uf4ba\12\uf519\12\uf578\12\uf5d7\12\uf636\12\uf695\12\uf6f4\12\uf753"+
+    "\12\uf7b2\12\uf811\12\uf870\12\uf8cf\12\uf92e\12\uf98d\12\uf9ec\12\ufa4b"+
+    "\12\ufaaa\12\ufb09\12\ufb68\12\ufbc7\12\ufc26\12\ufc85\12\ufce4\12\ufd43"+
+    "\12\ufda2\12\ufe01\12\ufe60\12\ufebf\12\uff1e\12\uff7d\12\uffdc\13\73"+
+    "\13\232\13\371\13\u0158\13\u01b7\13\u0216\13\u0275\13\u02d4\13\u0333"+
+    "\13\u0392\13\u03f1\13\u0450\13\u04af\13\u050e\13\u056d\13\u05cc\13\u062b"+
+    "\13\u068a\13\u06e9\13\u0748\13\u07a7\13\u0806\13\u0865\13\u08c4\13\u0923"+
+    "\13\u0982\13\u09e1\13\u0a40\13\u0a9f\13\u0afe\13\u0b5d\13\u0bbc\13\u0c1b"+
+    "\13\u0c7a\13\u0cd9\13\u0d38\13\u0d97\13\u0df6\13\u0e55\13\u0eb4\13\u0f13"+
+    "\13\u0f72\13\u0fd1\13\u1030\13\u108f\13\u10ee\13\u114d\13\u11ac\13\u120b"+
+    "\13\u126a\13\u12c9\13\u1328\13\u1387\13\u13e6\13\u1445\13\u14a4\13\u1503"+
+    "\13\u1562\13\u15c1\13\u1620\13\u167f\13\u16de\13\u173d\13\u179c\13\u17fb"+
+    "\13\u185a\13\u18b9\13\u1918\13\u1977\13\u19d6\13\u1a35\13\u1a94\13\u1af3"+
+    "\13\u1b52\13\u1bb1\13\u1c10\13\u1c6f\13\u1cce\13\u1d2d\13\u1d8c\13\u1deb"+
+    "\13\u1e4a\13\u1ea9\13\u1f08\13\u1f67\13\u1fc6\13\u2025\13\u2084\13\u20e3"+
+    "\13\u2142\13\u21a1\13\u2200\13\u225f\13\u22be\13\u231d\13\u237c\13\u23db"+
+    "\13\u243a\13\u2499\13\u24f8\13\u2557\13\u25b6\13\u2615\13\u2674\13\u26d3"+
+    "\13\u2732\13\u2791\13\u27f0\13\u284f\13\u28ae\13\u290d\13\u296c\13\u29cb"+
+    "\13\u2a2a\13\u2a89\13\u2ae8\13\u2b47\13\u2ba6\13\u2c05\13\u2c64\13\u2cc3"+
+    "\13\u2d22\13\u2d81\13\u2de0\13\u2e3f\13\u2e9e\13\u2efd\13\u2f5c\13\u2fbb"+
+    "\13\u301a\13\u3079\13\u30d8\13\u3137\13\u3196\13\u31f5\13\u3254\13\u32b3"+
+    "\13\u3312\13\u3371\13\u33d0\13\u342f\13\u348e\13\u34ed\13\u354c\13\u35ab"+
+    "\11\u1ad7";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[7921];
+    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\35\1\36\1\37\1\40\1\41\1\42\131\35\2\43"+
+    "\1\44\26\43\1\45\30\43\1\46\4\43\1\47\17\43"+
+    "\1\50\27\43\2\51\1\52\14\51\1\53\117\51\1\54"+
+    "\1\55\1\0\1\56\1\41\2\54\1\57\1\60\6\54"+
+    "\1\61\26\54\1\62\37\54\1\63\30\54\2\64\1\0"+
+    "\1\64\1\65\2\64\2\65\1\66\1\67\1\70\1\71"+
+    "\1\72\1\73\1\65\1\64\1\74\1\75\3\64\1\76"+
+    "\3\64\1\77\6\64\1\100\4\64\1\65\6\64\1\71"+
+    "\1\64\1\73\1\70\1\75\1\100\1\101\1\74\1\66"+
+    "\1\72\1\102\1\103\1\104\1\67\1\105\1\64\1\106"+
+    "\1\107\1\110\1\76\5\64\1\65\1\64\1\101\1\103"+
+    "\1\104\1\106\1\105\1\77\1\64\1\107\1\111\1\110"+
+    "\1\102\4\64\1\111\7\64\3\112\1\113\3\112\1\114"+
+    "\127\112\3\115\1\113\102\115\1\114\30\115\1\54\1\55"+
+    "\1\0\1\56\1\41\2\54\1\116\1\117\6\54\1\120"+
+    "\26\54\1\62\37\54\1\121\30\54\3\112\1\113\3\112"+
+    "\1\122\127\112\3\115\1\113\102\115\1\122\30\115\1\54"+
+    "\1\55\1\0\1\54\1\41\2\54\1\123\1\117\6\54"+
+    "\1\124\26\54\1\62\37\54\1\125\30\54\7\126\1\127"+
+    "\127\126\106\130\1\127\30\130\1\131\1\41\1\132\1\133"+
+    "\1\41\1\134\1\135\1\136\1\137\3\140\1\141\2\140"+
+    "\1\142\4\140\1\143\1\144\1\140\1\143\1\140\1\145"+
+    "\1\146\1\147\2\131\1\140\1\150\2\140\1\151\1\152"+
+    "\1\153\1\135\4\150\3\62\1\154\1\155\1\156\1\157"+
+    "\1\160\1\161\1\162\1\163\1\164\1\165\2\140\1\166"+
+    "\1\167\1\170\3\140\1\171\1\172\1\131\2\153\1\140"+
+    "\1\153\1\173\1\174\2\140\1\175\10\140\1\143\2\140"+
+    "\1\153\1\140\3\143\1\140\3\143\2\176\1\177\32\176"+
+    "\1\200\50\176\1\201\30\176\2\202\1\203\4\202\1\204"+
+    "\25\202\1\205\101\202\2\206\1\207\1\210\33\206\1\211"+
+    "\22\206\1\212\4\206\1\213\17\206\1\214\27\206\2\215"+
+    "\1\216\1\217\56\215\1\220\4\215\1\221\17\215\1\222"+
+    "\27\215\1\131\1\41\1\223\1\224\1\41\1\134\1\135"+
+    "\1\225\1\226\6\140\1\142\4\140\1\143\1\144\1\140"+
+    "\1\143\1\227\1\145\1\230\1\135\1\231\1\131\1\232"+
+    "\1\150\2\140\1\151\1\152\1\153\1\135\4\150\1\233"+
+    "\2\62\1\234\1\235\1\236\1\237\1\240\1\241\1\242"+
+    "\1\243\1\244\1\245\1\246\1\247\1\250\1\251\1\252"+
+    "\1\253\1\254\1\255\1\256\1\257\1\260\2\153\1\261"+
+    "\1\153\1\262\1\263\13\140\1\143\1\140\1\264\1\153"+
+    "\1\265\3\143\1\266\3\143\2\267\1\270\34\267\1\271"+
+    "\22\267\1\212\4\267\1\213\17\267\1\214\27\267\2\272"+
+    "\1\273\4\272\1\274\25\272\1\275\1\276\100\272\2\176"+
+    "\1\277\32\176\1\300\50\176\1\301\30\176\1\302\1\41"+
+    "\1\303\1\304\1\41\1\302\1\153\1\305\1\306\6\307"+
+    "\1\62\4\307\2\302\1\307\1\302\3\307\1\302\1\310"+
+    "\1\302\1\62\3\307\1\62\1\307\1\302\1\135\2\62"+
+    "\3\302\1\311\1\62\24\307\1\312\2\153\1\307\1\153"+
+    "\1\313\14\307\1\302\2\307\1\314\1\307\3\302\1\307"+
+    "\3\302\1\315\1\41\1\316\1\317\1\41\3\315\1\320"+
+    "\6\321\1\315\4\321\2\315\1\321\1\315\3\321\4\315"+
+    "\1\322\2\321\2\315\1\323\6\315\1\324\1\315\24\321"+
+    "\3\315\1\321\2\315\14\321\1\315\2\321\1\315\1\321"+
+    "\3\315\1\321\3\315\1\325\1\41\1\326\1\327\1\41"+
+    "\1\325\1\330\1\305\1\331\6\332\1\325\4\332\2\333"+
+    "\1\332\1\333\1\332\1\334\1\332\1\325\1\335\1\332"+
+    "\2\325\2\332\1\325\1\135\1\323\1\135\3\325\1\336"+
+    "\3\325\24\332\1\325\1\337\1\340\1\332\1\325\1\313"+
+    "\14\332\1\333\2\332\1\325\1\332\3\333\1\332\3\333"+
+    "\2\202\1\341\4\202\1\342\25\202\1\275\101\202\2\176"+
+    "\1\343\32\176\1\275\50\176\1\344\30\176\2\267\1\345"+
+    "\34\267\1\346\22\267\1\212\4\267\1\213\17\267\1\214"+
+    "\27\267\2\35\4\0\132\35\1\36\2\0\1\41\1\0"+
+    "\131\35\147\0\1\347\1\350\5\351\1\0\10\351\2\0"+
+    "\1\351\5\0\2\351\7\0\1\352\1\353\2\0\10\351"+
+    "\1\350\13\351\3\0\1\351\2\0\17\351\1\0\10\351"+
+    "\1\0\1\41\2\0\1\41\132\0\4\42\1\0\1\42"+
+    "\1\354\130\42\2\43\1\0\26\43\1\0\30\43\1\0"+
+    "\4\43\1\0\17\43\1\0\27\43\31\0\1\355\162\0"+
+    "\1\356\1\0\1\357\136\0\1\360\166\0\1\361\27\0"+
+    "\2\51\1\0\14\51\1\0\117\51\2\54\1\0\1\54"+
+    "\1\0\2\54\2\0\6\54\1\0\26\54\1\0\37\54"+
+    "\1\0\31\54\1\55\1\0\1\54\1\41\2\54\2\0"+
+    "\6\54\1\0\26\54\1\0\37\54\1\0\32\54\1\0"+
+    "\1\54\1\0\2\54\2\0\6\54\1\0\26\54\1\0"+
+    "\3\54\1\362\33\54\1\0\30\54\17\0\1\61\117\0"+
+    "\2\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\26\64\1\0\37\64\1\0\32\64\1\0\1\64\1\0"+
+    "\2\64\2\0\1\64\1\363\2\64\1\364\1\365\1\0"+
+    "\2\64\1\366\7\64\1\367\13\64\1\0\10\64\1\365"+
+    "\1\64\1\366\1\64\1\370\2\64\1\364\1\64\1\371"+
+    "\1\64\1\363\2\64\1\372\10\64\1\0\1\64\1\370"+
+    "\1\371\1\64\1\372\1\64\1\367\23\64\1\0\1\64"+
+    "\1\0\2\64\2\0\3\64\1\373\2\64\1\0\2\64"+
+    "\1\374\23\64\1\0\6\64\1\373\3\64\1\374\1\64"+
+    "\1\375\4\64\1\376\15\64\1\0\1\64\1\375\1\376"+
+    "\27\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\12\64\1\377\13\64\1\0\37\64\1\0\6\64\1\377"+
+    "\23\64\1\0\1\64\1\0\2\64\2\0\1\u0100\5\64"+
+    "\1\0\1\64\1\u0101\17\64\1\u0102\4\64\1\0\13\64"+
+    "\1\u0102\1\64\1\u0101\1\u0100\3\64\1\u0103\3\64\1\u0104"+
+    "\10\64\1\0\3\64\1\u0103\1\u0104\25\64\1\0\1\64"+
+    "\1\0\2\64\2\0\2\64\1\u0105\3\64\1\0\1\64"+
+    "\1\u0106\24\64\1\0\11\64\1\u0105\2\64\1\u0107\1\u0106"+
+    "\21\64\1\0\1\64\1\u0107\30\64\1\0\1\64\1\0"+
+    "\2\64\2\0\2\64\1\111\1\u0108\1\64\1\111\1\0"+
+    "\2\64\1\u0109\3\64\1\u010a\12\64\1\u010b\4\64\1\0"+
+    "\6\64\1\u0108\1\64\2\111\1\u0109\1\u010b\1\u010c\3\64"+
+    "\1\u010d\3\64\1\111\4\64\1\u010a\5\64\1\0\1\64"+
+    "\1\u010c\3\64\1\111\5\64\1\u010d\16\64\1\0\1\64"+
+    "\1\0\2\64\2\0\3\64\1\u010e\2\64\1\0\2\64"+
+    "\1\u010f\23\64\1\0\6\64\1\u010e\3\64\1\u010f\1\64"+
+    "\1\u0110\22\64\1\0\1\64\1\u0110\30\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\26\64\1\0\26\64"+
+    "\1\u0111\1\64\1\u0112\6\64\1\0\4\64\1\u0111\5\64"+
+    "\1\u0112\17\64\1\0\1\64\1\0\2\64\2\0\2\64"+
+    "\1\111\1\u0104\2\64\1\0\1\64\1\u0113\10\64\1\u0114"+
+    "\13\64\1\0\6\64\1\u0104\1\u0115\1\64\1\111\2\64"+
+    "\1\u0116\1\u0113\3\64\1\u0117\2\64\1\u0118\12\64\1\0"+
+    "\1\64\1\u0116\1\u0117\2\64\1\u0118\1\u0114\1\u0115\22\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\1\64"+
+    "\1\111\24\64\1\0\15\64\1\111\21\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\2\64\1\u0119\1\u011a"+
+    "\2\64\1\0\26\64\1\0\6\64\1\u011a\2\64\1\u0119"+
+    "\7\64\1\u011b\15\64\1\0\2\64\1\u011b\27\64\1\0"+
+    "\1\64\1\0\2\64\2\0\1\u011c\1\u011d\1\u011e\1\64"+
+    "\1\u011f\1\64\1\0\6\64\1\u0120\3\64\1\u0121\13\64"+
+    "\1\0\11\64\1\u011e\4\64\1\u011c\1\u011f\3\64\1\u011d"+
+    "\1\u0122\4\64\1\u0120\5\64\1\0\5\64\1\u0122\1\u0121"+
+    "\23\64\1\0\1\64\1\0\2\64\2\0\2\64\1\111"+
+    "\2\64\1\u0123\1\0\2\64\1\u0124\23\64\1\0\10\64"+
+    "\1\u0123\1\111\1\u0124\24\64\1\0\14\64\1\111\4\64"+
+    "\3\111\1\64\2\111\3\64\1\0\1\64\1\0\2\64"+
+    "\2\0\4\64\1\u0125\1\64\1\0\1\64\1\111\4\64"+
+    "\1\u0126\3\64\1\u0127\13\64\1\0\15\64\1\111\1\64"+
+    "\1\u0125\11\64\1\u0126\5\64\1\0\6\64\1\u0127\23\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\2\64"+
+    "\1\u0128\23\64\1\0\12\64\1\u0128\1\64\1\u0129\4\64"+
+    "\1\u012a\15\64\1\0\1\64\1\u0129\1\u012a\27\64\1\0"+
+    "\1\64\1\0\2\64\2\0\3\64\1\u012b\1\64\1\111"+
+    "\1\0\1\64\1\111\1\u012c\16\64\1\u012d\4\64\1\0"+
+    "\6\64\1\u012b\1\64\1\111\1\64\1\u012c\1\u012d\1\u012e"+
+    "\1\111\6\64\1\111\12\64\1\0\1\64\1\u012e\3\64"+
+    "\1\111\24\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+    "\1\0\2\64\1\u012f\7\64\1\u0130\13\64\1\0\12\64"+
+    "\1\u012f\1\64\1\u0131\22\64\1\0\1\64\1\u0131\4\64"+
+    "\1\u0130\23\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+    "\1\0\2\64\1\u0132\3\64\1\u0133\17\64\1\0\12\64"+
+    "\1\u0132\16\64\1\u0133\5\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\3\64\1\u0134\2\64\1\0\26\64"+
+    "\1\0\6\64\1\u0134\5\64\1\u0135\22\64\1\0\1\64"+
+    "\1\u0135\26\64\3\112\1\0\3\112\1\0\127\112\52\0"+
+    "\1\u0136\64\0\3\115\1\0\102\115\1\0\30\115\17\0"+
+    "\1\u0137\117\0\7\126\1\0\127\126\106\130\1\0\30\130"+
+    "\1\131\10\0\6\131\1\0\11\131\1\0\1\131\1\0"+
+    "\3\131\1\0\2\131\13\0\25\131\2\0\1\131\2\0"+
+    "\17\131\1\0\10\131\3\0\1\u0138\4\0\1\u0139\35\0"+
+    "\1\62\3\0\1\u013a\71\0\1\62\40\0\1\62\70\0"+
+    "\10\u013b\1\u013c\24\u013b\1\u013d\1\u013b\1\u013e\6\u013b\1\u013f"+
+    "\70\u013b\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0141\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\17\0"+
+    "\1\u0142\26\0\1\62\70\0\1\u0143\10\0\6\u0143\1\0"+
+    "\1\u0143\1\u0144\1\u0145\1\u0143\2\143\1\u0143\1\143\1\u0143"+
+    "\1\0\1\u0143\1\0\3\u0143\1\0\1\u0143\1\u0146\1\0"+
+    "\1\u0147\11\0\4\u0143\1\u0145\1\u0146\1\u0143\1\u0144\6\u0143"+
+    "\1\u0146\6\u0143\2\0\1\u0143\2\0\5\u0143\1\u0146\6\u0143"+
+    "\1\143\2\u0143\1\0\1\u0143\3\143\1\u0143\3\143\1\u0143"+
+    "\10\0\6\u0143\1\0\1\u0143\1\u0144\1\u0145\1\u0143\1\u0148"+
+    "\1\u0149\1\u0143\1\u0149\1\u0143\1\0\1\u0143\1\0\3\u0143"+
+    "\1\0\1\u014a\1\u0146\1\0\1\u0147\11\0\4\u0143\1\u0145"+
+    "\1\u0146\1\u0143\1\u0144\6\u0143\1\u0146\6\u0143\2\0\1\u014a"+
+    "\2\0\5\u0143\1\u0146\6\u0143\1\u0149\2\u0143\1\0\1\u0143"+
+    "\3\u0149\1\u0143\2\u0149\1\u0148\31\0\1\62\14\0\1\62"+
+    "\70\0\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u014b\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\46\0\1\62\132\0\1\62\3\0\1\62\114\0"+
+    "\2\u0147\1\0\1\u0147\73\0\1\u0147\4\0\3\u0147\1\0"+
+    "\3\u0147\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+    "\1\u014c\2\140\1\u014d\3\140\1\u014e\3\140\1\u014f\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0150\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0151\6\140"+
+    "\1\u0152\4\140\1\u0153\4\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0154\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0155\1\u0156\1\u0157\3\140\1\u0158\5\140"+
+    "\1\u0159\1\140\1\131\2\0\1\u015a\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u015b"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u015c"+
+    "\5\140\1\u015d\1\u015e\3\140\1\u015f\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\23\140\1\u0160\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0161\6\140\1\u0162\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0163\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0164\7\140\1\u0165"+
+    "\4\140\1\u0166\4\140\1\131\2\0\1\140\2\0\1\u0167"+
+    "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u0168\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0169\2\140\1\u016a\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u016b\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u016c\1\140\1\u016d\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u016e\1\u016f"+
+    "\2\140\1\u0170\1\u0171\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0172\6\140\1\u0173\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u015f\4\140\1\u0174\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0175\7\140"+
+    "\1\u0176\3\140\1\u0177\4\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0178\11\140\1\u0179\11\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u017a\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\2\176\1\0\32\176\1\0"+
+    "\50\176\1\0\30\176\2\u017b\1\0\27\u017b\1\u017c\51\u017b"+
+    "\1\u017d\32\u017b\2\202\1\0\4\202\1\0\25\202\1\0"+
+    "\101\202\2\206\2\0\33\206\1\0\22\206\1\0\4\206"+
+    "\1\0\17\206\1\0\27\206\10\0\1\u017e\136\0\1\u017f"+
+    "\203\0\1\u0180\1\0\1\u0181\136\0\1\u0182\166\0\1\u0183"+
+    "\27\0\2\215\2\0\56\215\1\0\4\215\1\0\17\215"+
+    "\1\0\27\215\10\0\1\u0184\203\0\1\u0185\1\0\1\u0186"+
+    "\136\0\1\u0187\166\0\1\u0188\32\0\1\u0138\42\0\1\62"+
+    "\100\0\1\231\26\0\1\u0189\6\0\1\62\70\0\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u018a\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u018b\1\u018c\2\140"+
+    "\1\u018d\1\140\1\u018e\3\140\1\u018f\1\u0190\2\140\1\u0191"+
+    "\1\u018d\2\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\2\231\1\0\134\231\1\131\10\0\6\u0192\1\0"+
+    "\4\u0192\2\140\1\u0192\1\140\1\u0192\1\0\1\u0192\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\u0192\13\0\24\u0192\1\131"+
+    "\2\0\1\u0192\2\0\14\u0192\1\140\2\u0192\1\0\1\u0192"+
+    "\3\140\1\u0192\3\140\17\0\1\u0193\117\0\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u0194\1\u0195\2\140"+
+    "\1\u014c\2\140\1\u0196\1\u0197\2\140\1\u0198\1\u0199\1\u019a"+
+    "\1\140\1\u019b\2\140\1\u019c\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u019d\1\u019e\2\140\1\u019f\3\140\1\u0150"+
+    "\2\140\1\u01a0\1\140\1\u01a1\3\140\1\131\2\0\1\140"+
+    "\2\0\16\140\1\u01a2\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u01a3\2\140\1\u01a4\1\u01a5\1\140"+
+    "\1\u01a6\3\140\1\u01a7\1\u01a8\1\140\1\u01a9\1\140\1\u01aa"+
+    "\1\u01ab\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u01ac\1\140\1\u01ad\1\140\1\u01ae\1\140\1\u01af\1\u01b0"+
+    "\1\140\1\u01b1\4\140\1\u01b2\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u01b3\2\140\1\u01b4\1\u01b5\1\u01b6"+
+    "\2\140\1\u01b7\1\u01b8\1\u01b9\2\140\1\u01ba\1\140\1\u01bb"+
+    "\1\u01bc\1\131\2\0\1\u01bd\2\0\16\140\1\u01be\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u01bf"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u01c0"+
+    "\1\u01c1\1\u01c2\1\u01c3\1\u01c4\1\u01c5\1\u015d\1\u01c6\1\u01c7"+
+    "\1\u01c8\1\140\1\u01c9\1\u01ca\1\u01cb\2\140\1\u01cc\2\140"+
+    "\1\u01cd\1\131\2\0\1\140\2\0\1\u01ce\16\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u01cf"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u01d0\1\u01d1\1\u01d2\3\140\1\u01d3\1\u01d4\1\u01d5\2\140"+
+    "\1\u01d6\1\u01d7\1\u01d8\4\140\1\u01d9\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u01da\1\140\1\u01ac\1\140\1\u01db\1\140"+
+    "\1\u01dc\1\140\1\u01dd\2\140\1\u01de\1\140\1\u01df\1\u01e0"+
+    "\5\140\1\131\2\0\1\140\2\0\16\140\1\u01e1\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u01e2"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u01e3"+
+    "\1\140\1\u01e4\1\u01e5\1\u01e6\1\140\1\u01e7\1\u01e8\1\u01e9"+
+    "\1\u01ea\1\u01eb\1\u01ec\1\u01ed\1\u01ee\1\140\1\u01ef\1\140"+
+    "\1\u01f0\2\140\1\131\2\0\1\140\2\0\1\u01f1\16\140"+
+    "\1\0\1\u01f2\7\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u01f3\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u01f4\1\u01f5\1\140\1\u01f6\1\140\1\u01f7\1\u01f8"+
+    "\3\140\1\u01f9\1\u01fa\1\u01fb\1\u01fc\1\u01fd\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u01fe\1\140\1\u01ff\1\140"+
+    "\1\u0200\1\140\1\u0201\10\140\1\u0202\4\140\1\131\2\0"+
+    "\1\140\2\0\1\u0203\16\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0204\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0205\1\140\1\u0206"+
+    "\1\140\1\u0207\1\140\1\u0208\3\140\1\u0209\1\u020a\3\140"+
+    "\1\u020b\1\u020c\1\131\2\0\1\140\2\0\1\u020d\16\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u020e\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u020f\2\140\1\u0210\1\140\1\u0211\1\u0212\1\u0213"+
+    "\2\140\1\u0214\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u0215\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0216\1\u0217\1\u0218\1\u0219\1\u021a\2\140\1\u021b"+
+    "\1\u021c\1\140\1\u021d\1\140\1\u021e\4\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u021f\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0220\1\u020f\1\140\1\u0221\1\u0222"+
+    "\1\140\1\u0223\1\u0224\1\u0225\2\140\1\u0226\1\u0227\1\u0228"+
+    "\5\140\1\u0229\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u022a\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u022b"+
+    "\1\140\1\u022c\1\140\1\u022d\1\140\1\u022e\1\140\1\u022f"+
+    "\1\140\1\u0230\1\u0231\1\140\1\u0232\1\u0233\1\u0234\1\140"+
+    "\1\u0235\1\140\1\u0236\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0237\2\140\1\u018d\1\u0238\3\140\1\u01af\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0239\3\140\1\u023a\1\u023b"+
+    "\1\u023c\1\140\1\u023b\1\u023d\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u023e\2\140\1\u0175\1\u023f\1\140\1\u0240"+
+    "\6\140\1\u0241\6\140\1\131\2\0\1\140\2\0\16\140"+
+    "\1\u0242\1\0\10\140\1\131\10\0\6\u0243\1\0\4\u0243"+
+    "\2\131\1\u0243\1\131\1\u0243\1\0\1\u0243\1\0\2\131"+
+    "\1\u0243\1\0\2\u0243\13\0\24\u0243\1\131\2\0\1\u0243"+
+    "\2\0\14\u0243\1\131\2\u0243\1\0\1\u0243\3\131\1\u0243"+
+    "\4\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0244\5\140"+
+    "\1\u0245\1\140\1\u0246\1\u0247\1\140\1\u015f\4\140\1\u0248"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0249"+
+    "\6\140\1\u0179\1\u024a\2\140\1\u024b\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\5\140\1\u024c\2\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u024d\3\140\1\u024e"+
+    "\2\140\1\u024f\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u0250\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u0251\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u0252\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0253\1\140\1\u0254\2\140\1\u0255\1\140\1\u0256"+
+    "\2\140\1\u0257\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\2\267\1\0\34\267\1\0\22\267\1\0"+
+    "\4\267\1\0\17\267\1\0\27\267\10\0\1\u0258\126\0"+
+    "\2\272\1\0\4\272\1\0\25\272\2\0\100\272\2\u0259"+
+    "\1\0\134\u0259\11\0\6\u025a\1\0\4\u025a\2\0\1\u025a"+
+    "\1\0\1\u025a\1\0\1\u025a\5\0\2\u025a\13\0\24\u025a"+
+    "\3\0\1\u025a\2\0\14\u025a\1\0\2\u025a\1\0\1\u025a"+
+    "\3\0\1\u025a\3\0\2\u025b\1\0\134\u025b\10\0\1\u025c"+
+    "\165\0\1\u025d\110\0\6\307\1\0\13\307\5\0\2\307"+
+    "\1\0\1\307\11\0\24\307\3\0\1\307\2\0\17\307"+
+    "\1\0\10\307\11\0\6\u025e\1\0\4\u025e\2\0\1\u025e"+
+    "\1\0\3\u025e\4\0\3\u025e\1\0\1\u025e\11\0\24\u025e"+
+    "\3\0\1\u025e\2\0\14\u025e\1\0\2\u025e\1\0\1\u025e"+
+    "\3\0\1\u025e\56\0\1\u025f\3\0\1\u0260\1\u0261\1\u0262"+
+    "\1\u0263\1\u0264\1\u0265\2\0\1\u0266\1\u0267\1\u0268\1\u0269"+
+    "\1\u026a\3\0\1\u026b\50\0\6\u026c\1\0\4\u026c\2\0"+
+    "\1\u026c\1\0\3\u026c\4\0\3\u026c\1\0\1\u026c\11\0"+
+    "\24\u026c\3\0\1\u026c\2\0\14\u026c\1\0\2\u026c\1\0"+
+    "\1\u026c\3\0\1\u026c\14\0\6\321\1\0\13\321\5\0"+
+    "\2\321\13\0\24\321\3\0\1\321\2\0\17\321\1\0"+
+    "\10\321\11\0\6\321\1\0\4\321\2\0\1\321\1\0"+
+    "\3\321\5\0\2\321\13\0\24\321\3\0\1\321\2\0"+
+    "\14\321\1\0\2\321\1\0\1\321\3\0\1\321\13\0"+
+    "\7\332\1\0\4\332\2\0\1\332\1\0\3\332\2\0"+
+    "\1\332\1\0\1\u025d\2\332\13\0\24\332\2\0\1\340"+
+    "\1\332\2\0\14\332\1\0\2\332\1\0\1\332\3\0"+
+    "\1\332\13\0\7\332\1\0\4\332\2\0\1\332\1\0"+
+    "\3\332\2\0\1\332\2\0\2\332\13\0\24\332\2\0"+
+    "\1\340\1\332\2\0\14\332\1\0\2\332\1\0\1\332"+
+    "\3\0\1\332\27\0\2\333\1\0\1\333\13\0\1\333"+
+    "\4\0\1\u026d\4\0\1\u026e\3\0\1\u026f\3\0\1\u026d"+
+    "\1\u0270\3\0\1\u0271\2\0\1\u0272\25\0\1\333\4\0"+
+    "\3\333\1\0\3\333\10\0\7\332\1\0\4\332\2\333"+
+    "\1\332\1\333\3\332\2\0\1\332\2\0\2\332\13\0"+
+    "\24\332\2\0\1\340\1\332\2\0\14\332\1\333\2\332"+
+    "\1\0\1\332\3\333\1\332\3\333\12\0\1\u0273\7\0"+
+    "\1\u0273\1\0\4\u0273\11\0\1\u0273\17\0\3\u0273\6\0"+
+    "\2\u0273\4\0\1\u0273\7\0\1\u0273\3\0\1\u0273\6\0"+
+    "\1\u0273\4\0\3\u0273\1\0\3\u0273\55\0\1\u0274\71\0"+
+    "\1\u0275\137\0\6\u0276\1\0\10\u0276\2\0\1\u0276\5\0"+
+    "\2\u0276\13\0\24\u0276\3\0\1\u0276\2\0\17\u0276\1\0"+
+    "\10\u0276\11\0\1\351\1\u0277\3\351\1\u0278\1\0\10\351"+
+    "\2\0\1\351\5\0\2\351\13\0\2\351\1\u0278\12\351"+
+    "\1\u0277\6\351\3\0\1\351\2\0\17\351\1\0\10\351"+
+    "\11\0\6\351\1\0\10\351\2\0\1\351\5\0\2\351"+
+    "\13\0\24\351\3\0\1\351\2\0\17\351\1\0\10\351"+
+    "\31\0\1\u0279\173\0\1\u027a\67\0\1\u027b\203\0\1\u027c"+
+    "\140\0\1\u027d\127\0\1\u027e\166\0\1\u027f\27\0\2\54"+
+    "\1\0\1\54\1\0\2\54\2\0\6\54\1\0\26\54"+
+    "\1\0\17\54\1\u0280\17\54\1\0\30\54\2\64\1\0"+
+    "\1\64\1\0\2\64\2\0\2\64\1\u0281\3\64\1\0"+
+    "\26\64\1\0\11\64\1\u0281\25\64\1\0\32\64\1\0"+
+    "\1\64\1\0\2\64\2\0\6\64\1\0\26\64\1\0"+
+    "\14\64\1\u0282\22\64\1\0\1\64\1\u0282\30\64\1\0"+
+    "\1\64\1\0\2\64\2\0\2\64\1\u0283\3\64\1\0"+
+    "\1\377\25\64\1\0\11\64\1\u0283\13\64\1\377\11\64"+
+    "\1\0\32\64\1\0\1\64\1\0\2\64\2\0\1\64"+
+    "\1\u0284\1\u0285\3\64\1\0\1\64\1\u0286\24\64\1\0"+
+    "\11\64\1\u0285\3\64\1\u0286\5\64\1\u0284\13\64\1\0"+
+    "\32\64\1\0\1\64\1\0\2\64\2\0\4\64\1\111"+
+    "\1\64\1\0\6\64\1\111\17\64\1\0\17\64\1\111"+
+    "\11\64\1\111\5\64\1\0\32\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\26\64\1\0\26\64\1\u0287"+
+    "\10\64\1\0\4\64\1\u0287\25\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\12\64\1\u0288\13\64\1\0"+
+    "\37\64\1\0\6\64\1\u0288\23\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\26\64\1\0\14\64\1\u0289"+
+    "\22\64\1\0\1\64\1\u0289\30\64\1\0\1\64\1\0"+
+    "\2\64\2\0\5\64\1\u028a\1\0\26\64\1\0\10\64"+
+    "\1\u028a\26\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+    "\2\0\6\64\1\0\26\64\1\0\22\64\1\u028b\14\64"+
+    "\1\0\3\64\1\u028b\26\64\1\0\1\64\1\0\2\64"+
+    "\2\0\4\64\1\u0284\1\64\1\0\26\64\1\0\17\64"+
+    "\1\u0284\2\64\1\u028c\14\64\1\0\3\64\1\u028c\26\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\1\64"+
+    "\1\u028d\24\64\1\0\15\64\1\u028d\6\64\1\u028a\1\64"+
+    "\1\u028e\10\64\1\0\4\64\1\u028e\1\u028a\24\64\1\0"+
+    "\1\64\1\0\2\64\2\0\6\64\1\0\1\64\1\u028a"+
+    "\24\64\1\0\15\64\1\u028a\21\64\1\0\32\64\1\0"+
+    "\1\64\1\0\2\64\2\0\3\64\1\u028f\2\64\1\0"+
+    "\26\64\1\0\6\64\1\u028f\30\64\1\0\32\64\1\0"+
+    "\1\64\1\0\2\64\2\0\6\64\1\0\26\64\1\0"+
+    "\14\64\1\u0290\22\64\1\0\1\64\1\u0290\30\64\1\0"+
+    "\1\64\1\0\2\64\2\0\2\64\1\u0291\3\64\1\0"+
+    "\26\64\1\0\11\64\1\u0291\25\64\1\0\32\64\1\0"+
+    "\1\64\1\0\2\64\2\0\1\111\3\64\1\u0292\1\64"+
+    "\1\0\26\64\1\0\16\64\1\111\1\u0292\17\64\1\0"+
+    "\32\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\26\64\1\0\7\64\1\111\27\64\1\0\7\64\1\111"+
+    "\22\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\2\64\1\111\23\64\1\0\12\64\1\111\6\64\1\u0293"+
+    "\15\64\1\0\2\64\1\u0293\27\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\26\64\1\0\14\64\1\u0294"+
+    "\22\64\1\0\1\64\1\u0294\30\64\1\0\1\64\1\0"+
+    "\2\64\2\0\2\64\1\u0295\3\64\1\0\26\64\1\0"+
+    "\11\64\1\u0295\25\64\1\0\32\64\1\0\1\64\1\0"+
+    "\2\64\2\0\5\64\1\377\1\0\26\64\1\0\10\64"+
+    "\1\377\15\64\1\u028a\10\64\1\0\4\64\1\u028a\25\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\20\64"+
+    "\1\u0296\5\64\1\0\35\64\1\u0296\1\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\21\64\1\u0117\15\64\1\0\2\64\1\u0117\27\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\21\64\1\u0297\15\64\1\0\2\64\1\u0297\27\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\6\64"+
+    "\1\377\17\64\1\0\31\64\1\377\5\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\2\64"+
+    "\1\u0298\23\64\1\0\12\64\1\u0298\24\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\22\64\1\u0299\14\64\1\0\3\64\1\u0299\26\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\7\64\1\u029a\27\64\1\0\7\64\1\u029a\22\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\1\u029b"+
+    "\5\64\1\u029c\17\64\1\0\25\64\1\u029b\3\64\1\u029c"+
+    "\5\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\6\64\1\u029d\17\64\1\0\31\64\1\u029d"+
+    "\5\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\2\64\1\u029e\23\64\1\0\12\64\1\u029e"+
+    "\24\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+    "\3\64\1\u029f\2\64\1\0\26\64\1\0\6\64\1\u029f"+
+    "\12\64\1\u02a0\15\64\1\0\2\64\1\u02a0\27\64\1\0"+
+    "\1\64\1\0\2\64\2\0\5\64\1\u02a1\1\0\26\64"+
+    "\1\0\10\64\1\u02a1\26\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\1\u02a2\5\64\1\0\26\64\1\0"+
+    "\16\64\1\u02a2\20\64\1\0\32\64\1\0\1\64\1\0"+
+    "\2\64\2\0\1\u02a3\5\64\1\0\26\64\1\0\16\64"+
+    "\1\u02a3\20\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+    "\2\0\6\64\1\0\26\64\1\0\24\64\1\u02a4\12\64"+
+    "\1\0\5\64\1\u02a4\24\64\1\0\1\64\1\0\2\64"+
+    "\2\0\6\64\1\0\26\64\1\0\21\64\1\111\15\64"+
+    "\1\0\2\64\1\111\27\64\1\0\1\64\1\0\2\64"+
+    "\2\0\6\64\1\0\26\64\1\0\14\64\1\u02a5\22\64"+
+    "\1\0\1\64\1\u02a5\30\64\1\0\1\64\1\0\2\64"+
+    "\2\0\6\64\1\0\2\64\1\u02a6\23\64\1\0\7\64"+
+    "\1\u02a7\2\64\1\u02a6\24\64\1\0\7\64\1\u02a7\22\64"+
+    "\1\0\1\64\1\0\2\64\2\0\2\64\1\u02a8\3\64"+
+    "\1\0\26\64\1\0\11\64\1\u02a8\7\64\1\u028b\1\u02a9"+
+    "\14\64\1\0\2\64\1\u028b\1\u02a9\26\64\1\0\1\64"+
+    "\1\0\2\64\2\0\3\64\1\u02aa\2\64\1\0\26\64"+
+    "\1\0\6\64\1\u02aa\30\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\2\64\1\u02ab\3\64\1\0\26\64"+
+    "\1\0\11\64\1\u02ab\25\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\5\64\1\u02ac\1\0\2\64\1\u02ad"+
+    "\23\64\1\0\10\64\1\u02ac\1\64\1\u02ad\24\64\1\0"+
+    "\32\64\1\0\1\64\1\0\2\64\2\0\4\64\1\u02ae"+
+    "\1\64\1\0\26\64\1\0\17\64\1\u02ae\17\64\1\0"+
+    "\32\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\6\64\1\u0135\17\64\1\0\31\64\1\u0135\5\64\1\0"+
+    "\32\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\26\64\1\0\24\64\1\u02af\12\64\1\0\5\64\1\u02af"+
+    "\24\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\26\64\1\0\24\64\1\u02b0\12\64\1\0\5\64\1\u02b0"+
+    "\24\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\26\64\1\0\26\64\1\u02b1\10\64\1\0\4\64\1\u02b1"+
+    "\25\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\26\64\1\0\14\64\1\u02b2\22\64\1\0\1\64\1\u02b2"+
+    "\30\64\1\0\1\64\1\0\2\64\2\0\5\64\1\u02b3"+
+    "\1\0\26\64\1\0\10\64\1\u02b3\26\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\37\64\1\0\15\64\1\u0286\6\64\1\u0286\5\64"+
+    "\1\0\1\64\1\0\2\64\2\0\5\64\1\u02b4\1\0"+
+    "\26\64\1\0\10\64\1\u02b4\26\64\1\0\32\64\1\0"+
+    "\1\64\1\0\2\64\2\0\1\u02a9\5\64\1\0\26\64"+
+    "\1\0\16\64\1\u02a9\20\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\26\64\1\0\30\64"+
+    "\1\111\6\64\1\0\12\64\1\111\17\64\1\0\1\64"+
+    "\1\0\2\64\2\0\1\u02b5\5\64\1\0\1\64\1\u0101"+
+    "\1\u02b6\3\64\1\u0135\12\64\1\u02b7\4\64\1\0\12\64"+
+    "\1\u02b6\1\u02b7\1\64\1\u0101\1\u02b5\12\64\1\u0135\5\64"+
+    "\1\0\32\64\1\0\1\64\1\0\2\64\2\0\2\64"+
+    "\1\111\3\64\1\0\26\64\1\0\11\64\1\111\2\64"+
+    "\1\u02b8\13\64\1\111\6\64\1\0\1\64\1\u02b8\10\64"+
+    "\1\111\17\64\1\0\1\64\1\0\2\64\2\0\5\64"+
+    "\1\u02b9\1\0\1\64\1\111\24\64\1\0\10\64\1\u02b9"+
+    "\4\64\1\111\21\64\1\0\32\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\26\64\1\0\22\64\1\111"+
+    "\14\64\1\0\3\64\1\111\26\64\1\0\1\64\1\0"+
+    "\2\64\2\0\5\64\1\u02ba\1\0\26\64\1\0\10\64"+
+    "\1\u02ba\26\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+    "\2\0\5\64\1\u02bb\1\0\26\64\1\0\10\64\1\u02bb"+
+    "\11\64\1\u02bc\14\64\1\0\3\64\1\u02bc\26\64\1\0"+
+    "\1\64\1\0\2\64\2\0\6\64\1\0\1\64\1\u02bd"+
+    "\24\64\1\0\15\64\1\u02bd\21\64\1\0\32\64\1\0"+
+    "\1\64\1\0\2\64\2\0\2\64\1\u02be\1\64\1\111"+
+    "\1\64\1\0\26\64\1\0\11\64\1\u02be\5\64\1\111"+
+    "\17\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\1\u02bf\25\64\1\0\25\64\1\u02bf\11\64"+
+    "\1\0\32\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+    "\1\0\26\64\1\0\24\64\1\111\12\64\1\0\5\64"+
+    "\1\111\24\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+    "\1\0\26\64\1\0\24\64\1\u02c0\12\64\1\0\5\64"+
+    "\1\u02c0\24\64\1\0\1\64\1\0\2\64\2\0\2\64"+
+    "\1\111\3\64\1\0\26\64\1\0\11\64\1\111\25\64"+
+    "\1\0\30\64\66\0\1\u02c1\61\0\1\u02c2\53\0\1\u02c2"+
+    "\137\0\1\u02c3\50\0\10\u013b\1\u02c4\24\u013b\1\u013d\103\u013b"+
+    "\1\0\134\u013b\37\0\1\u02c5\77\0\1\131\10\0\6\131"+
+    "\1\0\11\131\1\0\1\u02c6\1\0\3\131\1\0\2\131"+
+    "\13\0\25\131\2\0\1\131\2\0\17\131\1\0\11\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u02c7\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\17\0"+
+    "\1\150\26\0\1\62\70\0\1\u0143\10\0\6\u0143\1\0"+
+    "\11\u0143\1\0\1\u0143\1\0\3\u0143\1\0\2\u0143\13\0"+
+    "\25\u0143\2\0\1\u0143\2\0\17\u0143\1\0\11\u0143\10\0"+
+    "\6\u0143\1\0\4\u0143\2\u02c8\1\u0143\1\u02c8\1\u0143\1\u02c9"+
+    "\1\u0143\1\0\3\u0143\1\0\2\u0143\1\u02c9\12\0\25\u0143"+
+    "\2\0\1\u0143\2\0\14\u0143\1\u02c8\2\u0143\1\0\1\u0143"+
+    "\3\u02c8\1\u0143\3\u02c8\1\u0143\10\0\6\u0143\1\0\2\u0143"+
+    "\1\u0145\1\u0143\2\u0147\1\u0143\1\u0147\1\u0143\1\0\1\u0143"+
+    "\1\0\3\u0143\1\0\1\u0143\1\u0146\13\0\4\u0143\1\u0145"+
+    "\1\u0146\10\u0143\1\u0146\6\u0143\2\0\1\u0143\2\0\5\u0143"+
+    "\1\u0146\6\u0143\1\u0147\2\u0143\1\0\1\u0143\3\u0147\1\u0143"+
+    "\3\u0147\1\u0143\10\0\6\u0143\1\0\2\u0143\1\u0145\1\u0143"+
+    "\2\u0148\1\u0143\1\u0148\1\u0143\1\0\1\u0143\1\0\3\u0143"+
+    "\1\0\1\u0143\1\u0146\1\0\1\u0147\11\0\4\u0143\1\u0145"+
+    "\1\u0146\10\u0143\1\u0146\6\u0143\2\0\1\u0143\2\0\5\u0143"+
+    "\1\u0146\6\u0143\1\u0148\2\u0143\1\0\1\u0143\3\u0148\1\u0143"+
+    "\3\u0148\1\u0143\10\0\6\u0143\1\0\1\u0143\1\u02ca\1\u0145"+
+    "\1\u0143\1\u0148\1\u0149\1\u0143\1\u0149\1\u0143\1\0\1\u0143"+
+    "\1\0\3\u0143\1\0\1\u0143\1\u0146\1\0\1\u0147\11\0"+
+    "\4\u0143\1\u0145\1\u0146\1\u0143\1\u02ca\6\u0143\1\u0146\6\u0143"+
+    "\2\0\1\u0143\2\0\5\u0143\1\u0146\6\u0143\1\u0149\2\u0143"+
+    "\1\0\1\u0143\3\u0149\1\u0143\2\u0149\1\u0148\1\u0143\10\0"+
+    "\1\u0143\1\u02cb\4\u0143\1\0\2\u0143\1\u02cb\1\u0143\4\u02cb"+
+    "\1\u0143\1\0\1\u0143\1\0\3\u0143\1\0\1\u0143\1\u02cb"+
+    "\13\0\4\u0143\3\u02cb\6\u0143\2\u02cb\4\u0143\1\u02cb\1\u0143"+
+    "\2\0\1\u0143\2\0\1\u0143\1\u02cb\3\u0143\1\u02cb\6\u0143"+
+    "\1\u02cb\2\u0143\1\0\1\u0143\3\u02cb\1\u0143\3\u02cb\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u02cc\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\1\140\1\u02cd\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\3\140\1\u02ce\13\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u02cf"+
+    "\5\140\1\u02d0\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u02d1\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u02d2\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u02d3\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u02d4\10\140\1\u014c\4\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u02d5\2\140\1\u02d6\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u02d7\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u02d8\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u02d9\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u02da\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u02db\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u02dc\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u02dd\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u02de\6\140\1\u02df\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u02e0\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u02e1\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u02e2\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u02e3\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u014c\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u02e4\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u02e5\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u02e6\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u02e7\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u02e8\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u02e9\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u02ea\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u02eb\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\23\140\1\u02ec\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u02ed\12\140\1\u02ee\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u02ef\11\140\1\u02f0\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u02f1\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\1\u014c\16\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u02f2\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u02f3\5\140\1\u02da\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u02f4\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u02f5\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u02f6\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u02f7\1\140"+
+    "\1\u02f8\13\140\1\u02f9\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u02fa\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u01d6\6\140"+
+    "\1\u02fb\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u02fc\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u02fd\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u02fe\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u02ff\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0300"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\3\140\1\u014c\13\140\1\0\10\140"+
+    "\12\0\1\u0301\7\0\1\u0301\1\0\4\u0301\11\0\1\u0301"+
+    "\17\0\3\u0301\6\0\2\u0301\4\0\1\u0301\7\0\1\u0301"+
+    "\3\0\1\u0301\6\0\1\u0301\4\0\3\u0301\1\0\3\u0301"+
+    "\12\0\1\u0302\7\0\1\u0302\1\0\4\u0302\11\0\1\u0302"+
+    "\17\0\3\u0302\6\0\2\u0302\4\0\1\u0302\7\0\1\u0302"+
+    "\3\0\1\u0302\6\0\1\u0302\4\0\3\u0302\1\0\3\u0302"+
+    "\11\0\1\u0303\53\0\1\u0303\135\0\1\u0304\140\0\1\u0305"+
+    "\127\0\1\u0306\166\0\1\u0307\40\0\1\u0308\53\0\1\u0308"+
+    "\135\0\1\u0309\140\0\1\u030a\127\0\1\u030b\166\0\1\u030c"+
+    "\27\0\1\131\10\0\1\140\1\u030d\4\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\1\140"+
+    "\1\u030e\13\0\1\140\1\u030f\1\u0310\12\140\1\u0311\6\140"+
+    "\1\131\2\0\1\140\2\0\3\140\1\u0312\1\u0313\1\u0314"+
+    "\11\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u0315\16\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u0316\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u01af\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0317\2\140\1\u0318\3\140\1\u0319\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u031a\2\140\1\u031b"+
+    "\3\140\1\u031c\1\u031d\1\u031e\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\5\140\1\u031f\16\140\1\131\2\0\1\140"+
+    "\2\0\1\u0320\16\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0321\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\u0192"+
+    "\1\0\11\u0192\1\0\1\u0192\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\u0192\13\0\24\u0192\1\131\2\0\1\u0192\2\0"+
+    "\17\u0192\1\0\10\u0192\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0322\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0323\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0324\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0325\1\140\1\u0326\1\u0327\1\u0328\1\u0329"+
+    "\1\u032a\1\u032b\1\u032c\1\u032d\1\u032e\2\140\1\u032f\1\u0330"+
+    "\5\140\1\131\2\0\1\u0331\2\0\1\u0332\16\140\1\0"+
+    "\4\140\1\u0333\3\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0334\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\1\140\1\u0335\6\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0336\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0337\1\140\1\u0338\1\140"+
+    "\1\u0339\1\u033a\2\140\1\u033b\4\140\1\u033c\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u033d\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u033e\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u033f\2\140\1\u0340"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0341"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0342"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0343"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0344"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0345\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0346\1\u0347"+
+    "\4\140\1\u0348\1\140\1\u0349\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u034a\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u034b\1\u034c\1\u034d\1\u034e\1\u034f\1\u0329"+
+    "\2\140\1\u0350\1\u0351\1\140\1\u0352\1\140\1\u0353\1\u0354"+
+    "\5\140\1\131\2\0\1\140\2\0\1\u01ce\16\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0355\13\140\1\u0356\1\140\1\u0357\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u0358\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0359\16\140\1\u014c\4\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u02dd\10\140\1\u035a"+
+    "\3\140\1\131\2\0\1\u035b\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u035c"+
+    "\1\140\1\u035d\10\140\1\u035e\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u035f\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0360\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\21\140\1\u0361\2\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u0362\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u0363\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u0364\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0365\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u0366\1\u02d8\3\140\1\u0367\1\u0368"+
+    "\1\u0369\1\u036a\2\140\1\u036b\1\u036c\2\140\1\u036d\3\140"+
+    "\1\131\2\0\1\140\2\0\1\u036e\16\140\1\0\1\u036f"+
+    "\7\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0370\10\140\1\u0371\1\140\1\u0372\5\140\1\131\2\0"+
+    "\1\140\2\0\1\u0373\16\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u0319\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0374\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0375\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0376\4\140\1\u0377"+
+    "\14\140\1\131\2\0\1\140\2\0\1\u0378\16\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u0379\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u037a\1\u037b\1\140\1\u037c\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u037d\4\140\1\u037e\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u037f\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u0380\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\5\140\1\u0224\16\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0381\3\140\1\u0382"+
+    "\7\140\1\u0383\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\12\140\1\u02d2\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u0384\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u02f1\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u0385\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0386\1\140\1\u0387\1\140\1\u0388\4\140\1\u0389\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u038a\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u038b\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u038c\1\u038d"+
+    "\2\140\1\u038e\4\140\1\u038f\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0390\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0391\1\u0237\3\140\1\u01dd\1\u0392"+
+    "\1\140\1\u0393\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0394\3\140\1\u0395\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0396\10\140\1\u01b7\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0397\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u0398\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u0399\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u039a\1\140\1\u039b\6\140"+
+    "\1\u039c\1\140\1\u039d\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u039e\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u039f\2\140\1\u03a0\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u03a1\5\140\1\u03a2\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u03a3\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u03a4\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0325\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u03a5\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u03a6\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u03a7\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u03a8\22\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u03a9\3\140"+
+    "\1\u03aa\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u03ab\4\140\1\u01af\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u03ac\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u03ad\7\140\1\u03ae\2\140\1\u0319\1\140\1\u03af\6\140"+
+    "\1\131\2\0\1\u03b0\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u03b1\2\140"+
+    "\1\u03b2\4\140\1\u03b3\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u014c\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u03b4\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u03b5\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u03b6\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u03b7\3\140\1\u03b8\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\22\140\1\u03b9\1\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u03ba\3\140\1\u03bb\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u039a\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u03bc\4\140"+
+    "\1\u03bd\4\140\1\u03be\1\u03bf\1\u03c0\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u03c1\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u03c2\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u03c3\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\23\140\1\u03c4\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u035e\3\140\1\u03c5\3\140\1\131"+
+    "\2\0\1\140\2\0\16\140\1\u03c6\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u03c7\2\140"+
+    "\1\u03c8\4\140\1\u03c9\2\140\1\u03ca\1\140\1\u03cb\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0375\6\140"+
+    "\1\u03cc\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u03cd\1\u03ce\1\u0393\2\140\1\u03cf\1\u03d0\3\140\1\u03d1"+
+    "\3\140\1\u03d2\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\22\140\1\u03d3\1\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u03d4\1\140\1\u03d5\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u03d6\5\140\1\u039d\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u039f\1\u03d7\2\140"+
+    "\1\u03d8\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u03d9"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u03da\1\140\1\u03db\4\140\1\u03dc\4\140\1\u03dd\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u03de\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u03df\11\140"+
+    "\1\u03e0\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u03e1\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u03e2\3\140\1\u03e3\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u03e4\7\140\1\u03e5\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u03e6\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u02eb\4\140\1\u03e7\16\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u03df\3\140\1\u03e8"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u03e9"+
+    "\20\140\1\u03ea\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u03eb\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u03ec\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u03ed\3\140"+
+    "\1\u03ee\6\140\1\u03ef\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u03f0\1\u03f1\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u03f2\1\u03f3\4\140\1\u03f4\4\140"+
+    "\1\u0393\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u03f5\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u03f6\1\u03a2\12\140\1\131\2\0\1\140\2\0\1\u0224"+
+    "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u03f7\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u03a4\3\140\1\u03f8\1\u03f9\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\5\140\1\u03fa\16\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u03fb\22\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u03fc\15\140\1\u03fd"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u03fe"+
+    "\14\140\1\u03ff\1\131\2\0\1\u0400\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u0401\3\140\1\u0402\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u0403\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0404\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0405\1\140\1\u01dd\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0406\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0407\7\140\1\u0224"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0408"+
+    "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0409"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u040a"+
+    "\1\140\1\u040b\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u040c\1\140\1\u0400\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\23\140\1\u040d\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u040e\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u040f"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\4\140\1\u0410\3\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0411\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u0412\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0413\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\u0414\2\0\1\u014c\16\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0415\15\140\1\u0416\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0417\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\1\140\1\u0418\6\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0419\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u041a\1\u041b\12\140\1\u041c"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u041d"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u041e"+
+    "\1\140\1\u041f\6\140\1\u0420\1\140\1\u0421\4\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u02dd\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u015b\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u02f3\4\140\1\u0422\1\u02da\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0423\3\140\1\u0424\1\140"+
+    "\1\u0425\4\140\1\u0426\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u0427\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0428\1\u0429\1\140\1\u042a\1\u042b\1\140\1\u042c"+
+    "\4\140\1\u042d\2\140\1\u0379\1\140\1\u01cc\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u042e\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u035e\1\u042f\2\140"+
+    "\1\u0430\3\140\1\u0431\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\22\140\1\u0432\1\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0433\17\140\1\u0434\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u0435\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0436\1\u014c\3\140\1\u0437\2\140"+
+    "\1\u0438\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0439\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u043a\3\140\1\u043b\1\u043c\1\u043d\1\u043e\4\140\1\u043f"+
+    "\5\140\1\u0440\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0441\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0442\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0443"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0444\12\140\1\u0445\2\140\1\u0446\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u020f\6\140\1\u0447\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u020f\6\140"+
+    "\1\u01dd\3\140\1\u0448\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u0449\1\u01dd\7\140\1\u044a\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u044b\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u044c\1\u044d\2\140\1\u044e"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u044f\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0450\15\140"+
+    "\1\u0451\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0452"+
+    "\1\u0453\6\140\1\u0454\13\140\1\131\2\0\1\u0224\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u0455\2\140\1\u0456\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\1\u02dd\7\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0457\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0458\10\140\1\u0459"+
+    "\5\140\1\u045a\1\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u045b\2\140\1\u045c\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u045d\17\140\1\131\2\0\1\140"+
+    "\2\0\14\140\1\u045e\2\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u045f\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0460\13\140\1\u0379"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0461\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u02dd\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u0462\4\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0463\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0464\3\140"+
+    "\1\u0465\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u0466\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0467\3\140\1\u0468\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u039f\7\140\1\u0469\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u046a\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u046b\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u046c\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u046d\1\140\1\u046e\1\u046f"+
+    "\3\140\1\u0470\1\u0471\1\140\1\u0472\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0473\1\u0474\1\u01c5\5\140"+
+    "\1\u0352\1\140\1\u0353\1\u0475\5\140\1\131\2\0\1\140"+
+    "\2\0\1\u01ce\16\140\1\0\10\140\1\131\10\0\6\u0243"+
+    "\1\0\11\u0243\1\0\1\u0243\1\0\1\131\1\u0476\1\u0243"+
+    "\1\0\2\u0243\13\0\24\u0243\1\131\2\0\1\u0243\2\0"+
+    "\17\u0243\1\0\10\u0243\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0477\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0478\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u0479\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u047a\3\140\1\u047b\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u047c\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u047d\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u047e\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u047f\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\1\140\1\u0480\6\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u0481\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u0482\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0483\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0484\6\140\1\u0485\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u0486\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0487\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\1\u0488\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\22\140\1\u0489\1\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u01fb\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u048a\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u048b\13\140\1\u048c\1\140\1\u048d\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\11\0"+
+    "\6\u025a\1\0\11\u025a\1\0\1\u025a\5\0\2\u025a\13\0"+
+    "\24\u025a\3\0\1\u025a\2\0\17\u025a\1\0\10\u025a\11\0"+
+    "\1\u048e\53\0\1\u048e\62\0\6\u025e\1\0\13\u025e\5\0"+
+    "\2\u025e\1\0\1\u025e\11\0\24\u025e\3\0\1\u025e\2\0"+
+    "\17\u025e\1\0\10\u025e\62\0\1\u048f\1\u0490\14\0\1\u0491"+
+    "\121\0\1\u0492\143\0\1\u0493\137\0\1\u0494\3\0\1\u0495"+
+    "\116\0\1\u0496\12\0\1\u0497\140\0\1\u0498\121\0\1\u0499"+
+    "\5\0\1\u049a\143\0\1\u049b\137\0\1\u049c\124\0\1\u049d"+
+    "\10\0\1\u049e\135\0\1\u049f\124\0\1\u04a0\136\0\1\u04a1"+
+    "\72\0\6\u026c\1\0\13\u026c\5\0\2\u026c\1\0\1\u026c"+
+    "\11\0\24\u026c\3\0\1\u026c\2\0\17\u026c\1\0\10\u026c"+
+    "\71\0\1\u026d\142\0\1\u026d\6\0\1\u026d\111\0\1\u026d"+
+    "\12\0\1\u026d\11\0\1\u026d\127\0\1\u026d\126\0\1\u026d"+
+    "\7\0\1\u026d\136\0\1\u04a2\52\0\2\351\1\u04a3\3\351"+
+    "\1\0\10\351\2\0\1\351\5\0\2\351\13\0\3\351"+
+    "\1\u04a3\20\351\3\0\1\351\2\0\17\351\1\0\10\351"+
+    "\11\0\6\351\1\0\1\u04a4\7\351\2\0\1\351\5\0"+
+    "\2\351\13\0\17\351\1\u04a4\4\351\3\0\1\351\2\0"+
+    "\17\351\1\0\10\351\31\0\1\u04a5\174\0\1\u04a6\130\0"+
+    "\1\u027d\130\0\1\u04a7\151\0\1\u04a8\113\0\1\u04a9\73\0"+
+    "\2\54\1\0\1\54\1\0\2\54\2\0\6\54\1\0"+
+    "\26\54\1\0\20\54\1\u04aa\16\54\1\0\30\54\2\64"+
+    "\1\0\1\64\1\0\2\64\2\0\3\64\1\u04ab\2\64"+
+    "\1\0\26\64\1\0\6\64\1\u04ab\30\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\1\64\1\u029b\4\64"+
+    "\1\0\26\64\1\0\22\64\1\111\1\u029b\13\64\1\0"+
+    "\3\64\1\111\26\64\1\0\1\64\1\0\2\64\2\0"+
+    "\3\64\1\u04ac\2\64\1\0\26\64\1\0\6\64\1\u04ac"+
+    "\12\64\1\u04ad\15\64\1\0\2\64\1\u04ad\27\64\1\0"+
+    "\1\64\1\0\2\64\2\0\5\64\1\u04ae\1\0\26\64"+
+    "\1\0\10\64\1\u04ae\26\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\26\64\1\0\30\64"+
+    "\1\u029b\6\64\1\0\12\64\1\u029b\17\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\2\64\1\u04af\23\64"+
+    "\1\0\12\64\1\u04af\24\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\4\64\1\111\1\64\1\0\26\64"+
+    "\1\0\17\64\1\111\17\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\2\64\1\u04b0\3\64\1\0\26\64"+
+    "\1\0\11\64\1\u04b0\25\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\1\64\1\u02b1\24\64"+
+    "\1\0\15\64\1\u02b1\21\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\2\64\1\111\23\64"+
+    "\1\0\12\64\1\111\24\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\5\64\1\u029b\1\0\26\64\1\0"+
+    "\10\64\1\u029b\26\64\1\0\32\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\26\64\1\0\30\64\1\u04b1"+
+    "\6\64\1\0\12\64\1\u04b1\17\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\26\64\1\0\7\64\1\u04b2"+
+    "\27\64\1\0\7\64\1\u04b2\22\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\26\64\1\0\26\64\1\u04b3"+
+    "\10\64\1\0\4\64\1\u04b3\25\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\26\64\1\0\22\64\1\u04b4"+
+    "\14\64\1\0\3\64\1\u04b4\26\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\1\u029b\25\64\1\0\25\64"+
+    "\1\u029b\11\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+    "\2\0\6\64\1\0\26\64\1\0\14\64\1\u04b5\22\64"+
+    "\1\0\1\64\1\u04b5\30\64\1\0\1\64\1\0\2\64"+
+    "\2\0\6\64\1\0\12\64\1\u02a9\13\64\1\0\37\64"+
+    "\1\0\6\64\1\u02a9\23\64\1\0\1\64\1\0\2\64"+
+    "\2\0\6\64\1\0\26\64\1\0\7\64\1\u02b0\27\64"+
+    "\1\0\7\64\1\u02b0\22\64\1\0\1\64\1\0\2\64"+
+    "\2\0\3\64\1\u04b6\2\64\1\0\26\64\1\0\6\64"+
+    "\1\u04b6\30\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+    "\2\0\6\64\1\0\26\64\1\0\14\64\1\u02a8\22\64"+
+    "\1\0\1\64\1\u02a8\30\64\1\0\1\64\1\0\2\64"+
+    "\2\0\5\64\1\u04b7\1\0\26\64\1\0\10\64\1\u04b7"+
+    "\26\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\26\64\1\0\21\64\1\u02a9\15\64\1\0"+
+    "\2\64\1\u02a9\27\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\26\64\1\0\14\64\1\u0133\22\64\1\0"+
+    "\1\64\1\u0133\30\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\26\64\1\0\27\64\1\111\7\64\1\0"+
+    "\10\64\1\111\21\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\2\64\1\u04b8\23\64\1\0\12\64\1\u04b8"+
+    "\24\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\2\64\1\u0135\23\64\1\0\12\64\1\u0135"+
+    "\24\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\2\64\1\u02b1\23\64\1\0\12\64\1\u02b1"+
+    "\24\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\2\64\1\u0133\23\64\1\0\12\64\1\u0133"+
+    "\24\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\26\64\1\0\22\64\1\u04b9\14\64\1\0"+
+    "\3\64\1\u04b9\26\64\1\0\1\64\1\0\2\64\2\0"+
+    "\1\64\1\u04ba\4\64\1\0\26\64\1\0\23\64\1\u04ba"+
+    "\13\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+    "\5\64\1\u04bb\1\0\26\64\1\0\10\64\1\u04bb\26\64"+
+    "\1\0\32\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+    "\1\0\26\64\1\0\21\64\1\u04bc\15\64\1\0\2\64"+
+    "\1\u04bc\27\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+    "\1\0\2\64\1\u04bd\23\64\1\0\12\64\1\u04bd\24\64"+
+    "\1\0\32\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+    "\1\0\1\111\25\64\1\0\25\64\1\111\11\64\1\0"+
+    "\32\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\26\64\1\0\26\64\1\u04be\10\64\1\0\4\64\1\u04be"+
+    "\25\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\1\64\1\u04bf\24\64\1\0\15\64\1\u04bf\21\64\1\0"+
+    "\32\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\12\64\1\u04c0\13\64\1\0\37\64\1\0\6\64\1\u04c0"+
+    "\23\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\26\64\1\0\26\64\1\111\10\64\1\0\4\64\1\111"+
+    "\25\64\1\0\1\64\1\0\2\64\2\0\5\64\1\111"+
+    "\1\0\26\64\1\0\10\64\1\111\26\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\24\64\1\u028a\12\64\1\0\5\64\1\u028a\24\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\21\64\1\u04c1\15\64\1\0\2\64\1\u04c1\27\64"+
+    "\1\0\1\64\1\0\2\64\2\0\3\64\1\u04c2\2\64"+
+    "\1\0\26\64\1\0\6\64\1\u04c2\30\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\14\64\1\111\22\64\1\0\1\64\1\111\30\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\1\64"+
+    "\1\u04c3\24\64\1\0\15\64\1\u04c3\21\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\3\64\1\u0118\2\64"+
+    "\1\0\26\64\1\0\6\64\1\u0118\30\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\2\64\1\u04c4\3\64"+
+    "\1\0\26\64\1\0\11\64\1\u04c4\25\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\24\64\1\u04c5\12\64\1\0\5\64\1\u04c5\24\64"+
+    "\1\0\1\64\1\0\2\64\2\0\3\64\1\u04bb\2\64"+
+    "\1\0\26\64\1\0\6\64\1\u04bb\1\u04b2\27\64\1\0"+
+    "\7\64\1\u04b2\22\64\1\0\1\64\1\0\2\64\2\0"+
+    "\4\64\1\u0292\1\64\1\0\26\64\1\0\17\64\1\u0292"+
+    "\17\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+    "\1\64\1\363\4\64\1\0\26\64\1\0\23\64\1\363"+
+    "\13\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\26\64\1\0\26\64\1\u04c6\10\64\1\0"+
+    "\4\64\1\u04c6\25\64\1\0\1\64\1\0\2\64\2\0"+
+    "\2\64\1\u04c7\3\64\1\0\26\64\1\0\11\64\1\u04c7"+
+    "\25\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\1\64\1\u04c8\24\64\1\0\15\64\1\u04c8"+
+    "\21\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\26\64\1\0\14\64\1\u04c9\22\64\1\0"+
+    "\1\64\1\u04c9\30\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\26\64\1\0\14\64\1\u04ca\22\64\1\0"+
+    "\1\64\1\u04ca\30\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\2\64\1\u0135\23\64\1\0\12\64\1\u0135"+
+    "\1\64\1\111\22\64\1\0\1\64\1\111\30\64\1\0"+
+    "\1\64\1\0\2\64\2\0\6\64\1\0\12\64\1\111"+
+    "\13\64\1\0\37\64\1\0\6\64\1\111\23\64\1\0"+
+    "\1\64\1\0\2\64\2\0\5\64\1\u04cb\1\0\26\64"+
+    "\1\0\10\64\1\u04cb\26\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\26\64\1\0\27\64"+
+    "\1\111\7\64\1\0\10\64\1\111\1\u04cc\6\64\1\u04cc"+
+    "\11\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\26\64\1\0\7\64\1\u04cd\27\64\1\0\7\64\1\u04cd"+
+    "\22\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\2\64\1\u0118\23\64\1\0\12\64\1\u0118\24\64\1\0"+
+    "\30\64\67\0\1\u04ce\61\0\1\u04cf\57\0\1\u04cf\133\0"+
+    "\1\u04d0\124\0\2\u02c4\16\0\1\u02c4\51\0\1\u04d1\126\0"+
+    "\1\131\10\0\1\131\1\u04d2\4\131\1\0\2\131\1\u04d2"+
+    "\1\131\4\u04d2\1\131\1\0\1\131\1\0\3\131\1\0"+
+    "\1\131\1\u04d2\13\0\4\131\3\u04d2\6\131\2\u04d2\4\131"+
+    "\1\u04d2\1\131\2\0\1\131\2\0\1\131\1\u04d2\3\131"+
+    "\1\u04d2\6\131\1\u04d2\2\131\1\0\1\131\3\u04d2\1\131"+
+    "\3\u04d2\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u04d3"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\u0143\10\0\6\u0143\1\0\4\u0143\2\u02c8\1\u0143\1\u02c8"+
+    "\1\u0143\1\0\1\u0143\1\0\3\u0143\1\0\1\u0143\1\u0146"+
+    "\13\0\5\u0143\1\u0146\10\u0143\1\u0146\6\u0143\2\0\1\u0143"+
+    "\2\0\5\u0143\1\u0146\6\u0143\1\u02c8\2\u0143\1\0\1\u0143"+
+    "\3\u02c8\1\u0143\3\u02c8\24\0\2\u02c8\1\0\1\u02c8\73\0"+
+    "\1\u02c8\4\0\3\u02c8\1\0\3\u02c8\1\u0143\10\0\1\u0143"+
+    "\1\u02cb\4\u0143\1\0\1\u0143\1\u02ca\1\u02cb\1\u0143\4\u02cb"+
+    "\1\u0143\1\0\1\u0143\1\0\3\u0143\1\0\1\u0143\1\u02cb"+
+    "\13\0\4\u0143\3\u02cb\1\u02ca\5\u0143\2\u02cb\4\u0143\1\u02cb"+
+    "\1\u0143\2\0\1\u0143\2\0\1\u0143\1\u02cb\3\u0143\1\u02cb"+
+    "\6\u0143\1\u02cb\2\u0143\1\0\1\u0143\3\u02cb\1\u0143\3\u02cb"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0157"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u04d4\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u04d5\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u04d6\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u04d7\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u04d8\3\140"+
+    "\1\u04d9\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u014c\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u04da\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u04db\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u014c\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u04dc\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u04dd\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u04de"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u04df\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u014c\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u01aa\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u014c\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0224\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u04e0\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u04d9\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u04e1\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u04e2\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u02d3\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u04e3\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u04e4\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u04e5\22\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u015f\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u04e6\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u04e3\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u04e7\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u02f3\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u04e6\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u04e8\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u04e9\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u04ea\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u04eb\2\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u014c\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u04ec\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u02ff\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u02d5\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u04e5\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u04ed\5\140\1\u03b7"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u04ee"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u04ef"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u04f0\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u04f1\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u04f2\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u04f3\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u04f4\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u04e5\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u014c\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u02da\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\12\0\1\u04f5\7\0"+
+    "\1\u04f5\1\0\4\u04f5\11\0\1\u04f5\17\0\3\u04f5\6\0"+
+    "\2\u04f5\4\0\1\u04f5\7\0\1\u04f5\3\0\1\u04f5\6\0"+
+    "\1\u04f5\4\0\3\u04f5\1\0\3\u04f5\12\0\1\u04f6\7\0"+
+    "\1\u04f6\1\0\4\u04f6\11\0\1\u04f6\17\0\3\u04f6\6\0"+
+    "\2\u04f6\4\0\1\u04f6\7\0\1\u04f6\3\0\1\u04f6\6\0"+
+    "\1\u04f6\4\0\3\u04f6\1\0\3\u04f6\12\0\1\u04f7\57\0"+
+    "\1\u04f7\125\0\1\u0305\130\0\1\u04f8\151\0\1\u04f9\113\0"+
+    "\1\u04fa\105\0\1\u04fb\57\0\1\u04fb\125\0\1\u030a\130\0"+
+    "\1\u04fc\151\0\1\u04fd\113\0\1\u04fe\73\0\1\131\10\0"+
+    "\6\140\1\0\1\140\1\u04ff\7\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\3\140\1\u0500\2\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\6\140\1\u0501\10\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0502"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0503"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0237"+
+    "\4\140\1\u0504\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\1\140\1\u0505\15\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\2\140\1\u0506"+
+    "\6\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\3\140\1\u0507\2\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\7\140"+
+    "\1\u0508\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0509\11\140\1\u050a\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u050b\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u050c\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u03d4\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u03df\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\u050d\2\0\17\140"+
+    "\1\0\1\u050e\7\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u050f\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0510\12\140\1\u0511\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0512\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0511\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0513\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0514\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0393\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0515\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0516\14\140\1\u0224\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u0517\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0518\2\140\1\u0519\1\u0328\1\u051a"+
+    "\1\u051b\1\u051c\1\u051d\2\140\1\u051e\1\u051f\1\u0520\1\u0521"+
+    "\4\140\1\u0522\1\131\2\0\1\140\2\0\1\u0523\16\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u0224\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0524\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0525\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\u0526\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0355\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0527\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0528\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0529\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u03b7\1\140\1\u052a"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0527"+
+    "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u03b0"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u052b"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u052c\12\140"+
+    "\1\u03df\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+    "\1\u032e\5\140\1\u02dd\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u052d\6\140\1\u052e\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u052f\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0530\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0531\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0532\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0533\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0224\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0534\15\140\1\u0159"+
+    "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0535"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0224"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u04d7"+
+    "\1\140\1\u0536\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0537\3\140\1\u0538\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u0539\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u053a\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u053b\7\140\1\u053c\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u053d\3\140\1\u053e"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u053f"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0540"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0541\1\0\1\u0542"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0543"+
+    "\1\u0544\1\u0545\1\u0546\1\u0547\1\u0548\1\u0549\1\u054a\1\u054b"+
+    "\1\u054c\1\u054d\1\u054e\1\u054f\1\u0550\1\u0551\1\140\1\u0552"+
+    "\1\140\1\u0553\1\u0554\1\131\2\0\1\140\2\0\1\u0555"+
+    "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\23\140\1\u0556\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0557\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0558\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0559\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u052f"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u055a"+
+    "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u055b"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u055c"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u055d"+
+    "\17\140\1\131\2\0\1\140\2\0\16\140\1\u055e\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0237\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u055f\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u01b7\1\u0560\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u039b\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u0561\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u03a0\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u03a2\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u03a4\3\140\1\u0562\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u055c\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0363\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\17\140\1\u0563\4\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0564\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u04da\7\140\1\u0565\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u0566\16\140\1\u0224"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0567"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0568"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0569"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u056a"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0224"+
+    "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u056b"+
+    "\6\140\1\u016c\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u037e\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u056c\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\1\u056d\16\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0224\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+    "\1\u0329\16\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u056e"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u056f\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0570\1\u0571"+
+    "\5\140\1\u0572\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u0573\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u0574\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0575\1\140\1\u03df\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0576\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0577\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0578\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0579\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u057a\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u057b\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u057c\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0363"+
+    "\14\140\1\u0224\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\1\140"+
+    "\1\u057d\6\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u057e\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u057f\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0325\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0580\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0581\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0582\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u052c\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u0583\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u0584\22\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u0363\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0585\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0586\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0587\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0588\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\23\140\1\u0589\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u058a\4\140\1\u058b\2\140\1\u058c\5\140"+
+    "\1\u058d\5\140\1\131\2\0\1\140\2\0\1\u058e\16\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u058f\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u0590\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0591\2\140\1\u0592\16\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0593\1\u0594\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0595\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0596\3\140\1\u0319\4\140"+
+    "\1\u0597\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u0598\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u0599\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u059a\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u059b\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u059c\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u02f1\7\140\1\u0224\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u059d\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u059e\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u059f\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u0224"+
+    "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u05a0"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u05a1\1\140"+
+    "\1\u0325\5\140\1\u05a2\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u05a3\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u0398\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u037e\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u05a4\4\140\1\u052c\1\140\1\u0393\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u03df\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0393\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u05a5\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u05a6\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u05a7\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u05a8\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u03f4\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u05a9\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u048a\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u05aa\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u037c\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\1\u05ab\7\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u052f\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u05ac\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u05ad\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u05ae\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u05af\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u05b0\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u048a\22\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u035e\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u05b1\3\140\1\u05b2\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u05b3\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u02dd\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u05b4\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u05b5\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u05b6"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u035e\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u05b7\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u05b8\1\u05b9\1\u05ba\1\140\1\u05bb\4\140\1\u05bc"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u014c"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u05bd"+
+    "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u05be"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u05bf"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u05c0"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\6\140\1\u05c1\1\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u05c2"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u05c3"+
+    "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u05c4"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u05c5"+
+    "\12\140\1\u0224\2\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u05c6"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u05c7\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u05c8\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u05c9"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u05ca\10\140"+
+    "\1\u05cb\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u05cc\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u05cd\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u05ce\1\140\1\u05cf\1\u05d0\1\u05d1\1\u055a\1\140\1\u03a2"+
+    "\1\u05d2\1\u05d3\2\140\1\u05d4\1\u05d5\4\140\1\u0159\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u05d6\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u05d7\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\1\140\1\u05d8\4\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u05d9\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u05da\1\140"+
+    "\1\u05db\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u05dc\1\0"+
+    "\1\u0527\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u05dd\1\140\1\u05de\1\u05df\1\140\1\u05e0\1\u05e1\1\u05e2"+
+    "\1\u05e3\1\u05e4\1\u05e5\1\u05e6\1\u0569\1\u05e7\1\u05e8\1\140"+
+    "\1\u05e9\2\140\1\u05ea\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u05eb\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u05ec\1\u014c\16\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u05ed\1\140\1\u05ee\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u05ef\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u05f0\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u05c2\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0527\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\22\140\1\u05f1\1\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u05f2\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u05f3\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u05f4"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u05f5\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\5\140\1\u05f6\16\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u05f7\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\6\140"+
+    "\1\u045e\1\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\1\u05f8\16\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u05f9\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u05fa\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u05fb\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0224\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\21\140\1\u05fc\2\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u05fd\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u05fe\4\140\1\u01b2\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u05ff\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0600\4\140\1\u0601\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u032b\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\1\u0602\16\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0603\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u0604\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0605\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0606\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0607\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0608\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u0224\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u0609\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u060a\1\u060b\1\u060c\1\u060d\1\u060e"+
+    "\1\u060f\1\u0610\1\u0611\1\u0612\1\u0613\1\u0614\1\u0615\1\u0616"+
+    "\1\u0617\1\u0618\1\140\1\u0619\1\140\1\u0553\1\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\1\u061a\7\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u061b\5\140"+
+    "\1\u04e8\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u061c\3\140\1\u061d\3\140\1\u061e\10\140\1\u061f\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u04e9\12\140"+
+    "\1\u0620\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u039c\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0621\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+    "\1\u0345\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0622\3\140\1\u0623\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0624\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0625\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0557\14\140\1\u0626\4\140\1\u0553\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0627\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\1\140\1\u0628\6\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0629\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u062a\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u062b\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u062c\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u062d\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u062e\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u062f\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0630\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u0631\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0632\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\5\140\1\u0633\1\u0634\1\140"+
+    "\1\u0635\3\140\1\u0326\1\u0636\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u0355\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u03df\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0637\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0638\1\u0639\1\140\1\u063a\1\u063b\1\u063c"+
+    "\1\u063d\1\140\1\u063e\1\u063f\1\140\1\u0640\1\u0641\1\u0642"+
+    "\1\u0643\1\140\1\u0644\3\140\1\131\2\0\1\140\2\0"+
+    "\1\u0645\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u0646\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u0647\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0648\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0649\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u064a\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u064b\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u064c\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u064d\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u064e\2\140\1\u064f\1\u0650\1\u0651\1\140\1\u0652\1\u0653"+
+    "\1\u0654\2\140\1\u0655\1\u0656\1\u0657\4\140\1\u0658\1\131"+
+    "\2\0\1\140\2\0\1\u0659\16\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u065a\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u065b\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u065c\1\u065d\1\u065e"+
+    "\1\140\1\u065f\1\u01c5\1\140\1\u0660\1\u0661\4\140\1\u0662"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0663"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0664"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0665\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+    "\1\u0666\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0667"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0668"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u01af"+
+    "\4\140\1\u0669\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u066a\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u066b\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\23\140\1\u052c\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u066c\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u066d\1\140\1\u066e\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u05eb\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u066f\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0670\3\140\1\u0671\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0672\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0673\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\5\140\1\u0674\2\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u03df\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0675\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0676\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0677\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0678\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u0679\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u067a\3\140\1\u067b"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u067c"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u067d"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0527"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0403"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u067e"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u067f"+
+    "\10\140\1\u0680\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u0224\12\140\1\131\2\0\1\140\2\0\1\u048a"+
+    "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0681\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\17\140\1\u0224\4\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0682\5\140\1\u0683\3\140\1\u0684\5\140"+
+    "\1\u0685\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u0593\6\140\1\u0686\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0687\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u0688\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0689\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u068a\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0382\12\140\1\u068b\2\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u068c\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\1\u068d\16\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\1\140\1\u068e"+
+    "\6\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u068f"+
+    "\5\140\1\u04ee\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u0690\22\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0691\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u0692\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0537\3\140\1\u0693\2\140\1\u0694\1\u0695\7\140"+
+    "\1\u0256\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0696\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0697\1\140\1\u0698"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u05da"+
+    "\4\140\1\u0699\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\23\140\1\u069a\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u069b\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u069c"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u05de\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u069d\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\u069e\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u069f\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u020f\22\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u06a0\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u060a\2\140\1\u06a1\1\u06a2"+
+    "\1\u06a3\5\140\1\u0352\1\u06a4\1\u01cb\1\u06a5\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u06a6\2\140\1\u06a7"+
+    "\1\u031f\1\u0237\5\140\1\u0326\1\u039a\1\140\1\u06a8\1\u06a9"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u06aa"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u06ab"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u06ac"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u06ad"+
+    "\1\140\1\u06ae\4\140\1\u06af\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u06b0\3\140\1\u06b1\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u06b2\1\140\1\u06b3"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0224"+
+    "\4\140\1\u0224\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u06b4\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u06b5\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u06b6\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u06b7"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u06b8"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u06b9"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u06ba"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u06bb"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u06bc"+
+    "\4\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u06bd"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u06be"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0364\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\1\u06bf\7\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u06c0\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u06c1\1\u06c2\1\140\1\u06c3\1\u06c4"+
+    "\2\140\1\u06c5\1\u06c6\1\u06c7\1\u06c8\1\u06c9\1\140\1\u06ca"+
+    "\1\u06cb\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u06cc\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u06cd"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u06ce"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u06cf"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u039f"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u06d0\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u06d1"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u06d2\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u06d3\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u06d4\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u06d5\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\1\140\1\u06d6"+
+    "\6\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u06d7"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u06d8"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0325"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u06d9\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u06da"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\1\u0319"+
+    "\7\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u06db\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u06dc\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u06dd"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u02dd\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0325"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u06de"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u06df"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u055b"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\131\1\0\11\131\1\0\1\u06e0\1\0"+
+    "\3\131\1\0\2\131\13\0\25\131\2\0\1\131\2\0"+
+    "\17\131\1\0\11\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u06e1\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u06e2\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u06e3"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u06e4\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u06e5\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u06e6\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u06e7\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u06e8\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u06e9\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u06ea\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\u06eb\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u06ec\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u06ed"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u06ee\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+    "\1\u06ef\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u042f"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u06f0"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u06f1"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u06f2\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u06f3\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u06f4\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0224\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u06f5\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u06f6\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u06f7\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\16\0\1\u06f8"+
+    "\40\0\1\u06f8\134\0\1\u06f9\143\0\1\u06fa\135\0\1\u06fb"+
+    "\135\0\1\u06fc\146\0\1\u049e\131\0\1\u06fd\141\0\1\u06fe"+
+    "\130\0\1\u06ff\150\0\1\u0700\123\0\1\u0701\150\0\1\u0702"+
+    "\132\0\1\u0703\3\0\1\u0704\144\0\1\u0705\123\0\1\u0706"+
+    "\141\0\1\u0707\126\0\1\u0708\140\0\1\u0709\142\0\1\u0494"+
+    "\136\0\1\u070a\137\0\1\u070b\61\0\3\351\1\u070c\2\351"+
+    "\1\0\10\351\2\0\1\351\5\0\2\351\13\0\1\u070c"+
+    "\23\351\3\0\1\351\2\0\17\351\1\0\10\351\11\0"+
+    "\6\351\1\0\1\351\1\u070d\6\351\2\0\1\351\5\0"+
+    "\2\351\13\0\7\351\1\u070d\14\351\3\0\1\351\2\0"+
+    "\17\351\1\0\10\351\66\0\1\u070e\60\0\1\u070f\201\0"+
+    "\1\u04a7\11\0\1\u027d\56\0\2\u0710\1\0\7\u04a9\1\0"+
+    "\10\u04a9\2\u0710\1\u04a9\1\0\1\u0710\1\0\1\u04a9\1\u0710"+
+    "\2\u04a9\2\u0710\1\0\2\u0710\1\0\5\u0710\24\u04a9\3\u0710"+
+    "\1\u04a9\2\u0710\17\u04a9\1\0\10\u04a9\2\54\1\0\1\54"+
+    "\1\0\2\54\2\0\6\54\1\0\26\54\1\0\17\54"+
+    "\1\u0711\17\54\1\0\30\54\2\64\1\0\1\64\1\0"+
+    "\2\64\2\0\4\64\1\u02a9\1\64\1\0\26\64\1\0"+
+    "\17\64\1\u02a9\17\64\1\0\32\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\26\64\1\0\27\64\1\u028a"+
+    "\7\64\1\0\10\64\1\u028a\21\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\26\64\1\0\22\64\1\u0104"+
+    "\14\64\1\0\3\64\1\u0104\26\64\1\0\1\64\1\0"+
+    "\2\64\2\0\3\64\1\u04bb\2\64\1\0\26\64\1\0"+
+    "\6\64\1\u04bb\30\64\1\0\32\64\1\0\1\64\1\0"+
+    "\2\64\2\0\1\64\1\u02a9\4\64\1\0\26\64\1\0"+
+    "\23\64\1\u02a9\13\64\1\0\32\64\1\0\1\64\1\0"+
+    "\2\64\2\0\1\64\1\u028a\4\64\1\0\26\64\1\0"+
+    "\23\64\1\u028a\13\64\1\0\32\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\26\64\1\0\14\64\1\u0712"+
+    "\22\64\1\0\1\64\1\u0712\30\64\1\0\1\64\1\0"+
+    "\2\64\2\0\2\64\1\u0713\3\64\1\0\26\64\1\0"+
+    "\11\64\1\u0713\25\64\1\0\32\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\2\64\1\u0714\23\64\1\0"+
+    "\12\64\1\u0714\1\64\1\u04b8\22\64\1\0\1\64\1\u04b8"+
+    "\30\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\26\64\1\0\24\64\1\u0715\12\64\1\0\5\64\1\u0715"+
+    "\24\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\26\64\1\0\26\64\1\u028a\10\64\1\0\4\64\1\u028a"+
+    "\25\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\26\64\1\0\22\64\1\u0716\14\64\1\0\3\64\1\u0716"+
+    "\26\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\26\64\1\0\14\64\1\u0717\22\64\1\0\1\64\1\u0717"+
+    "\30\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\26\64\1\0\22\64\1\u0133\14\64\1\0\3\64\1\u0133"+
+    "\26\64\1\0\1\64\1\0\2\64\2\0\5\64\1\u0718"+
+    "\1\0\26\64\1\0\10\64\1\u0718\26\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\27\64\1\u0719\7\64\1\0\10\64\1\u0719\21\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\21\64\1\u012d\15\64\1\0\2\64\1\u012d\27\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\12\64"+
+    "\1\u04b8\13\64\1\0\37\64\1\0\6\64\1\u04b8\23\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\21\64"+
+    "\1\u071a\4\64\1\0\13\64\1\u071a\23\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\2\64"+
+    "\1\u071b\23\64\1\0\12\64\1\u071b\24\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\24\64\1\u071c\12\64\1\0\5\64\1\u071c\24\64"+
+    "\1\0\1\64\1\0\2\64\2\0\2\64\1\u028a\3\64"+
+    "\1\0\26\64\1\0\11\64\1\u028a\25\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\22\64\1\u071d\14\64\1\0\3\64\1\u071d\26\64"+
+    "\1\0\1\64\1\0\2\64\2\0\1\64\1\377\4\64"+
+    "\1\0\26\64\1\0\23\64\1\377\13\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\2\64"+
+    "\1\u02a9\23\64\1\0\12\64\1\u02a9\24\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\2\64"+
+    "\1\u071e\23\64\1\0\12\64\1\u071e\24\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\14\64\1\u071f\22\64\1\0\1\64\1\u071f\30\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\21\64\1\u0104\15\64\1\0\2\64\1\u0104\27\64"+
+    "\1\0\1\64\1\0\2\64\2\0\3\64\1\u0720\2\64"+
+    "\1\0\26\64\1\0\6\64\1\u0720\30\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\5\64\1\u0721\1\0"+
+    "\1\64\1\u0722\24\64\1\0\7\64\1\u0723\1\u0721\4\64"+
+    "\1\u0722\21\64\1\0\7\64\1\u0723\22\64\1\0\1\64"+
+    "\1\0\2\64\2\0\3\64\1\u0724\2\64\1\0\26\64"+
+    "\1\0\6\64\1\u0724\30\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\12\64\1\u0725\13\64"+
+    "\1\0\37\64\1\0\6\64\1\u0725\23\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\2\64\1\u012d\23\64"+
+    "\1\0\12\64\1\u012d\24\64\1\0\30\64\66\0\1\u0726"+
+    "\63\0\1\u0727\44\0\1\u0727\144\0\1\u0728\50\0\1\131"+
+    "\10\0\1\131\1\u0729\4\131\1\0\2\131\1\u0729\1\131"+
+    "\4\u0729\1\131\1\0\1\131\1\0\3\131\1\0\1\131"+
+    "\1\u0729\13\0\4\131\3\u0729\6\131\2\u0729\4\131\1\u0729"+
+    "\1\131\2\0\1\131\2\0\1\131\1\u0729\3\131\1\u0729"+
+    "\6\131\1\u0729\2\131\1\0\1\131\3\u0729\1\131\3\u0729"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u072a"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u03a6"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\3\140\1\u0224\13\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u072b"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u072c"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u072d"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u03b7"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u072e"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\1\u072f\16\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u058a\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0730\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0731\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0732\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0733\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u04e5\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0734\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0735\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\12\140\1\u0736\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u04ef\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0737\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0738\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0739\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\22\140\1\u02da\1\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u073a\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u073b\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u02da\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u073c\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u02fe\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0179\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\21\140\1\u014c\2\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u073d\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\13\0\1\u073e\44\0\1\u073e\66\0"+
+    "\1\u073f\201\0\1\u04f8\11\0\1\u0305\56\0\2\u0740\1\0"+
+    "\7\u04fa\1\0\10\u04fa\2\u0740\1\u04fa\1\0\1\u0740\1\0"+
+    "\1\u04fa\1\u0740\2\u04fa\2\u0740\1\0\2\u0740\1\0\5\u0740"+
+    "\24\u04fa\3\u0740\1\u04fa\2\u0740\17\u04fa\1\0\10\u04fa\13\0"+
+    "\1\u0741\44\0\1\u0741\66\0\1\u0742\201\0\1\u04fc\11\0"+
+    "\1\u030a\56\0\2\u0743\1\0\7\u04fe\1\0\10\u04fe\2\u0743"+
+    "\1\u04fe\1\0\1\u0743\1\0\1\u04fe\1\u0743\2\u04fe\2\u0743"+
+    "\1\0\2\u0743\1\0\5\u0743\24\u04fe\3\u0743\1\u04fe\2\u0743"+
+    "\17\u04fe\1\0\10\u04fe\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\1\140\1\u0744"+
+    "\15\140\1\0\10\140\1\131\10\0\6\140\1\0\1\140"+
+    "\1\u0745\7\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\3\140\1\u0746"+
+    "\13\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0747\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0748\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0749\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\4\140\1\u074a"+
+    "\12\140\1\0\10\140\1\131\10\0\5\140\1\u074b\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\2\140\1\u074c\3\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0316"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0560\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0560\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u074d\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u074e\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0449\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u074f\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0325\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u0750\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0751\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u0393\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u014c\1\u03ce\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u06a0\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0752\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0753\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u0754\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u0755\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u0756\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0757\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0758\6\140\1\u0759\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u075a\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0528\12\140\1\u075b\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u075c\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u075d\10\140\1\u075e\1\140\1\u075f"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u0760"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0761\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u048a\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0762\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u052c\12\140\1\u0763"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0764"+
+    "\3\140\1\u0765\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0766\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\u03df\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0767"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0768"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0224"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0";
+
+  private static final String ZZ_TRANS_PACKED_1 =
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0393"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0769"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u076a"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u076b"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0224"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u076c\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u076d\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0363\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u076e\4\140\1\u076f"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u075b"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0770"+
+    "\1\140\1\u0771\2\140\1\u0772\1\140\1\u056a\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0773\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u0774\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0775\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u076b\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u0776\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\22\140\1\u0777\1\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0778\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0779\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u077a\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u072d\6\140\1\u077b\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u077c\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u077d\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u077e\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u077f\2\140\1\u0780\1\u0781\1\140\1\u0782"+
+    "\1\u0783\1\u0784\1\u0785\1\u0786\1\u0787\1\u0788\1\u0789\1\u078a"+
+    "\1\140\1\u078b\2\140\1\u078c\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u078d\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u078e\11\140\1\u078f\3\140\1\u0790\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0791\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0792\3\140\1\u0524"+
+    "\12\140\1\u01aa\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u0793\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u0794\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0795\4\140\1\u06dd\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0796\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0797\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0798\4\140\1\u0799\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u079a\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u079b\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u079c\1\140\1\u079d\1\140\1\u079e"+
+    "\5\140\1\u079f\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u07a0\1\u07a1\1\140\1\u07a2\4\140\1\u07a3\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u07a4\6\140"+
+    "\1\u07a5\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u03df\12\140\1\131\2\0\1\140\2\0\1\u07a6\16\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u07a7\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0460\1\u07a8\6\140\1\u07a9\11\140\1\131\2\0"+
+    "\1\140\2\0\1\u0325\16\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u07aa\1\140\1\u052f"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0460"+
+    "\1\140\1\u07ab\12\140\1\u07ac\4\140\1\131\2\0\1\u07ad"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u07ae\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u07af\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u07b0\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u07b1\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u07b2\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u07b3"+
+    "\1\u07b4\1\140\1\u07b5\1\140\1\u0593\1\u07b6\1\u07b7\1\u07b8"+
+    "\1\u07b9\1\u07ba\1\u052c\1\u07bb\1\u07bc\1\u07bd\1\140\1\u0472"+
+    "\3\140\1\131\2\0\1\u07be\2\0\17\140\1\0\4\140"+
+    "\1\u07bf\3\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0460\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u07c0\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\5\140\1\u07c1\16\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u07c2\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\1\u01ce\16\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0325\15\140\1\131\2\0\1\140\2\0\1\u07c3\16\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u0596\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u07c4\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u07c5\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u07c6"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u07c7\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0348"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u07c8"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u07c9"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u07ca"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u06c0"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u03df"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u07cb"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u07cc"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u07cd"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0224"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u07ce"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u07cf\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u07d0\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u048a\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u07d1\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u07d2\3\140\1\u0329\1\140\1\u07d3\6\140\1\u0379"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\u07d4\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u07d5\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u07d6\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u07d7\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u07d8\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u07d9\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\22\140\1\u07da\1\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u07db\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u07dc\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u07dd\2\140\1\u0449\3\140"+
+    "\1\u0352\1\140\1\u01cb\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u07bb\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u018c\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u07de\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\1\u07df\7\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u05fe\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\23\140\1\u031e\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u07e0\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u07e1\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u07e2\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u07e3\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u07e4\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u058a\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u07e5\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u07e6\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u07e7\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\5\140\1\u014c\16\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u07e8\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\1\u0167\16\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u07e9\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+    "\1\u0179\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+    "\1\u014c\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u07ea"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u07eb\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0695\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u07ec\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u052f\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u077b\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\6\140\1\u0224\1\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u07ed\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u07ee\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u07ef\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u07f0\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u07f1\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u07f2\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u07f3\1\u0544\1\u05de"+
+    "\3\140\1\u055a\1\140\1\u07f4\1\u07f5\1\140\1\u07f6\1\140"+
+    "\1\u055a\2\140\1\u055a\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u07f7\4\140\1\u07f8\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u0565\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u07f9\1\140\1\u07fa\1\u07fb"+
+    "\1\u07fc\1\u07fd\1\u07fe\1\u07ff\1\u0800\2\140\1\u0801\1\u0802"+
+    "\1\u06a5\1\140\1\u0803\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\1\u0804\7\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0805\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u050b\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u0806\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\12\140\1\u0807\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0808\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\21\140\1\u0809\2\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u01b7\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u0224\4\140\1\u080a\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u080b\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u02f3\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0360\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u080c\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u080d\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u080e\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u080f\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0810\3\140\1\u0811\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\12\140\1\u0224\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\1\140\1\u0224\6\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u0812"+
+    "\4\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0813"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0814"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0815\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0816\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0817\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0818\2\140"+
+    "\1\u0819\3\140\1\u081a\4\140\1\u081b\1\u081c\4\140\1\u081d"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u063a\10\140"+
+    "\1\u081e\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u081f\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0820"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0237"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0821"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u075d"+
+    "\4\140\1\u0822\2\140\1\u02db\11\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u0823\2\140\1\u0824\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0825\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u0826\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0827\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u0828\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\5\140\1\u0224\3\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0224"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0829"+
+    "\11\140\1\131\2\0\1\u03b0\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u082a\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\1\140\1\u082b\6\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u082c\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\22\140\1\u082d\1\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u082e\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u082f\1\140\1\u07c0\1\u0475"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0830"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0831"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0832"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u01b7"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u07e2\2\140"+
+    "\1\u0833\4\140\1\u0834\1\u06de\12\140\1\131\2\0\1\140"+
+    "\2\0\1\u0835\16\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u0836\1\u0837\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0224\7\140\1\u0838"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0839\3\140"+
+    "\1\u06dd\4\140\1\u083a\3\140\1\u083b\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u083c\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u052c\6\140\1\u048a\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0460\10\140"+
+    "\1\u07c4\7\140\1\u083d\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u083e\6\140\1\u083f\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0840\1\140\1\u0841\1\140\1\u052c"+
+    "\1\u0237\4\140\1\u0527\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0842\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u016f\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0843\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u0844\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u0845\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0846\1\140\1\u0847\1\140\1\u0848\1\u0849\1\u084a\1\u084b"+
+    "\3\140\1\u0421\1\u084c\1\u084d\2\140\1\u084e\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u084f\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\17\140\1\u01aa\4\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0850\5\140\1\u0851\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0852\7\140"+
+    "\1\u0853\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0854\12\140\1\u0821\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0855\3\140\1\u0856\6\140\1\u0857\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u0858\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0859\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u03df\3\140\1\u07a4\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u085a\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u085b\3\140"+
+    "\1\u085c\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u085d"+
+    "\3\140\1\u07aa\6\140\1\u085e\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u085f\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u07af\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0860\4\140\1\u0861\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0862\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u0863\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u0864\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0865\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0866\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u056a\1\140\1\u0867\2\140\1\u0868"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0869"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u056a"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u086a\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u086b\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u086c\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0355\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u086d\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u086e\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u086f\1\140\1\u0870"+
+    "\2\140\1\u0871\2\140\1\u0872\4\140\1\u0873\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u0874\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u0694\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0875\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\1\u0876\16\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0877\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u0878\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0879\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u03eb\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\17\140\1\u0877\4\140\1\131\2\0"+
+    "\1\u0877\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u087a\1\u087b\1\u087c\1\u087d"+
+    "\1\u087e\1\u087f\1\u0880\1\u0881\1\u0882\1\140\1\u0883\1\u0884"+
+    "\1\u0885\1\u0886\1\140\1\u0887\1\140\1\u0888\1\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0889\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u088a\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u088b\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u06dd\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u088c\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u088d\2\140\1\u088e\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u088f\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0890\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u042f\1\u0891\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0892\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0893\4\140\1\u0894"+
+    "\3\140\1\u0895\7\140\1\131\2\0\1\u0631\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0896\2\140\1\u0897\1\u0898\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\5\140\1\u0899\16\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u089a\4\140\1\u089b\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u089c\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u089d\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u075b\5\140\1\u089e\4\140"+
+    "\1\u0319\1\140\1\u089f\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u06a0\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u066e\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u08a0\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u08a1\1\u08a2\3\140\1\u08a3\4\140\1\u08a4\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u08a5\16\140\1\u035c"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u08a6\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u08a7\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u08a8\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u08a9\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u08aa\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u08ab\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u08ac\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u08ad"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u08ae\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u08af\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u08b0\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u08b1\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u08b2\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u035c\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u08b3\6\140\1\u08b4\1\u08b5\4\140\1\u08b6\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u08b7\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\u08b8\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\1\u08b9\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u08ba\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u08bb\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u08bc\1\u08bd\1\u08be\1\u08bf\1\u08c0\1\u08c1"+
+    "\1\u08c2\1\u08c3\1\u08c4\1\u08c5\1\140\1\u08c6\1\u08c7\1\u08c8"+
+    "\1\u06a5\1\140\1\u08c9\2\140\1\u08ca\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u08cb\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u08cc\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u08cd\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u08ce\3\140\1\u08cf\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u08d0\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u08d1\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u07a8\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u08d2\6\140\1\u08d3"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u08d4"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u08d5"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u08d6\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u08d7\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u08d8\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u08d9\1\140"+
+    "\1\u019a\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u08da\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u08db\12\140\1\u08dc\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u08dd\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u08de\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u039a\1\140\1\u08df\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u08e0\14\140\1\u089f\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u08e1\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u08e2\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u08e3\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u03a4\1\140\1\u0224\1\u08e4"+
+    "\1\u08e5\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u08e6"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u08e7\6\140\1\u08e8\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u08e9\4\140\1\u08ea\6\140\1\u0224\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u033a\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u08eb\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u08ec\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u08ed\1\140\1\u08ee\1\u08ef\1\u08f0"+
+    "\1\140\1\u08f1\1\140\1\u08f2\1\140\1\u0352\1\u08f3\1\u08f4"+
+    "\1\u033a\4\140\1\u07c3\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u08f5\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\5\140\1\u0218\16\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u08f6\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0601\1\u08f7\5\140\1\u0379\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u08f8\2\140\1\u08f9\1\u0650\1\u08fa"+
+    "\1\140\1\u08fb\1\u08fc\1\u08fd\2\140\1\u08fe\1\u08ff\1\u0900"+
+    "\4\140\1\u0901\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0902\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0903\6\140\1\u0904\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0905\20\140\1\131\2\0\1\u0906\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0907\1\u0908\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0909\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u090a\1\140\1\u090b\1\140\1\u090c"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u090d"+
+    "\1\u090e\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u090f"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0910\2\140\1\u090e\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0911\1\u0912\3\140\1\u0913\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0914\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0915\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0916\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0917\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0918\3\140\1\u0919\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u091a\2\140\1\u091b"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u091c"+
+    "\17\140\1\131\2\0\1\140\2\0\16\140\1\u091d\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u091e"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u091f"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0920\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0921\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0922\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0923\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0924\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0925\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0926\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0326\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u0927\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0928"+
+    "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0929"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u092a"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u092b"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u092c\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u092d\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u040a\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u092e\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0853\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u092f\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0930\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\21\140\1\u0931\2\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\1\140\1\u0224\6\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0557\1\140\1\u0932\2\140\1\u0933"+
+    "\10\140\1\u0934\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0935"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0936\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0937\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u0938\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0939\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u093a\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140"+
+    "\1\u093b\2\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u093c\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140"+
+    "\1\u093d\2\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u093e\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u093f\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0940\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u073a"+
+    "\3\140\1\u0853\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0941\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0942\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0943\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u03df\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0944\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0945"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0946"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0947\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u0948\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0949"+
+    "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u094a"+
+    "\1\u0473\1\140\1\u094b\2\140\1\u094c\2\140\1\u0352\1\140"+
+    "\1\u01cb\6\140\1\131\2\0\1\140\2\0\1\u01ce\16\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u094d\5\140\1\u094e\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u06de\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u094f\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u0950\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0951\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0952\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0953\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u08aa\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u03df\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u0954\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0955\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0956\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\5\140\1\u0957\16\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0958\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0959\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u095a\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u095b\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u095c\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u095d\13\140\1\u095e\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u03df\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u095f\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\u0960\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0961"+
+    "\3\140\1\u05aa\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0962\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u08a5\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0963\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0964\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u0965\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u0966\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0967"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u055a\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0968\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u05de\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0969\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u0375\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u06ae\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u096a\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u096b\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u096c\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u096d\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u096e\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u096f\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u0970\1\140\1\u0971\4\140\1\u0972\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u0973\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\12\140\1\u0974\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u0975\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\17\140\1\u0976\4\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0977\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u033a\6\140\1\u0978"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0979"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u097a\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u097b\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u097c\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0363\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u097d\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u097e\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u097f\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0980\10\140"+
+    "\1\u0981\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0982"+
+    "\5\140\1\u0983\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u0984\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0985\1\140\1\u0986\4\140\1\u0987\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0988\2\140\1\u0989"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u098a"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u098b\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u098c\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u098d\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u06a2\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0159\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u098e\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u098f\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0990\11\140\1\u0991\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0992\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u07f7\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u0993\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u0994\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0995\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0996\1\140\1\u07a8"+
+    "\4\140\1\u0997\3\140\1\u0998\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\12\140\1\u0694\11\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u0999\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u099a\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u0569\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\2\140\1\u099b\5\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u0224\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0355\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\1\u099c\16\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u0527\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\22\140\1\u0224\1\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0325\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u099d\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\1\131"+
+    "\1\u099e\4\131\1\0\2\131\1\u099e\1\131\4\u099e\1\131"+
+    "\1\0\1\131\1\0\3\131\1\0\1\131\1\u099e\13\0"+
+    "\4\131\3\u099e\6\131\2\u099e\4\131\1\u099e\1\131\2\0"+
+    "\1\131\2\0\1\131\1\u099e\3\131\1\u099e\6\131\1\u099e"+
+    "\2\131\1\0\1\131\3\u099e\1\131\3\u099e\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u099f\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u09a0\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\u09a1"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u09a2\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u09a3\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\12\140\1\u09a4\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u09a5\2\140\1\u09a6\3\140\1\u09a7\1\u09a8\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u09a9\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u09aa\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\1\u09ab\16\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u09ac\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u09ad\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0473\1\u09ae\6\140\1\u0352"+
+    "\1\140\1\u01cb\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u09af"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u09b0\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u09b1"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u09b2\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u09b3\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0806\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u09b4\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u09b5\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u09b6\3\140\1\u09b7"+
+    "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\4\140"+
+    "\1\u09b8\3\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u09b9\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u09ba\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\20\0\1\u09bb\53\0\1\u09bb\122\0\1\u09bc"+
+    "\135\0\1\u0705\141\0\1\u09bd\132\0\1\u09be\160\0\1\u09bf"+
+    "\115\0\1\u09c0\144\0\1\u0703\103\0\1\u09c1\161\0\1\u09c2"+
+    "\157\0\1\u0708\117\0\1\u09c3\135\0\1\u0708\141\0\1\u09c4"+
+    "\151\0\1\u09c3\73\0\1\u09c5\177\0\1\u09c6\121\0\1\u09c7"+
+    "\151\0\1\u09c8\57\0\4\351\1\u09c9\1\351\1\0\10\351"+
+    "\2\0\1\351\5\0\2\351\13\0\11\351\1\u09c9\12\351"+
+    "\3\0\1\351\2\0\17\351\1\0\10\351\11\0\6\351"+
+    "\1\0\2\351\1\u09ca\5\351\2\0\1\351\5\0\2\351"+
+    "\13\0\4\351\1\u09ca\17\351\3\0\1\351\2\0\17\351"+
+    "\1\0\10\351\10\0\1\u04a9\126\0\2\64\1\0\1\64"+
+    "\1\0\2\64\2\0\1\111\5\64\1\0\26\64\1\0"+
+    "\16\64\1\111\20\64\1\0\32\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\26\64\1\0\21\64\1\u09cb"+
+    "\15\64\1\0\2\64\1\u09cb\27\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\26\64\1\0\22\64\1\u02a9"+
+    "\14\64\1\0\3\64\1\u02a9\26\64\1\0\1\64\1\0"+
+    "\2\64\2\0\6\64\1\0\2\64\1\u09cc\23\64\1\0"+
+    "\12\64\1\u09cc\24\64\1\0\32\64\1\0\1\64\1\0"+
+    "\2\64\2\0\5\64\1\u09cd\1\0\26\64\1\0\10\64"+
+    "\1\u09cd\26\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+    "\2\0\2\64\1\u09ce\3\64\1\0\26\64\1\0\11\64"+
+    "\1\u09ce\25\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+    "\2\0\1\u09cf\5\64\1\0\26\64\1\0\16\64\1\u09cf"+
+    "\20\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\26\64\1\0\37\64\1\0\11\64\1\u09d0"+
+    "\6\64\1\u09d0\11\64\1\0\1\64\1\0\2\64\2\0"+
+    "\6\64\1\0\26\64\1\0\21\64\1\u0714\15\64\1\0"+
+    "\2\64\1\u0714\27\64\1\0\1\64\1\0\2\64\2\0"+
+    "\1\u04c3\5\64\1\0\26\64\1\0\16\64\1\u04c3\20\64"+
+    "\1\0\32\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+    "\1\0\1\u02a8\25\64\1\0\25\64\1\u02a8\11\64\1\0"+
+    "\32\64\1\0\1\64\1\0\2\64\2\0\1\u0712\5\64"+
+    "\1\0\26\64\1\0\16\64\1\u0712\20\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+    "\1\0\26\64\1\u09d1\10\64\1\0\4\64\1\u09d1\25\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\1\64"+
+    "\1\u0712\24\64\1\0\15\64\1\u0712\21\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\2\64"+
+    "\1\u09d2\23\64\1\0\12\64\1\u09d2\24\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\3\64\1\u0128\2\64"+
+    "\1\0\26\64\1\0\6\64\1\u0128\30\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\2\64\1\u09d3\3\64"+
+    "\1\0\26\64\1\0\11\64\1\u09d3\25\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\1\64\1\u09d4\4\64"+
+    "\1\0\26\64\1\0\23\64\1\u09d4\13\64\1\0\32\64"+
+    "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\2\64"+
+    "\1\u028a\23\64\1\0\12\64\1\u028a\24\64\1\0\30\64"+
+    "\14\0\1\u09d5\40\0\1\u09d5\61\0\1\131\10\0\1\131"+
+    "\1\u09d6\4\131\1\0\2\131\1\u09d6\1\131\4\u09d6\1\131"+
+    "\1\0\1\131\1\0\3\131\1\0\1\131\1\u09d6\13\0"+
+    "\4\131\3\u09d6\6\131\2\u09d6\4\131\1\u09d6\1\131\2\0"+
+    "\1\131\2\0\1\131\1\u09d6\3\131\1\u09d6\6\131\1\u09d6"+
+    "\2\131\1\0\1\131\3\u09d6\1\131\3\u09d6\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0384\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u09d7\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u09d8\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u09d9\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u09da\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u0591\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u02d5\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u09db\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u058f\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u09dc\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u014c\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u09dd\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u09de\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\3\140\1\u0853\2\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\1\140\1\u09df\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u02da\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u09e0\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u03b7\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u02e7\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u09e1\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\14\0\1\u09e2\40\0\1\u09e2"+
+    "\71\0\1\u04fa\142\0\1\u09e3\40\0\1\u09e3\71\0\1\u04fe"+
+    "\126\0\1\131\10\0\1\u09e4\5\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\2\140\1\u074c\6\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\1\140\1\u09e5\4\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u09e6"+
+    "\2\140\1\u09e7\1\140\1\u09e8\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u075d\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u09e9\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\2\140\1\u09ea\6\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\13\140"+
+    "\1\u09eb\3\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u09ec\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0903\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u09ed\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u09ee\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u09ef\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\21\140\1\u09f0\2\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u07c4\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u09f1\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u09f2\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u09f3\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u09f4\2\140\1\u02cd\16\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u09f5\1\140\1\u09f6\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0363\4\140\1\u03a6"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u039a"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u09f7"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u09f8"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u09f9\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u09fa\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u09fb\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\4\140\1\u08ba\3\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u02dd\10\140"+
+    "\1\u09fc\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u09fd\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u09fe"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u09ff\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u02dd\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0a00\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u0a01\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u0a02\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u0a03\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u07f3\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u0670\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0a01\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0a04\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u0a05\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0a06\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0a07\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0a08\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0a09\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\5\140\1\u0a0a\6\140\1\u0a0b"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0a0c"+
+    "\2\140\1\u0a0d\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0a0e\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u0a0f\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0a10"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0a11"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0a12\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0a13"+
+    "\1\u0a14\1\u0a15\1\u0a16\1\u0a17\1\u0a18\1\u0a19\1\u0a1a\1\u0a1b"+
+    "\1\u0a1c\3\140\1\u0a1d\1\u0a1e\5\140\1\131\2\0\1\u0a1f"+
+    "\2\0\1\u08b9\16\140\1\0\1\140\1\u0628\2\140\1\u0a20"+
+    "\3\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0a21"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u0a22\1\u0a23\1\u0a24\1\u0a25\1\u0a26\1\u0a27\1\u0a28\1\u0a29"+
+    "\1\u09f9\1\u0a2a\1\u0352\1\u0a2b\1\u0a2c\1\u0a2d\1\140\1\u0a2e"+
+    "\2\140\1\u0a2f\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\1\u0a30\6\140\1\u0a31\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u0363\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0a32\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0a33\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0487\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u0a34\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0a35\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0a36\14\140\1\131\2\0\1\u0a37\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0a38\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u0a39\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0a3a\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u0a3b\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0a3c\1\140\1\u0a3d\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\23\140\1\u0a3e\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0a3f\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u0a40\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u0a41\1\140\1\u0a42\3\140\1\u0a43\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0a44\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0a45\1\140"+
+    "\1\u0a46\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0a47\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u0a48\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0a49\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u077b\1\u0a4a\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u0a4b\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u0a4c\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u0a4d\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u0a4e\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u0a4f\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0a50\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u0a51\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0a52\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u06c0\1\140\1\u0a53\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u0a54\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0a55\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\23\140\1\u0a56\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\16\140\1\u0363\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0561\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0a57\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0a58\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u0a59\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0a5a\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0a5b\12\140\1\u0a5c\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0a5d\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0a5e\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u0a5f\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u085a\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u0a60\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u0224\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0a61\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u0a62\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0a63\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u050e"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u07f3"+
+    "\1\u050e\7\140\1\u050e\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u052c\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0a64\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u0a65\16\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u0a62\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u033a\16\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u055a\16\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0a66\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u0a67\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0a68\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0325\1\140\1\u0325\4\140\1\u07c4\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0a69\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u06d9\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u03ac\1\140\1\u0a6a\1\140"+
+    "\1\u0a6b\10\140\1\u0a6c\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\1\u0a6d\7\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0a6e\1\u0a6f\6\140\1\u0a70\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0a71\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u03eb\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0a72\3\140"+
+    "\1\u056e\4\140\1\u0527\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0a73\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u052c\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u0a74\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u0562\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0348\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u07f7\4\140\1\u0224\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0375\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0224\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u0a75\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0a76\1\u0a77\1\140\1\u0a78\1\u0a79\1\140\1\u0a7a"+
+    "\1\u0a7b\1\u0a7c\1\u0a7d\3\140\1\u0a7e\1\u0a7f\5\140\1\131"+
+    "\2\0\1\140\2\0\1\u0a80\16\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0a81\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0a82\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u056e\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0a83\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0a84\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u0a85\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0a86\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0a87\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0a88\10\140\1\u089f"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\1\u061a"+
+    "\7\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0a62\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0a89\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\16\140\1\u0364\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0a8a\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0a8b\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0a8c\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0a8d\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0a8e\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0a8f\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0a90\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0a91\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0a92\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0a0f\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0a93\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0a94\2\140"+
+    "\1\u0a95\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0a96"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0853\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0a97\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0557\14\140\1\u0596\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u06a1\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u07e2\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0a98\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0a99\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0a9a\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0a9b\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u03a1\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0a9c\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0a9d\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0a9e\1\140\1\u0a9f\1\u0aa0\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0aa1\5\140"+
+    "\1\u02d5\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0aa2\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0aa3"+
+    "\12\140\1\u0aa4\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0aa5\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0826\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0aa6\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0aa7\2\140"+
+    "\1\u06a2\4\140\1\u0aa8\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0596\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u079c\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0aa9\1\u07a1\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\1\u07a6\16\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u06dd\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0aaa\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u035c\1\140\1\u0aab\11\140\1\u01b2\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\u0631"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u056a\7\140\1\u0aac\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0aad\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u0aae\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0aaf\3\140\1\u0ab0\3\140"+
+    "\1\u0ab1\6\140\1\u0ab2\4\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u03df\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u080a\15\140\1\131\2\0\1\140\2\0"+
+    "\1\u0325\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0449\13\140\1\u0ab3\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u03a4\2\140\1\u0ab4\1\u03f8"+
+    "\2\140\1\u0a4c\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u0ab5\2\140\1\u01b2\2\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0686\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u0ab6\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\12\140\1\u050d\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0ab7"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0237\1\140\1\u0ab8\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\22\140\1\u0159\1\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u0352\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u01b7\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0ab9\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0aba\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u0abb\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u056a\6\140\1\u056a\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u0abc\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u052d\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0abd\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u0abe\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0abf\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\1\140\1\u0ac0\6\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0ac1\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u0ac2\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0ac3\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u0645\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0ac4\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0ac5\2\140\1\u0ac6\1\u0ac7\3\140"+
+    "\1\u0ac8\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0ac9"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0aca\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0acb\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0484\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u05ba\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0acc\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0acd\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0822\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u07be\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0ace\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0acf\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0ad0\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0ad1\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0ad2\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0ad3\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0527\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0460\1\140\1\u0ad4"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0ad5"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0ad6\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0ad7"+
+    "\1\u0ad8\1\u0ad9\1\u0ada\1\u0adb\1\u046d\1\u0449\1\u0adc\1\u0add"+
+    "\2\140\1\u0ade\1\u0adf\1\u0ae0\1\140\1\u0ae1\2\140\1\u07c3"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\7\140\1\u0ae2"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0ae3"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0ae4"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0ae5"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0ae6"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0ae7"+
+    "\6\140\1\u0ae8\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u0987\1\u0ae9\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0aea\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u052c\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0aeb\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u0823\2\140\1\u07c4\1\140\1\u0aec"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0aed\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0460"+
+    "\4\140\1\u0aee\11\140\1\u0224\2\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u083a\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u07c4\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\12\140\1\u052c\11\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u0aef\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0393\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0af0\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0840\11\140\1\u0527\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u0af1\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u048a\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0af2\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0af3\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u0af4\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u0af5\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0af6\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0af7\20\140\1\131\2\0\1\u0af8"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0af9\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0afa\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0afb\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0afc\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0a43\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0afd\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u0afe\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u0aff\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0b00\21\140\1\131\2\0\1\140\2\0"+
+    "\1\u0b01\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0b02\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u03df\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0b03\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u0b04\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\5\140\1\u0b05\16\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u06da\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0b06\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0b07\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u052c\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u08ae\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u07be\3\140\1\u0b08\4\140\1\u0b09"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0b0a"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\1\u048a\16\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0b0b\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0b0c\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0b0d\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u07f4\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0b0e\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0b0f\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0b10\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0b11\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0b12\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u0b13\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0b14\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u0b15\16\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u0b16\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0224\1\140\1\u0326\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0b17\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u09f6\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0b18\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0b19\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0b1a\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u0b18\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0b1a\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0b1b\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0b1c"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0b1d"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u033a"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0b1e"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0b1f"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0b20"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0b21"+
+    "\1\u0b22\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0b23\6\140\1\u0b24\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0b25\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0b26\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u0b27\1\u0b28\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0b29\4\140\1\u0b2a\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0b2b\1\140\1\u0b2c"+
+    "\5\140\1\u0b2d\2\140\1\u06da\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0b2e\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0b2f\2\140\1\u0b30\3\140\1\u0b31"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0b32"+
+    "\5\140\1\u0b33\2\140\1\u0b34\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0b35\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0b36\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0b37\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0b38\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u08ea\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0b39\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0b3a\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0b3b\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0b3c\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u0b3d\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u0348\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0b3e\1\140\1\u0b3f\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u0b40\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0b41\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0b42\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u0b43\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0b44\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0b45\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u0b46\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0b47\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0b48\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0b49\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u0b4a\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u0b4b\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0b4c\1\0\1\u0b4d\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0b4e\2\140\1\u0b4f\1\u0990"+
+    "\6\140\1\u0352\1\140\1\u0b50\6\140\1\131\2\0\1\140"+
+    "\2\0\1\u01ce\16\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0b51\4\140\1\u08ba\4\140"+
+    "\1\u0b52\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0b53\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0b54\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u03f8\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u0b55\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0b56\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0b57"+
+    "\12\140\1\u037c\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u0b58\2\140\1\u0b59\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u0b5a\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0b5b\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0b5c\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0484\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u052c\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0b5d\1\u0224\16\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u0b5e\1\140\1\u0b5f"+
+    "\4\140\1\u0b60\7\140\1\u0b61\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\1\u0b62\7\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\u0224\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0363\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0b63\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u0b64\1\u0b65\10\140\1\u0352\1\u0b66\1\u01cb"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u07c4"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0b67\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0b68\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u0b69\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u0b6a"+
+    "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0b6b"+
+    "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0b6c"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0b6d"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0b6e"+
+    "\3\140\1\u0b6f\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\12\140\1\u0b70\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0b71\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0b72"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+    "\1\u06dc\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0695"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0b73\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0b74\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0b75\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0b21\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0b76\6\140"+
+    "\1\u0b24\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0b77\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0b78"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0b79"+
+    "\1\u0b7a\12\140\1\u0b7b\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0b7c\12\140\1\u0b7d\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0b7e\1\140\1\u0b7f\1\140\1\u0b80"+
+    "\3\140\1\u0b81\2\140\1\u06da\3\140\1\u08c7\2\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0b82\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u0b83\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0b84\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0b85\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0b86\6\140\1\u0b87\3\140"+
+    "\1\u0b88\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0b89\4\140\1\u0b8a\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0b8b\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0b8c\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\23\140\1\u0b8d\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0b8e\11\140\1\u0b8f\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0b90\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u0b91\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0b92\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\22\140\1\u0b93\1\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0b94\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u0b95\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0b96\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0b97\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\23\140\1\u0b98\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0b99\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u0b9a\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+    "\1\u033a\2\140\1\u0b9b\4\140\1\u0b9c\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0b9d\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0b9e\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0413\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0b9f\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0ba0\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0ba1\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u0ba2\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0ba3\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\4\140\1\u0ba4\3\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\1\u0924"+
+    "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0ba5\5\140\1\u0ba6\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u0ba7\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u0ba8\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0ba9\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u0baa\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u050e\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u0bab\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0bac\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0bad\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0bae\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0baf\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0bb0\20\140\1\131\2\0\1\u0631\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0bb1\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0bb2\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0a06\1\u090e\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0bb3\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u03a4\3\140\1\u0bb4\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0bb5\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u07c4\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u0bb6\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u0bb7\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0903\6\140\1\u0baf\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0bb8\2\140\1\u0bb9\1\u0bba"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0bbb"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0bbc"+
+    "\1\140\1\u0bbd\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u0bbe\6\140\1\u089f\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0bbf\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0bc0\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0911\1\u03a4\3\140\1\u0bc1\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0bc2\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0bc3\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0bc4\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u0bc5\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0377\14\140\1\131"+
+    "\2\0\1\140\2\0\1\u0378\16\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u07be\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0bc6\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0bc7\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0bc8\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0bc9\4\140"+
+    "\1\u0bca\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0bcb\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0bcc\1\u0bcd\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\22\140\1\u0bce\1\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u037c\4\140\1\u0bcf\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0bd0\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u0bd1\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\1\u0bd2"+
+    "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0bd3\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0bd4\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u0bd5\10\140\1\u0bd6\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u0bd7\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u0bd8\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0bd9\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u0bda\1\u0bdb\1\u0bdc\1\u0bdd\1\u0bde"+
+    "\1\u0bdf\1\u0be0\1\u0be1\1\u0be2\2\140\1\u0be3\1\u0be4\1\u0be5"+
+    "\4\140\1\u0be6\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0be7"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u06de"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0be8"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0be9"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0bea"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0beb"+
+    "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0bec"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0bed"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0bee"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0319"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0bef"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0bf0"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0bf1\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0bf2\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0976\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u074d\4\140"+
+    "\1\u0bf3\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0569\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u0bf4\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u09d7\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0bf5\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0bf6\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0bf7\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u05de\11\140"+
+    "\1\u0569\5\140\1\u082d\1\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0af2\1\u0bf8\2\140\1\u0bf9\3\140\1\u0bfa\4\140"+
+    "\1\u0bfb\2\140\1\u0bfc\1\140\1\u0553\1\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0bfd\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0bfe\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0bff\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0c00\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0c01\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0c02\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0c03\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u0c04\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0c05"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\21\140\1\u0c06\2\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u0601\6\140\1\u0379\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u07f3\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0596\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u0c07\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0c08\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u03a2\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u048a\12\140\1\u0aac\2\140"+
+    "\1\u0c09\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u0c0a\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0c0b\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0c0c\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0853"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0c0d"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0c0e"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0af2\1\140"+
+    "\1\u0c0f\1\u0c10\2\140\1\u0c11\1\u0c12\1\u0c13\3\140\1\u08c7"+
+    "\1\u0c14\1\u0c15\3\140\1\u0c16\1\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0c17\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u0c18\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u0329\6\140\1\u0596\1\140\1\u0c19\1\140"+
+    "\1\u0c1a\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0c1b\2\140\1\u0c1c\16\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0c1d\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0391\11\140\1\u0c1e\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0c1f\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u039a\1\140\1\u039b\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0c20\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0c21\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0c22\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0c23\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0c24\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0c25\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u02da\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0c26\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u0c27\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u0c28\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u0350\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u0c29\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0808\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0c2a\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0c2b\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u0c2c\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0c2d\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0c2e\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\12\140\1\u0c2f\11\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u0c30\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0c31\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0c32\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\u0c33\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0c34\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0c35\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0c36\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0360"+
+    "\5\140\1\u0a09\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u0c37\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u0c38\10\140\1\u0c39\2\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u0c3a\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0c3b\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\12\140\1\u0c3c\11\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u0c3d\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\17\140\1\u0c3e\4\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u0c3f\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0c40\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0869\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0c41\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0c42\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0c43\1\140\1\u0c44\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0c45\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0c46\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0c47\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0c48\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0";
+
+  private static final String ZZ_TRANS_PACKED_2 =
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0517"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0c49\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0c4a\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0c4b\1\140\1\u0c4c"+
+    "\1\u0c4d\1\u0c4e\1\u0c4f\1\u0c50\1\u0c51\1\u0c52\1\u0809\1\140"+
+    "\1\u0352\1\u0c53\1\u0c54\1\u0c55\5\140\1\131\2\0\1\140"+
+    "\2\0\1\u0c56\16\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\17\140\1\u0c57\4\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0c58\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0c59\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u01a0\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u0c5a\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0c5b\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u0c5c\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u0c5d\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u0c5e\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\23\140\1\u0c5f\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0c60\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0c61\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u0686\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0c62\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0c63\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0c64\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0c65\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0c66\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0c67\12\140\1\u0c5c\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u0c68\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0c69\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\u0c6a\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u06dc\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0c6b"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0c6c"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0c6d"+
+    "\1\u074d\5\140\1\u0997\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0c6e\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0c6f\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0c70\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0c71\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u0c72\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\3\140\1\u0508\4\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u01cc\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0836\2\140\1\u052c\1\u033a\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\1\131\1\u0c73\4\131\1\0\2\131\1\u0c73\1\131\4\u0c73"+
+    "\1\131\1\0\1\131\1\0\3\131\1\0\1\131\1\u0c73"+
+    "\13\0\4\131\3\u0c73\6\131\2\u0c73\4\131\1\u0c73\1\131"+
+    "\2\0\1\131\2\0\1\131\1\u0c73\3\131\1\u0c73\6\131"+
+    "\1\u0c73\2\131\1\0\1\131\3\u0c73\1\131\3\u0c73\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u077b\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0c74\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u0c75\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u0bfa\2\140\1\u0c76\1\u0c77\2\140"+
+    "\1\u0c78\1\u0c79\3\140\1\u0c7a\5\140\1\u0c7b\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0808\7\140\1\u0c7c\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u0c7d\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0c7e\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0c7f\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0c80\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0c81\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u0c82\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0c83\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0c84\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0c85\1\140\1\u0c86"+
+    "\1\u0c87\4\140\1\u0c88\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0c89\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u0c8a\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u08b4\12\140\1\u0553\1\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u0c8b\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u0c8c\1\140\1\u0c8d\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0c77\1\140\1\u09ed"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u050d"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0c8e"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u061d"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0c8f"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0c90"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0c91\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0c92"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0c93"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0c94"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\21\0\1\u0c95\42\0\1\u0c95\137\0\1\u0c96\141\0\1\u0c97"+
+    "\127\0\1\u049e\141\0\1\u0c98\146\0\1\u0708\127\0\1\u0708"+
+    "\150\0\1\u0c99\70\0\1\u0c9a\165\0\1\u0708\142\0\1\u0c9b"+
+    "\3\0\1\u0c9c\1\0\1\u0c9d\142\0\1\u0c98\117\0\1\u0c98"+
+    "\137\0\1\u0c9e\67\0\5\351\1\u0c9f\1\0\10\351\2\0"+
+    "\1\351\5\0\2\351\13\0\2\351\1\u0c9f\21\351\3\0"+
+    "\1\351\2\0\17\351\1\0\10\351\2\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\12\64\1\u0287\13\64"+
+    "\1\0\37\64\1\0\6\64\1\u0287\23\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\20\64\1\111\5\64"+
+    "\1\0\35\64\1\111\1\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\2\64\1\u0ca0\23\64"+
+    "\1\0\12\64\1\u0ca0\24\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\2\64\1\u02ad\23\64"+
+    "\1\0\12\64\1\u02ad\24\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\26\64\1\0\21\64"+
+    "\1\371\15\64\1\0\2\64\1\371\27\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\12\64\1\u0ca1\13\64"+
+    "\1\0\37\64\1\0\6\64\1\u0ca1\23\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\2\64\1\u0712\23\64"+
+    "\1\0\12\64\1\u0712\24\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\26\64\1\0\26\64"+
+    "\1\u0ca2\10\64\1\0\4\64\1\u0ca2\25\64\1\0\1\64"+
+    "\1\0\2\64\2\0\3\64\1\u0133\2\64\1\0\26\64"+
+    "\1\0\6\64\1\u0133\30\64\1\0\32\64\1\0\1\64"+
+    "\1\0\2\64\2\0\6\64\1\0\26\64\1\0\21\64"+
+    "\1\u02b1\15\64\1\0\2\64\1\u02b1\25\64\15\0\1\u0ca3"+
+    "\50\0\1\u0ca3\50\0\1\131\10\0\1\131\1\140\4\131"+
+    "\1\0\2\131\1\140\1\131\4\140\1\131\1\0\1\131"+
+    "\1\0\3\131\1\0\1\131\1\140\13\0\4\131\3\140"+
+    "\6\131\2\140\4\131\1\140\1\131\2\0\1\131\2\0"+
+    "\1\131\1\140\3\131\1\140\6\131\1\140\2\131\1\0"+
+    "\1\131\3\140\1\131\3\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0ca4\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u02d7\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0ca5\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0ca6\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0ca7\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u03b7\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0ca8\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0ca9\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0759\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u02da\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u04e5\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\15\0\1\u0caa\50\0\1\u0caa\65\0\1\u0cab"+
+    "\50\0\1\u0cab\50\0\1\131\10\0\1\u074c\5\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\5\140\1\u0cac\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+    "\1\u0cad\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0796"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0cae\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0caf\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\1\u0cb0\5\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\2\140\1\u0cb1\14\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u014c\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0905\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\4\140\1\u0325\3\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u0cb2\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u07f3\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0cb3\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0cb4\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0cb5\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0cb6\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u0224\6\140\1\u0a01\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u0cb7\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u042f\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0cb8\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u075b\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u0cb9\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0cba\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0cbb\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0a01\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\23\140\1\u0355\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0cbc\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0cbd\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u09fe\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u076c\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u0cbe\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0cbf\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+    "\1\u0cc0\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u037c"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0cc1"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0cc2"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u085a"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0cc3"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0cc4"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0571"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0cc5"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0cc6\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0cc7\6\140\1\u0cc8\1\u0cc9\4\140\1\u0cca\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0ccb\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u0ccc\6\140\1\u0ccd\7\140"+
+    "\1\u0cce\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+    "\1\u042f\16\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0ccf\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u0cd0\3\140\1\u0cd1\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u01b7\5\140\1\u0cd2\7\140\1\u0cd3\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0cd4\1\u0cd5\13\140"+
+    "\1\u0cad\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0cd6\6\140\1\u0b24\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u0cd7\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0cd8\1\140\1\u0cd9\10\140\1\u0cda\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u07a8\3\140\1\u0cdb"+
+    "\4\140\1\u0cdc\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0cdd\5\140\1\u0cde\4\140\1\u0cdf\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0ce0\1\140\1\u0ce1\1\140"+
+    "\1\u0ce2\10\140\1\u0224\4\140\1\131\2\0\1\u0224\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0ce3\1\140\1\u0ce4\2\140\1\u0ce5\1\u03eb"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0ce6"+
+    "\6\140\1\u0ce7\1\u0ce8\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0ce9\1\140\1\u0cea\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\23\140\1\u056e\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u07bb\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0325\1\140\1\u0ceb\11\140\1\u0cec\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0ced\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0cee\11\140\1\u0cef"+
+    "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0cf0"+
+    "\1\u0cf1\16\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0cf2\20\140\1\131\2\0\1\u0cf3\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0cf4\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u0cf5\1\140\1\u0cf6\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0cf7\5\140\1\u0cf8\1\140\1\u0cf9\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0cfa\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0cfb\1\140\1\u0cfc"+
+    "\6\140\1\u0319\1\140\1\u0cfd\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0cfe\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0cff\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0d00\3\140\1\u0d01\2\140\1\u0d02\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0d03\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0d04\5\140\1\u0d05\1\140"+
+    "\1\u0d06\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0d07"+
+    "\5\140\1\u0d08\4\140\1\u0d09\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u0d0a\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\23\140\1\u0686\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0d0b\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u0596\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u0d0c\1\u0d0d\1\u0d0e\1\u0d0f\1\u0d10"+
+    "\1\u0d11\1\140\1\u0d12\1\u0d13\2\140\1\u0d14\1\u0d15\1\u0d16"+
+    "\1\140\1\u0d17\2\140\1\u0d18\1\131\2\0\1\140\2\0"+
+    "\1\u0d19\16\140\1\0\1\u061a\7\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0d1a\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u0d1b\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\1\u0d1c\7\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0d1d\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0d1e\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0d1f\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0d20\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0d21\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0d22\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u0d23\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0d24\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\4\140\1\u0d25\3\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u0a9a\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0d26\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u0d27\22\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0d28\5\140\1\u0d29\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0d2a\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0d2b\7\140"+
+    "\1\u0d2c\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0d2d\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u0d2e\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u0d2f\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0d30\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0d31\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0d32\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u0d33\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0527"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0d34\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0d35\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0d36\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0d37\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u066e\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0d38\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0d39\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0d3a\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0d3b\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0d3c\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\22\140\1\u0d3d\1\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u0d3e\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0d3f\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u07c4\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\12\140\1\u0436\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\21\140\1\u0d40\2\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0821\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u0d41\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0d42\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0d43\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0d44\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u037e\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u01cc\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u0acc\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u0d45\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u03df\1\140\1\u0808\17\140\1\u0b40"+
+    "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0d46"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0d47"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0d48"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0808"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0a31"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0d49"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0d4a"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0d4b"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0d4c"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0378"+
+    "\12\140\1\131\2\0\1\140\2\0\1\u0d4d\16\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u0d4e\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0a31\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140"+
+    "\1\u0d4f\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u0d50\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0d51\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u0d52\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0d53\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0d54\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0d55\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u0d56\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u0d57\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0d58\1\140\1\u0d59\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0d5a\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u0d5b\3\140\1\u0d5c\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0d5d\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0d5e\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0d5f\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0d60\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u0d61\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0d62\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u0d63\12\140\1\u0569\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u0d64\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0d65\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u0d66\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\u0d67\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0d68\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u0b1e\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0d69\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0d6a\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0d6b\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0d6c"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0d6d\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0d6e\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0d6f\6\140\1\u0acf\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0d70\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0d71\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0d72\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0d73\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0d74\3\140\1\u0601\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0d75\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0503\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u0d76\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u07c4\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0d77\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0693\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\1\140\1\u0d78\6\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u0d79\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0d7a\3\140\1\u0d7b\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0d7c\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0d7d\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u0d7e\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0d7f\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u0d80\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0d81\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0350\4\140\1\u0582\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0d82\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u0d82\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0d83\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0d84\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\1\u0d85\16\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u03df\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0d86"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0256"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0363"+
+    "\21\140\1\131\2\0\1\140\2\0\16\140\1\u0363\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0d87\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u0d88\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u0d89\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0d8a\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0379"+
+    "\1\140\1\u01cc\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u056e\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0d8b\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0d8c\1\140\1\u0d8d\1\u0d8e\4\140\1\u051e\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0d8f\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0d90\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u0bd6\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0d91\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u0d92\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u0d93\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0d94\2\140\1\u0d95\1\140\1\u0d96\2\140\1\u0d97"+
+    "\1\u0d98\3\140\1\u0d99\1\u0d9a\1\140\1\u0d9b\1\u0d9c\1\u0d9d"+
+    "\1\140\1\131\2\0\1\140\2\0\1\u0d9e\16\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0d9f\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0da0\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0da1"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0da2\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u0da3\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0acf"+
+    "\1\u0da4\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0da5\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0da6\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u0da7\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u0da8\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0528"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0da9\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0daa\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0dab\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0dac\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0571\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u0dad\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\12\140\1\u0dae\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\12\140\1\u0daf\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u0db0\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u05c6\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u0db1\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u0db2\2\140\1\u0db3"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0db4"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0db5"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0db6"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0db7"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\2\140\1\u0db8\5\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0db9"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0dba"+
+    "\20\140\1\131\2\0\1\u0dbb\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0dbc\2\140"+
+    "\1\u0dbd\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0dbe\1\140\1\u0dbf\1\140\1\u0dc0\4\140\1\u0319\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0dc1\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0dc2\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u03a4\3\140"+
+    "\1\u0dc3\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u08a5\7\140\1\u0dc4\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0dc5\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\7\140\1\u0dc6\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0dc7\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0dc8"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0dc9\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0dca\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\u0dcb\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0dcc"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0dcd"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u03d9\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0dce\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0dcf\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u0823\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u0dd0\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u0dd1\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u0dd2\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0dd3\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u083f\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0dd4\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0686\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0dd5\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u06a0\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0dd6\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0dd7\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0dd8\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0dd9\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0dda\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0ddb\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0ddc\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0ddd\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0453\22\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0dde\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0b05\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u033a\3\140\1\u0224"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0ddf"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0a9a"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0de0"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0de1"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0de2"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u09f9"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0de3"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u0de4"+
+    "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0de5"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0de6"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0de7"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u0de8"+
+    "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0752"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0de9\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u08ee\1\u0dea"+
+    "\1\u0deb\1\u0610\1\140\1\u0dec\3\140\1\u0ded\1\u0dee\1\u0def"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\1\u061a"+
+    "\7\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0df0\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u0df1\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u0df2\10\140\1\u0df3\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\1\u0df4\7\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\1\u061a"+
+    "\7\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0cc0"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0df5"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u07fb"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0d27"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0df6"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0df7"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0473"+
+    "\4\140\1\u07f4\2\140\1\u0352\1\140\1\u01cb\1\u06a5\5\140"+
+    "\1\131\2\0\1\140\2\0\1\u01ce\16\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0df8\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0df9\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u0dfa\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u050e\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0dfb\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0dfc\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\u0dfd"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u0dfe\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0348\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u0dff\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u0e00\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0e01\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u0e02\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\23\140\1\u0e03\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0e04\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0e05\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0e06\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0e07\4\140\1\u0e08\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u0e09\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0e0a\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0e0b\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0e0c\1\u0e0d\1\u0e0e\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0e0f\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0e10\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0e11\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\u0e12\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u0e13\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u0e14\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0e15\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0e16\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0e17\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u0e18\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0e19\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0891\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u0e1a\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0319\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0e1b\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0e1c\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0363\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u0e1d\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0e1e\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0e1f\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0e20\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0e21\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0e22\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u0e23\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0e24\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0e25\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u0b4d\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0b4e\1\140\1\u034d\1\u0e26\1\u0990\3\140\1\u0350\2\140"+
+    "\1\u0352\1\140\1\u0b50\6\140\1\131\2\0\1\140\2\0"+
+    "\1\u01ce\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u03e5\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u0c6a\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0e27\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0e28\3\140\1\u03a4\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u0e29\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0e2a\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0869\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u0e2b\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0e2c\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u0e2d\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0925\1\140"+
+    "\1\u0e2e\16\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u0e2f\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0e30\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+    "\1\u0e31\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0e32\5\140\1\u0b40\1\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0e33\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u052f\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0e34\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0e35\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u03d4\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0e36\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u0987\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0e37\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u0e38\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0e39"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0e3a\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0e3b\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0b42\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0af2\10\140\1\u0e3c\3\140"+
+    "\1\u0e3d\4\140\1\u0553\1\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u07f3\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u0224\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0e3e\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0e3f\7\140\1\u0836\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0e40\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0e41\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0e42\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u0e43\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0e44\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u0e45\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0e46\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u0e47\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u035c\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0e48\1\u0e49\1\u0e4a\1\140\1\u0e4b\3\140\1\u0e4c"+
+    "\4\140\1\u0e4d\2\140\1\u0e4e\1\u0e4f\2\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u0e50\2\140\1\u07fb\1\u0e51"+
+    "\1\u0e52\1\140\1\u0e53\13\140\1\131\2\0\1\140\2\0"+
+    "\1\u0e54\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0e55\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0e56\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0cc2\4\140\1\u03df\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u0e57\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0e58\4\140\1\u0e59\4\140"+
+    "\1\u0e5a\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0e5b\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u0e5c\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u0e5d\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0e5e\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0e5f\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0e60\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0e61\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140"+
+    "\1\u0363\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u0e62\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0e63\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0e64\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\1\u0224\16\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0b8a"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0e65"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0527\12\140"+
+    "\1\u0e66\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0e67\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140"+
+    "\1\u0e68\2\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140"+
+    "\1\u0e5e\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u0e69\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u0e6a\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0e6b"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0e6c\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0e6d\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0381\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0e6e\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u0e6f\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0e70\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0e71\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0e72\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0e73\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0e74\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0e75\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0511\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0e76\10\140\1\u0e77\1\u0d86\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0e78\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0e79\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0326\1\u0e7a"+
+    "\2\140\1\u0e7b\1\140\1\u0e7c\1\u0e7d\1\140\1\u0e7e\1\140"+
+    "\1\u0e7f\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u0e80\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0924\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0e81\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u0e82\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0bf1\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u0e83\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0e84\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u0e85\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0e86\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0e87\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u042f\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0e88\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0e89"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+    "\1\u0e8a\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0e8b\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0e8c\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u0e8d\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0e8e\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0377\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0e8f\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0e90\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u0bc9\22\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u0e91\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0e92\10\140\1\u0e93"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0e94\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u056a"+
+    "\2\140\1\u06a2\3\140\1\u056a\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0e95\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0e96\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0e97\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0e98\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0e99\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\23\140\1\u0e9a\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0e9b\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0e9c\1\u0e9d\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u037c\4\140\1\u0e9e\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u0e9f\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\1\u0ea0\16\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u0629\3\140\1\u0bd6\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0ea1\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0ea2\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0ea3\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0ea4\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0ea5\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0ea6\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0ea7\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u0ea8\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u0ea9\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0eaa\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u0eab\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\22\140\1\u0eac\1\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0ead\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u0eae\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u0571\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0eaf\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0eb0\1\u0eb1\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u0eb2\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u0eb3\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0eb4\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0eb5\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u0686\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0eb6\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u0eb7\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0eb8\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0eb9\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0eba\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0ebb\6\140\1\u0baf\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u08db\20\140"+
+    "\1\131\2\0\1\u0ebc\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0ebd\2\140\1\u0dbd"+
+    "\1\u0ebe\6\140\1\u0ebf\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u01cf\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u0ec0\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0ec1\1\140\1\u0ec2\4\140\1\u0ec3\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0ec4\11\140\1\u089f\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0bbf\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0ec5\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0ec6\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0ec7\3\140"+
+    "\1\u0ec8\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0ec9\4\140\1\u0224\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0eca\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u0ecb\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u0ecc\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0ecd\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0ece"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0ecf\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+    "\1\u091d\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0ed0\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0ed1"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u048a"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u0ed2"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0ed3\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\1\u07c4\16\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0ed4\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u018d\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u0345\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0ed5\16\140\1\u0ed6\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0ed7\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0ed8\1\140"+
+    "\1\u0ed9\1\u0eda\1\140\1\u0edb\1\140\1\u0edc\1\u0edd\1\u0ede"+
+    "\1\140\1\u0edf\1\140\1\u0553\1\u0ee0\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0ee1\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0ee2\20\140\1\131\2\0\1\u0631"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0ee3\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u03a4\3\140\1\u0ee4\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0ee5\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0ee6\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0ee7\1\140\1\u0ee8\1\140"+
+    "\1\u0ee9\2\140\1\u0eea\3\140\1\u0eeb\1\u0eec\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u0eed\11\140\1\u0eee"+
+    "\1\140\1\u0eef\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u09ee"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u0ef0\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+    "\1\u0ef1\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u0ef2\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0ef3\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0ef4"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0ef5\3\140"+
+    "\1\u06a2\4\140\1\u0ef6\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0ef7\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u0b60\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u0788\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u052f\5\140\1\u0ef8\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0ef9\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0efa\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u0efb\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0efc\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0efd\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0efe\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0eff\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u0a62\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u0325\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0f00\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0cfb\3\140\1\u0355\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u0f01\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u08a5\6\140\1\u0cdd\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u050e\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0ad6\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0f02\6\140"+
+    "\1\u0f03\5\140\1\u07c3\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\1\u061a\7\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0f04\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0f05\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u056e\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0f06\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0f07\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0dac\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0f08\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0f09\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u05fe\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0f0a\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0f0b\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u0224\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0f0c\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u0da4\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u0821\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u0f0d\11\140\1\u0f0e\1\131\2\0"+
+    "\1\140\2\0\16\140\1\u0f0f\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0f10\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0f11\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0f12\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0f13\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0f14\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u0f15\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0f16\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0f17\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0f18\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0891\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u0561\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u0c33\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0f19\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0f1a"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0503\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u033a\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u0f1b\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u0f1c\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0f1d\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0f1e\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u0f1f\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0f20\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u0cdd\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0f21"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+    "\1\u0f22\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\1\u0f23\7\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0f24"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0f25"+
+    "\2\140\1\u0f26\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u0c41\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0f24\11\140\1\u0325\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0f27\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u0f28\13\140\1\u0582\3\140\1\u0f29"+
+    "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0f2a"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0f2b"+
+    "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0877"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0f2c\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0f2d\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0f2e\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0f2f\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\22\140\1\u0f30\1\140\1\131"+
+    "\2\0\1\u0cf3\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0f31\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u0f32\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0f33\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0f34\11\140\1\u0f35\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0f36\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0f37\3\140"+
+    "\1\u03a4\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0f38\1\140\1\u0f39\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0f3a\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u0f3b\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u0f3c\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0f3d\1\u0f3e\1\u0f3f\1\u0f40\1\u0f41\1\u0f42\1\u0610"+
+    "\1\u0f43\1\u0f44\1\u0f45\2\140\1\u0f46\1\u0f47\1\u0f48\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\1\u061a\7\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0f49"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0f4a"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0f4b"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0f4c"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0f4d"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0f4e"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0f4f"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0f50\1\140"+
+    "\1\u0f51\1\u0839\3\140\1\u03a2\1\140\1\u083a\3\140\1\u0aac"+
+    "\6\140\1\131\2\0\1\140\2\0\1\u0555\16\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u0f52\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+    "\1\u0f53\16\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u0f54\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u0f55\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u0f56\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140"+
+    "\1\u0f57\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0f58\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0f59\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u0f5a\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u01af\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0f5b\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0f5c"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0f5d"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\u035b\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u07c9\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0f5e\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0f5f\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u0f60\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\1\131\1\u0f61\4\131\1\0\2\131\1\u0f61\1\131\4\u0f61"+
+    "\1\131\1\0\1\131\1\0\3\131\1\0\1\131\1\u0f61"+
+    "\13\0\4\131\3\u0f61\6\131\2\u0f61\4\131\1\u0f61\1\131"+
+    "\2\0\1\131\2\0\1\131\1\u0f61\3\131\1\u0f61\6\131"+
+    "\1\u0f61\2\131\1\0\1\131\3\u0f61\1\131\3\u0f61\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u056a\1\140"+
+    "\1\u0f62\3\140\1\u0449\1\u0f63\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0f64\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0ee2\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0f65\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0f66\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0f67\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0e28\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0f68\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0f69\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0f6a\7\140\1\u0c7c\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0f6b\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0f6c\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0f6d\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0f6e\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u0f6f\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0f70\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0527\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u0f71\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0f72\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0f73\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0f74\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0f75\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0f76\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0f77\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0f78\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0f79\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0f7a\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0f7b\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0f7c\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u0f7d\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\1\u0f7e\16\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\5\140\1\u0f7f\16\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\12\140\1\u035c\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\22\0\1\u0f80\36\0\1\u0f80\134\0\1\u0f81"+
+    "\137\0\1\u0c99\137\0\1\u0f82\136\0\1\u0708\145\0\1\u0c9c"+
+    "\1\0\1\u0c9d\127\0\1\u06ff\135\0\1\u0f83\143\0\1\u0f84"+
+    "\126\0\1\u0f85\57\0\2\64\1\0\1\64\1\0\2\64"+
+    "\2\0\6\64\1\0\20\64\1\u02a9\5\64\1\0\35\64"+
+    "\1\u02a9\1\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+    "\2\0\6\64\1\0\26\64\1\0\21\64\1\373\15\64"+
+    "\1\0\2\64\1\373\27\64\1\0\1\64\1\0\2\64"+
+    "\2\0\4\64\1\u0f86\1\64\1\0\26\64\1\0\17\64"+
+    "\1\u0f86\17\64\1\0\30\64\16\0\1\u0f87\40\0\1\u0f87"+
+    "\57\0\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u02da\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0f88\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u03b7\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u014c\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0f89\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u01d6\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\16\0\1\u0f8a\40\0\1\u0f8a\75\0\1\u0f8b\40\0"+
+    "\1\u0f8b\57\0\1\131\10\0\3\140\1\u0f8c\2\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u0a9a\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u0f8d\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0f8e\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\4\140\1\u0f8f\1\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\5\140\1\u074c\11\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0f90\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u0f91\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0f92"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0f93"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u085a"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0f94\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0f95\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u0f96\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u052c\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0f97\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\21\140\1\u0f98\2\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0a01\1\140\1\u09fe\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0f99\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0f9a\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0325\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u0f9b\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0f9c\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u0f9d\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0f9e\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u0527\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u0cca\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u0f9f\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u0fa0\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0f79\4\140\1\u0fa1\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0fa2\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u0fa3\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0936\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0fa4\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0fa5\1\140\1\u0936"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0fa6\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u0fa7\4\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0fa8\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0fa9\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0faa\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0cd9\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0fab\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0fac\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0fad\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0fae\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0326\20\140\1\u0faf\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0fb0\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u0fb1\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0fb2\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0363\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\17\140\1\u0fb3\4\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0e5a\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0fb4\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0fb5\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\22\140\1\u0fb6\1\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0fb7\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0326\1\140\1\u0fb8"+
+    "\1\u0fb9\1\140\1\u0fba\1\u0fbb\4\140\1\u0fbc\5\140\1\u0faf"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0fbd\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0fbe\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0fbf\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0fc0\1\140"+
+    "\1\u0fc1\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u0fc2\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u0fc3\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+    "\1\u0fc4\16\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u0fc5\5\140\1\u06a5\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0fc6\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u0fc7\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0473\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0352\1\u0fc8\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u0fc9\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0dd5\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u0fca\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0fcb\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0fcc\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u0fcd\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u0fce\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u0fcf\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u06d9\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\23\140\1\u0fd0\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0fd1\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0fd2\3\140\1\u0fd3\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0fd4\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0fd5\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u0fd6\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0fd7\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0fd8\6\140\1\u037c\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0511\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0fd9\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u0fda\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0fdb\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u0fdc\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u0fdd\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u0fde\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u0fdf\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0fe0\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0fe1\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0fe2\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0fe3\2\140\1\u0fe4\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0a08\6\140\1\u0fe5\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0fe6\20\140"+
+    "\1\131\2\0\1\u0906\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0fe7\2\140\1\u0fe8"+
+    "\1\u0fe9\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+    "\1\u0899\10\140\1\u0fea\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0feb\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0fec\2\140\1\u0fed\6\140\1\u089f\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0fee\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0fef\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u03a4\3\140"+
+    "\1\u0ff0\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0ff1\1\u0ff2\16\140\1\u01a0\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0ff3\4\140\1\u0ff4\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0ff5\1\u0ff6\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0ff7\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0ff8\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u0ff9\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0ffa\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u0ffb\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0ffc\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0ffd\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u0ffe\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\22\140\1\u0fff\1\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1000\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u1001\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u1002\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1003\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1004\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1005\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1006\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1007\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0670\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1008\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u1009\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u100a\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u100b\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\1\u100c\16\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0a5c"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u100d"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0a56"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u100e"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u100f"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0363"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1010"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1011"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0460"+
+    "\11\140\1\u0569\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1012\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0a3d\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u078e\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+    "\1\u1013\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1014"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1015"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1016"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u03df"+
+    "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u07c4"+
+    "\7\140\1\u1017\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u1018\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u1019\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u075d\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u101a\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u101b\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u101c\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u101d\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+    "\1\u101e\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u101f"+
+    "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0449"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1020\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1021\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u1022\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u08ae\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1023\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1024"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1025"+
+    "\1\u1026\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1027\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u1028\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1029\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u102a\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140"+
+    "\1\u102b\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u102c\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u102d\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u102e\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u102f\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1030\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u1031\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u074e\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0256"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1032"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1033"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1034\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1035\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1036\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u1037\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1038\14\140\1\u0224"+
+    "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1039"+
+    "\1\140\1\u103a\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u103b"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u103c\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u0acf\1\u0da4\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u103d\16\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u0329\2\140\1\u0748\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u084a\6\140\1\u0acf\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u103e\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u103f\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u0363\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1040\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1041\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1042\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u1043\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\12\140\1\u1044\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1045\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1046\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1047\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u035c\22\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u1048\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1049\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u104a\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0398\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u104b\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u104c\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u104d\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u104e\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u104f\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1050\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0449\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u07a8\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1051"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u05de\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u056a\3\140\1\u07fc\3\140\1\u0aac\3\140\1\u1052\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1053\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u0b84\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1054\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u075a\4\140\1\u1055\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1056\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1057\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1058\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0a9a\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u1059\13\140\1\u105a"+
+    "\1\140\1\u105b\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u105c\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u105d\1\140\1\u0375\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u105e\6\140\1\u082b\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u056e\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u105f\2\140\1\u0b66\1\140"+
+    "\1\u1060\1\u1061\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u0398\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u0325\4\140\1\u0527\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\12\140\1\u1062\1\u1063\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u1064\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u1065\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1066\1\140\1\u0527\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1067\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1068\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1069\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0c1a\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u0615\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u106a\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0ed5\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u0bf3\4\140\1\u0acf\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0f79\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u106b\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u106c\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0393\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u106d\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u106e\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u106f\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u1070\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1071\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u0a9a\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1072\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u1073\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1074\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u1075\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1076\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1077\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0607\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0363\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\23\140\1\u07c3\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1078\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\6\140\1\u1079"+
+    "\1\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0325\5\140\1\u0569\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u107a\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u107b\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u107c\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u05d7\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u107d\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u107e\3\140\1\u0fd3\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u107f\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u1080\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\u1081\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u1082\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0629\3\140\1\u1083\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\1\140\1\u1084\6\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u1085\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\14\140\1\u1086\2\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u1087\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u06a1\11\140\1\u1088\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1089\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u0667\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u108a\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u039a\2\140\1\u0891\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131";
+
+  private static final String ZZ_TRANS_PACKED_3 =
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\6\140\1\u108b\1\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u108c\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u108d\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u085a\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\1\u085a\16\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u108e\1\140\1\u108f"+
+    "\1\140\1\u1090\2\140\1\u1091\4\140\1\u1092\6\140\1\131"+
+    "\2\0\1\140\2\0\1\u1093\16\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u108b\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u06dc\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1094\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1095\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1096\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1097\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1098\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1099\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u109a\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u109b\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u109c\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u109d\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u109e\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u05e3\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0e4f\12\140"+
+    "\1\u109f\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u10a0"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0363\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u10a1\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0a64\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u08f6\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u0e0d\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u06d9\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u10a2\20\140\1\131\2\0"+
+    "\1\u10a3\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u10a4\2\140\1\u0dbd\1\u10a5\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u10a6\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u10a7\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u0bc1\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u10a8\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u10a9\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u10aa\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u10ab\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0b80\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u10ac\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u10ad\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u10ae\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0360\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u10af\1\140\1\u10b0\2\140\1\u10b1\1\u10b2\1\u10b3\4\140"+
+    "\1\u10b4\5\140\1\u07c3\1\131\2\0\1\140\2\0\1\u01ce"+
+    "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\21\140\1\u0c16\2\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u10b5\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u10b6\15\140\1\u10b7\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u10b8\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u10b9\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u10ba\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u10bb\5\140\1\u10bc\4\140\1\u10bd"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u10be\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u10bf\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u10c0\5\140\1\u10c1"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u10c2\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u039a\2\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u10c3\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u10c4\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u10c5\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\1\u10c6\16\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\12\140\1\u0e0e\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u10c7\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u10c8\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u10c9\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u10ca\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u10cb\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\12\140\1\u10cc\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0364\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u10cd\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u050e\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u10ce\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u10cf\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u10c0\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\1\u0c6a\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u10d0\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u10ab\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\5\140\1\u10d1\4\140\1\u10d2\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u10d3\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u074d\5\140\1\u050e"+
+    "\2\140\1\u10d4\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u10d5\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u10d6\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u10d7\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u10d8\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u10d9\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u10da\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u050b"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u074d\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u10db\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u10dc\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u10dd\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u10de\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u10df\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0348\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u10e0\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u10e1\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u10e2\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u10e3\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0925\1\140\1\u0e2e\16\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u10e4\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u10e5\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u10e6\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u10e7\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u10e8\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u10e9\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u10ea\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u10eb\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u10ec\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u10ed\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u052f\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u10ee\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u10ef\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u10f0\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u10f1\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u10f2\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u02dd\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u10f3\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u10f4\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0224\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u10f5\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u10f6\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u10f7\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u10f8\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u10f9\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0561"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u10fa"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u10fb"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0b02\1\140"+
+    "\1\u10fc\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u10fd\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u10fe\1\140\1\u10ff\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1100\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\21\140\1\u1101\2\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0237\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1102\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u083d\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u1103\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1104\3\140\1\u1102\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1105\1\140\1\u1106\1\140\1\u1107\1\140\1\u1108"+
+    "\1\140\1\u1109\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u110a\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u110b"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u110c\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u07d0\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u110d"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u110e\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u110f\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1110\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1111\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1112"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1113"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1114\12\140"+
+    "\1\u1115\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1116\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u1117\1\140\1\u1118\1\140\1\u1119\1\140\1\u111a"+
+    "\1\140\1\u111b\3\140\1\u10c0\1\u0d7e\1\140\1\u111c\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\1\u111d\16\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u111e\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u111f\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u0355\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1120\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1121\12\140\1\u039a"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1122"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1123\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1124\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u1125\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1126\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u1127\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u1128\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1129\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u112a\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u112b\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u08ab\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u112c\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u112d\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u112e\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u112f\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u0237\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1130\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u1131\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1132\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u1133\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1134\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1135\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+    "\1\u1136\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1137"+
+    "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1138"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1139"+
+    "\4\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u113a\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u113b\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u113c\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u113d\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u10c8\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u113e\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u10c8\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u113f\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\17\140\1\u1140\4\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u1141\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u1142\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u1143\2\140\1\u1144\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0998\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1145\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1146\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0925\11\140"+
+    "\1\u0eaf\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1147"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1148\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u05f2\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1149\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u114a\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u114b\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u114c\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u114d\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u114e\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u114f\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0bcc\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\22\140\1\u1150\1\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u1151\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0e2d\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1152\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1153\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u1154\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1155\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u03df\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u1156\4\140\1\u0eb0\1\u1157\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\12\140\1\u1158\11\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\5\140\1\u01b7\6\140\1\u0224\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u1159\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u115a\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u115b\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u115c\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u115d\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\1\u115e\16\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u115f\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u0ec6\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u0fa0\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1160\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u02dd\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0ea9\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u1161\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u1162\1\u01ac\3\140\1\u1163"+
+    "\1\140\1\u07f4\7\140\1\u1010\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u1164\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\23\140\1\u10fc\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1165\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1166\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\23\140\1\u1167\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u1168\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0388\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1169\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u116a\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u116b\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u116c\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u116d\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1050\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u116e\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u116f\3\140\1\u1083\6\140\1\u1170\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\u1171\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1172\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u1173\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1174\4\140\1\u0629\3\140\1\u0bd6\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1175\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1176\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1177\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u1178\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u1179\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\5\140\1\u01c5\1\140\1\u117a"+
+    "\1\u117b\4\140\1\u117c\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u117d\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u01c5\7\140\1\u0662\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u117e\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\17\140\1\u117f\4\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0fa1\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\23\140\1\u1180\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1181\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0239\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u0cef\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1182\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1183"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u105f"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1184"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1185"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1186"+
+    "\7\140\1\u1187\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0ff1\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u1188\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u1189\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0345\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u118a\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u118b\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u118c\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u118d\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u118e\1\140\1\u118f\1\u103d\1\u084a\2\140\1\u1190"+
+    "\3\140\1\u1191\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1192\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u1193\4\140\1\u1194\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1195\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1196\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u052b\2\140\1\u1197\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1198\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1199\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u119a\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u119b\2\140\1\u0d02"+
+    "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0bff"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u119c"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u119d"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u119e"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u119f"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u11a0"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u11a1"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u11a2"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u07ad"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u11a3"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u100c\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\12\140\1\u11a4\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u11a5\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u11a6\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\u11a7\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u11a8\6\140\1\u01af\10\140\1\u11a9\1\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u11aa\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0853\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u11ab\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u11ac\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u03a4\3\140\1\u03f8\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u11ad\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u11ae\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u11af\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u11b0\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u11b1\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u02dd\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\22\140\1\u05fe\1\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u11b2\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u0348\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u11b3\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u11b4\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\22\140\1\u11b5\1\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u11b6\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u11b7\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u11b8\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0919\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u11b9\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u11ba\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u11bb\1\u11bc\5\140\1\u0553"+
+    "\1\140\1\131\2\0\1\u11bd\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u11be\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u11bf\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u11c0\2\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u11c1\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u11c2\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u11c3\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u11c4\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u07c5\4\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u11c5\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0794\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u11c6\22\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u11c7\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u11c8\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u11c9\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u11ca\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u11cb\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u11cc\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u11cd\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u11ce\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u11cf\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u11d0\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u11d1\2\140\1\u11d2\2\140\1\u11d3"+
+    "\3\140\1\u11d4\1\140\1\u11d5\1\u11d6\1\140\1\u11d7\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u11d8\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u11d9\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u0352\1\u11da\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u11db\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u11dc\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u11dd\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u11de\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u11df\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u11e0\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\u11e1\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u11e2\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u11e3\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u11e4\14\140\1\u11e5\4\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u11e6\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u11e7\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u11e8\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u11e9\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u11ea\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1057\3\140"+
+    "\1\u11eb\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u11ec\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0ee2\4\140\1\u0d66\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u11ed\2\140\1\u0dbd\1\u11ee\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u11ef\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u039a\1\140\1\u11f0\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u075b\14\140\1\u089f\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0bbf\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u11f1\3\140\1\u11f2\3\140"+
+    "\1\u03f8\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0ff1\2\140\1\u11f3\14\140\1\u11f4\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u11f5\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\u11f6\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u11f7"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u07e3\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u11f8\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u11f9"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0a4e"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u11fa\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u10b9\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u11fb\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u11fc\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u11fd\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u11fe\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u11ff\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u1200\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1201\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u1202\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1203\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1204"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1205\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1206"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\u1207\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u1208\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1209\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u120a\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\1\131\1\u0243"+
+    "\4\131\1\0\2\131\1\u0243\1\131\4\u0243\1\131\1\0"+
+    "\1\131\1\0\3\131\1\0\1\131\1\u0243\13\0\4\131"+
+    "\3\u0243\6\131\2\u0243\4\131\1\u0243\1\131\2\0\1\131"+
+    "\2\0\1\131\1\u0243\3\131\1\u0243\6\131\1\u0243\2\131"+
+    "\1\0\1\131\3\u0243\1\131\3\u0243\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u120b\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u0529\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u03df\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u120c\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0363\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u120d\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u120e\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u120f\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\1\u1210\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\22\140\1\u1211\1\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1212\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u1213\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1214\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u1215\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1216\1\u1217\2\140\1\u1218\3\140\1\u1219\1\u121a\4\140"+
+    "\1\u121b\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u121c\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u121d\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u121e\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u121f\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u1220\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1221"+
+    "\2\140\1\u1222\4\140\1\u1223\5\140\1\u1224\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1225\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1226\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u1227\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1228\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1229\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u122a\22\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0360\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0bef\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0398\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\1\u0350"+
+    "\16\140\1\0\10\140\17\0\1\u122b\150\0\1\u122c\200\0"+
+    "\1\u0708\74\0\1\u122d\162\0\1\u122e\144\0\1\u122f\53\0"+
+    "\2\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+    "\1\64\1\u1230\24\64\1\0\15\64\1\u1230\21\64\1\0"+
+    "\30\64\17\0\1\u1231\117\0\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u02d5\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u1232\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\17\0\1\u1233\136\0\1\u1234\117\0"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\2\140\1\u1235\14\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1236"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0695\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\1\140\1\u1237\15\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1238\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1239\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u123a\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u123b\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0b42\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u123c\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u123d\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u07a8\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0cc0\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u123e\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0237\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u08ab\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u104d\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u123f\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u1240\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1241\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u1242\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u0f9c\16\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u1243\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\23\140\1\u1244\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1245\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u1246\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u1247\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1248\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1249\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u124a\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u124b\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u124c\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u124d\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u085a\4\140\1\u124e\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\23\140\1\u124f\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1250\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\12\140\1\u1251\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1252\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1253\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1254"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1255"+
+    "\5\140\1\u1256\1\u1257\11\140\1\u1258\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1259\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u125a\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u125b\7\140\1\131\2\0\1\u125c"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u125d\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0cdf\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u125e\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u125f\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\17\140\1\u0bd0\4\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1260\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1261\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u1262\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\17\140\1\u1263\4\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1264\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\12\140\1\u1265\11\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\7\140\1\u0508\1\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\7\140\1\u0224\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u0cfa\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1266\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1267\1\140\1\u1268\7\140\1\u1269"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u126a"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u126b"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\7\140\1\u126c\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u126d\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u126e\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0561\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0375\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u126f\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0d60\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u1270\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1271\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1272\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\5\140\1\u1273\1\u1267\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0360\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1274\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1275\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1276\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1277\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1278\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1277\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1279\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u127a\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u033a\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0484\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u127b\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\17\140\1\u127c\4\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0853\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u127d\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u127e\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u127f\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u08f6\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u1280\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u1281\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1282\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1283\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1284\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u0c0b\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1285\1\u1286\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1083\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1287\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u1288\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u05d7\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0629\3\140\1\u1289"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u128a"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u128b"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u128c\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u128d\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u11aa\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u128e\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u128f\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u1290\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u1291\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1292\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1293\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u1294\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1295"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1296"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1297"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1298"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1299\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1094\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u129a\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u129b\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u0cba\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u097e\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u129c\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u129d\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u129e\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u0aeb\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u129f\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u085a\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u07be\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u07f4\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\5\140\1\u12a0\16\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u08aa\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u12a1\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u12a2\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\17\140\1\u12a3\4\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\1\140\1\u0224\4\140\1\u0224\1\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u12a4\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u100e\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\17\140\1\u12a5\4\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u12a6\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u03a2\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u056e\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u12a7\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\5\140\1\u0224\3\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\6\140\1\u0224\1\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0c1a\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u12a8\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u12a9\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0224\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\1\u12aa\7\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\u0593\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\23\140\1\u12ab\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\u0331\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u12ac"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0421\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u12ad\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u12ae\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u12af\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u12b0\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u12b1\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0ef3\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0421\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u12b1\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u12b2\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u12b3\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\5\140\1\u12b4\16\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u12b5\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u12b6\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u12b7\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u12b8\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u12b9\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u12ba\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u12bb\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u081e\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u12bc\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u0e34\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u12bd\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u12be\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u12bf\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0846\3\140\1\u0848\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0596\1\u0acf\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0820\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u12c0\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u12c1\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u12c2\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u12c3\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u12c4\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u12c5\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u12c6\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u12c7\4\140\1\u12c8\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u12c9\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u12ca\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u12cb\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u0e34\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u12cc\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u12cd\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u12ce\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u12cf"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u12d0\1\140\1\u12d1\16\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0c25\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u089f\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u0ac8\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u12d2\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u12d3\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0d86\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u0355\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\23\140\1\u12d4\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u12d5\3\140\1\u12d6\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u12d7\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u12d8\7\140\1\u12d9\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u12da\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u12db\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u12dc\3\140\1\u11a9\1\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u12dd\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0fd3\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0b66\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u12de\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0528\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u12df\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u12e0\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u12e1\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\5\140\1\u12e2\16\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u12e3\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u12e4\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\17\140\1\u12e5\4\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u12e6\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u12e7\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u12e8\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u12e9\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u12ea\1\u12eb\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u12ec\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u12ed\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u12ee\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\21\140\1\u12ef\2\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u12f0\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0256\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u0325\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0e12\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u12f1\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u12f2\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u12f3\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u12f4"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u052c\1\u033a\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\1\140\1\u1244\6\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u12f5\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u1081\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u12f6\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u12f7\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u12f8\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u12f9\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u12fa\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u12fb\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u061e\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u12fc\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u12fd\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0a11\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\4\140\1\u12fe\4\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u12ff\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u1300\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u10ea\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1301\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\5\140\1\u0224"+
+    "\2\140\1\131\10\0\6\140\1\0\10\140\1\u0378\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u07c4"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1302"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1303"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1304\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1305\6\140"+
+    "\1\u1306\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u1307\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1308\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u07c4\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1309"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u130a\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1178\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u130b\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u130c\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u130d\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u130e\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u130f\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0b08\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1310\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u1311\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1312\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1313\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1314\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1315\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1316\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1317\3\140\1\u1318\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u1319\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u131a\1\140\1\u1051"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u131b\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u131c\1\u131d"+
+    "\1\140\1\u131e\1\u0509\3\140\1\u131f\3\140\1\u0569\1\u1320"+
+    "\1\u1321\1\140\1\u1322\3\140\1\131\2\0\1\140\2\0"+
+    "\1\u1323\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u0e34\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u037c\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u08ab\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0a9a\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\22\140\1\u1324\1\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1325\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1326\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u1327\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1328\5\140\1\u0cf8\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u10fe\1\140\1\u1329\5\140\1\u132a"+
+    "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u132b"+
+    "\3\140\1\u132c\3\140\1\u03f8\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u132d\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0569\7\140\1\u132e\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u132f\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u07c1\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\1\u0555\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\22\140\1\u10c8\1\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\12\140\1\u02db\4\140\1\u1330\4\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1331\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u1332\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1333\5\140\1\u1334\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1335\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u0824\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u1336\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u10c6\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0dff\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0569\7\140\1\u0853\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1337\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\5\140\1\u0928\16\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u1338\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1339\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u133a\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u133b\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u133c\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u0cd3\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u133d\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0364\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u133e\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u133f\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1340\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1341\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1342\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u053a\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1343\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1344\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u1345\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1346\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1347\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1348\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u1349\1\140\1\u05de"+
+    "\5\140\1\u07f4\1\u134a\2\140\1\u134b\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u134c\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u134d\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u09ed\6\140\1\u050e\1\u134e\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u134f\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1350\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1351\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u1352\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u0cdd\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1353\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1354\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0869\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1355\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u033a\2\140\1\u1356\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1357\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1358\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1359\2\140"+
+    "\1\u135a\1\140\1\u135b\1\u135c\1\u135d\2\140\1\u0352\1\140"+
+    "\1\u135e\1\u135f\5\140\1\131\2\0\1\140\2\0\1\u01ce"+
+    "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1360\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u1361\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1362\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1363"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u1364\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u1365\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1366\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1367"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1368\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1369\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u136a\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u136b\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u035c\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\21\140\1\u136c\2\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u136d\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u136e\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\17\140\1\u035c\4\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0fdc\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u074e\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u136f\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1370\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u1371\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1372\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u1373\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u1374\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u1375\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1376\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\u1377\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1378\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1379\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u137a\22\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u137b\4\140\1\u137c\3\140\1\u137d\6\140\1\u137e\1\140"+
+    "\1\u082d\1\u137f\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1380\6\140\1\u1381\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u1382\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1383\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\5\140\1\u1384\16\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u1385\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1386\3\140\1\u1387\1\u1388\1\140\1\u1389\1\140"+
+    "\1\u138a\1\u0e38\6\140\1\u138b\1\131\2\0\1\140\2\0"+
+    "\1\u138c\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u110f\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u138d\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\21\140\1\u0363\2\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u138e\1\140\1\u138f\2\140\1\u1384\1\140\1\u1390"+
+    "\1\140\1\u1391\1\u1392\2\140\1\u1393\1\u1394\3\140\1\u082d"+
+    "\1\u1395\1\131\2\0\1\140\2\0\1\u1396\16\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1397\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u1398\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u039a\3\140\1\u0853\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1399\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u139a\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u139b\5\140\1\u133c\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u139c\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u139d\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u139e"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u139f\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u13a0"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u13a1"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u13a2"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u13a3"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0b52"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u13a4\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u13a5\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u13a6\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0449\1\u0670\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u13a7\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u13a8\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u13a9\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u108d\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u03a2\10\140\1\u0788\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u13aa\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u13ab\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u13ac\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u03e5\10\140"+
+    "\1\u13ad\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u13ae\1\u08d8\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u13af\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u13b0\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\4\140"+
+    "\1\u13b1\3\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u13b2\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u13b3\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\1\140\1\u13b4"+
+    "\6\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u13b5\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0924\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u13b6\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u13b7\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u13b8\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u13b9\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u13ba\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+    "\1\u1339\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u032a\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u13bb\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u13bc\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u13bd\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+    "\1\u13be\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u13bf\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u13c0"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u13c1"+
+    "\2\140\1\u09a6\1\u13c2\2\140\1\u13c3\1\u13c4\1\140\1\u0352"+
+    "\1\140\1\u13c5\4\140\1\u13c6\1\140\1\131\2\0\1\u13c7"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u13c8\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u13c9\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u13ca\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u13cb\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u13cc\14\140\1\u10d9\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u13cd\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u13ce\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\1\u13cf"+
+    "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u13d0\1\u0eb1\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u13d1\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u13d2\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u13d3\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u13d4\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u13d5\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u13d6\7\140\1\u1156\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u06d9\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u13d7\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u13d8\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u13d9\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u13da\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u13db\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u07c4\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u13dc\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u13dd\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u13de\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u13df\1\u0cf6\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0eb7\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u13e0\4\140\1\u13e1\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u13e2\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u13e3\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u13e4\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u13e5\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u13e6\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u13e7\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u13e8\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u13e9\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u13ea\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u13eb\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u13ec\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0842\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u07be\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u13ed\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u13ee\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u05f8\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u0596\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u091d\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u13ef\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u13f0\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0cfb\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0922\3\140\1\u13f1\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u13f2\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\12\140\1\u13f3\11\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0cc7\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u09f9\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u13f4\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\1\u13f5\7\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u13f6\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u13f7\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u13f8\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\22\140\1\u13f9\1\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u13fa\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u13fb\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u13fc\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u042f\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u052c\1\u033a\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u0421\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\17\140\1\u13fd\4\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u13fe\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u13ff\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u1400\4\140\1\u1401"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1402"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u052b"+
+    "\2\140\1\u1403\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\u1404\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1405"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1406"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1407"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1408"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1409"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u140a"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u140b"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u140c"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u140d"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u140e\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u140f\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1410\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1411\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1412\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1413\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1414\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1415\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1094\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1416\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u1417\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u1418\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u05c6\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u1419\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0a06\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\21\140\1\u0a4c\2\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u06ae\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u141a\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\12\140\1\u141b\11\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u141c\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u141d\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u141e\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u141f\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u1420\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1421\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u1422\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1423\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0bc9\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1424"+
+    "\4\140\1\u056a\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u05da\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1425"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1426\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u1427\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1428\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u1429\7\140\1\u142a\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u142b\14\140\1\u08aa\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\21\140\1\u142c\2\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u042f\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u142d\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u085a\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u142e\4\140\1\u142f\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0857\4\140"+
+    "\1\u1430\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1431\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1432\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1433\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1434"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\1\u1435\7\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0b80\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\22\140\1\u1436\1\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1437\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1438\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\17\140\1\u1439\4\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u143a\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u143b\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u143c\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u143d\1\u06d9\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u143e\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u06d9\16\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u143f\1\140\1\u06d9\15\140\1\u07a8\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1440\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1441\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u1442\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1443\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1444\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1445\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u1446\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1447\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1448\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1449\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u079c\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u144a\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u144b\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u144c\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u144d\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u144e\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u119c\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u144f\2\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1450\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u1451\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u033a\2\140\1\u1452\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1453\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1454\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1455\1\140"+
+    "\1\u0bc5\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1456\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1457\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u1458\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1459\4\140\1\u145a\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u145b\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0423\12\140\1\u037c\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u145c\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u145d\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u145e\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u145f\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u06a1\4\140\1\u1460\7\140\1\u03a3\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1461\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1462\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1463\2\140\1\u1464\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0aed\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0aee\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1465\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1466\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1244\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1467\12\140\1\u1468\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1178\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1469\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u146a\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u146b\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u08f9\1\u07fb"+
+    "\1\u146c\1\u0bdf\4\140\1\u146d\1\140\1\u146e\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u146f\1\u1217\1\140\1\u10ca"+
+    "\1\u1470\1\u061d\1\u07b6\1\140\1\u1471\1\u0d8c\1\140\1\u052c"+
+    "\1\u1472\1\u1473\1\u1474\1\140\1\u0472\3\140\1\131\2\0"+
+    "\1\u07be\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1475\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1476\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u048a\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u1477\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\22\140\1\u0b40\1\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u0df3\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u1478\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1479\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u0421\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u0d51\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\21\140\1\u147a\2\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u147b\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u147c\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u147d\10\140\1\u147e\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u147f\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u1480\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1481\3\140\1\u1482"+
+    "\1\u1483\1\140\1\u051e\1\u1484\1\u1485\1\u1486\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1487\17\140\1\131"+
+    "\2\0";
+
+  private static final String ZZ_TRANS_PACKED_4 =
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u0cb9\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1488\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u1489\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u148a\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u148b\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1489\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u148c\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u148d\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u148e\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\21\140\1\u148f\2\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1490\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1491\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1492\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1493\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1494\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\17\140\1\u1495\4\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1496\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1497\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u0224\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1498\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u1499\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\64\0\1\u149a\131\0\1\u149b\143\0\1\u0f82"+
+    "\143\0\1\u149c\45\0\2\64\1\0\1\64\1\0\2\64"+
+    "\2\0\6\64\1\0\26\64\1\0\14\64\1\373\22\64"+
+    "\1\0\1\64\1\373\26\64\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\16\140"+
+    "\1\u0ca9\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\3\140\1\u074c"+
+    "\13\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u149d\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\1\140\1\u0745\4\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u149e\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u149f\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u14a0\12\140\1\u0582\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u14a1\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u14a2\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0bc5\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u14a3\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u14a4\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u07be\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u14a5\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u076b\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0ca4\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0836\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0839\3\140\1\u03a2\1\140\1\u083a\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u14a6\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u14a7\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u14a8\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0c30\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u14a9\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u14aa\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0d8f\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u037c\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u14ab\1\140\1\u14ac\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u08aa\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u14ad\11\140"+
+    "\1\131\2\0\1\140\2\0\1\u0555\16\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u14ae"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u14af"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u14b0"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u14b1"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0355\11\140"+
+    "\1\u14b2\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u14b3\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u14b4"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0397"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u14b5"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u14b6"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u14b7"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u14b8"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u14b9"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u14ba"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u14bb"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u14bc"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u14bd"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u14be"+
+    "\14\140\1\u14bf\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u14c0\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u14c1\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\1\u14c2"+
+    "\7\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u02dd\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u14c3"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u14c4\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0aac\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u14c5\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\1\140\1\u14c6\6\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0d35\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u14c7\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u14c8\7\140"+
+    "\1\u14c9\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u14ca\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u07c4"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\1\u14cb\7\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u14cc\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u14c9\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u14cd\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u14ce\14\140\1\u13b3"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u14c5"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u14cf"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u14d0\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u14d1\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u14d2"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\2\140\1\u14d3\5\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\1\u14d4\7\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u14d5\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u14d6\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u0596\2\140\1\u13b3"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u14d7"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u14d8"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u14d9"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u14da\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u14db\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u14dc\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u14dd\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u14de\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u0b0e\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u14df\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u14e0\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u14e1\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\23\140\1\u14e2\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u14e3\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u14e4\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u14e5\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u14e6\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u14e7\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u14e8\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\23\140\1\u14e9\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u14ea\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u01a0\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u14eb\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u14ec\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u121d\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u14ed\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u14ee\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u14ef\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u14f0\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u14f1"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u09f7\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u14f2\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u14f3"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u01af\2\140"+
+    "\1\u0569\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+    "\1\u14f4\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u14f5\5\140\1\u14f6\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u14f7\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u08ab\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u14f8\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u14f9\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0224\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u14fa\1\u14fb\3\140\1\u117b\1\140\1\u14fc\1\u1468"+
+    "\1\140\1\u14fd\5\140\1\u0ee0\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u12b1\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u14fe\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u108c\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u14ff\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1500"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u13a3\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u1501\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1502"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u03a4"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1503\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1504\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0363\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0d02\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1505\5\140"+
+    "\1\u1506\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u1507\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0557"+
+    "\2\140\1\u1508\2\140\1\u1509\1\u150a\3\140\1\u150b\1\140"+
+    "\1\u150c\6\140\1\131\2\0\1\140\2\0\1\u150d\16\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u150e\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u150f\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1510\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u035d"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1511\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0d89\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1512\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0363\14\140"+
+    "\1\u07c4\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1513\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1514\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1515\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u1516\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0d89\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+    "\1\u1517\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1518\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1519\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u151a\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u151b\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u151c\6\140"+
+    "\1\u151d\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u151e"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u151f"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1520"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1521"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1522"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1523\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1524\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\1\u0db5\7\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\12\140\1\u1061\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\5\140\1\u1525\16\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1526\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0b42\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u085a\4\140\1\u0224\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\5\140\1\u03df\16\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1527\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1528\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u10e2\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u1529\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u152a\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u152b\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u06cc\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u0224\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0a9a\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\21\140\1\u152c\2\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u0f97\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u152d\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u152e\6\140\1\u152f\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u1530\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u031e\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0db5\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1531\1\140\1\u1532"+
+    "\3\140\1\u1533\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u1534\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u0891\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\5\140\1\u061d\16\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1535\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1536\1\140\1\u1537\4\140\1\u0c25\2\140\1\u048a"+
+    "\3\140\1\u1538\1\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1539\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u153a\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u153b\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u153c\7\140\1\u0c25\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0db6\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u153d\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u153e\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u153f\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\5\140\1\u048a\16\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u06a1\2\140\1\u046d\7\140\1\u0eb2\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1540\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u1541\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0853\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u1083\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1542\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1543\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u1544\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1545\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1546\4\140\1\u08ba\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u1547\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u1548\2\140\1\u1549\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u154a\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u154b\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u154c\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u154d\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u137f\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u0ea5\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u154e\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0821\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u0aae\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u154f\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1550\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u1551\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u1552\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u1553\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u1554\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\21\140\1\u1555\2\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1556\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1557\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u1558\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1559\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u155a\5\140\1\u0224\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u155b\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u155c\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0921\1\140\1\u155d\1\140"+
+    "\1\u155e\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u155f\4\140\1\u0aba\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1560\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u1561\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1562\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1563\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1564\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u0325\6\140\1\u1565\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u1566\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u1567\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1568\4\140\1\u08ba\4\140"+
+    "\1\u1569\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u156a"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u156b\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u156c\6\140"+
+    "\1\u037c\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u156d"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0ee1"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u156e"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u156f"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u05ba"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0a0c"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1570"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u079c\6\140"+
+    "\1\u1571\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u1572\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1573\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+    "\1\u1574\1\u1575\1\u1576\5\140\1\u1577\2\140\1\u1578\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1579\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u051e\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u157a\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0375\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u157b\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u0a5d\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u157c\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u157d\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u157e\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u157f\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u1580\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0c16\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1581\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1582\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1583\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u042f\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1584\1\140\1\u05de\5\140\1\u07f4\1\u134a\2\140\1\u134b"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1585"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1586"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u056e\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u06c0"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1587"+
+    "\2\140\1\u1588\4\140\1\u051e\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1589\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u158a\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u0cc1\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0423\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u158b\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u158c\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u0752\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0ef3\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u119e\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u101a\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u158d\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0a9a\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0ab0\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u158e\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\23\140\1\u01af\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u06a0\12\140\1\u158f\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1590\1\140\1\u1591\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1592\3\140\1\u03a4"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1593"+
+    "\1\u1594\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1595\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+    "\1\u0cc1\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u0bf3\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u117b\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1596"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1597"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1598"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u1599"+
+    "\7\140\1\u159a\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u159b\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u159c\22\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u159d"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u159e\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u159f"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u15a0\1\0\1\u050e"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u15a1\1\140\1\u130a\1\u15a2\2\140\1\u07fe\1\u050e\1\u15a3"+
+    "\3\140\1\u15a4\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u050e\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u050e\2\140\1\u15a2\3\140\1\u050e\1\u15a5\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u15a6\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u07b1\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u15a7\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u056e\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0159\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u15a8\3\140\1\u15a9"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u15aa"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u15ab\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u15ac\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u15ad\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u15ae\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u15af\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u15b0\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u15b1\7\140"+
+    "\1\u15b2\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u15b3"+
+    "\5\140\1\u15b4\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u15b5\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u15b6"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u15b7"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u15b8"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u15b9"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0853"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1367"+
+    "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0d7b"+
+    "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u15ba"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u15bb"+
+    "\4\140\1\u15bc\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u15bd\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u15be\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u15bf"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u15c0"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u10b9"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u15c1"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u15c2"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u15c3"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u15b1"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u15c4"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u15c5"+
+    "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u15c6\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u15c7\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u15c8\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u15c9\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u15ca\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u15cb\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u15cc\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u15cd\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\23\140\1\u15ce\1\131\2\0\1\u042f"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u15cf\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u15d0\1\u15d1\1\u15d2\2\140\1\u0329\3\140\1\u15d3"+
+    "\3\140\1\u15d4\2\140\1\u15d5\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\4\140\1\u0a20\3\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u15d6\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u15d7\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u15d8\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u15d9\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u110c\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u15da\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u15db\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u15dc\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\23\140\1\u15dd\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0c08\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u15de\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u05da\4\140\1\u051e\2\140\1\u0ed3\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0a51\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u035c\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u15df\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u15e0\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\23\140\1\u15e1\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u15e2\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u15e3\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u15e4\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u03eb\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u15e5\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\21\140\1\u15e6\2\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\1\140\1\u0336\6\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u15e7\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u15e8\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u15e9\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u15ea\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u15eb\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u15ec\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u15ed\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u15ee\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u15ef\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u15f0\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u15f1\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u03ac\3\140\1\u0159\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u15f2\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u15f3\15\140\1\u15f4\2\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u15f5\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u15f6\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\14\140\1\u15f7\2\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u15f8\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u15f9\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u1156\4\140\1\u15fa\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u15fb\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u15fc\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u1431\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u15fd\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u15fe\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0ec6\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u15ff\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1154\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u1600\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u1601\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u1602\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u07a8\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u1112\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1603\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u1604\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\22\140\1\u0553\1\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\23\140\1\u1075\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1605\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u1606\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u1349\1\140\1\u1607\5\140\1\u1608\1\u1609"+
+    "\2\140\1\u0569\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u160a\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u160b\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u160c\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u160d\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u160e\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u160f\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0a07\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u1610\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\12\140\1\u1611\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1612\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1613\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1614"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1615\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1616\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1617\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0cc1\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1618\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u1619\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u161a\5\140\1\u0eb2"+
+    "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u161b"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u085a"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u161c"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u161d"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u161e\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u161f\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1620\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u0fff\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1621\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u1622\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\17\140\1\u0b0e\4\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\21\140\1\u1623\2\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1624\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u1625\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\u1626\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1627\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1628\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u1629\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u162a\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u07f3\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u162b\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u162c"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u162d"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u162e"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u162f"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u1630\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u1631\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1632\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1633\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1634\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1635\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u1636\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u1637\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u1638\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1639\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0b4e\17\140\1\u163a\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u163b\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u163c\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0316\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u1213\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u048a\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\12\140\1\u163d\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u163e"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u01a0\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u141e\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1071\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u163f"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1640"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1641"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u1642"+
+    "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1643"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u037c\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1644\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1645\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1646\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\1\u1647\16\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u1648\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u1649\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u164a\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u164b\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u164c\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\1\u164d\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u164e\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u164f\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1650\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1651\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u1652\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1653\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u1654\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0f24"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u1655\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1656\1\u1657"+
+    "\1\u1658\1\u1659\1\140\1\u07c3\1\140\1\u165a\1\u1657\1\u165b"+
+    "\3\140\1\u165c\1\u165d\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u165e\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u165f\22\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0561\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u039a\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1660\11\140\1\u1661\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u1662\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u1663\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1664\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u1665\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u1666\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1667\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1668\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u1669\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u166a\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u166b\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u166c\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u166d\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u14e3\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u166e"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1669\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u166f\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1670\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1671"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1672\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1673\22\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u1674\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1675\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1676\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1677\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u1678\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u1679\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u167a\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u167b\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u167c\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u05ec\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u167d\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u167e\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u0569\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\1\u061a\7\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u167f\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u119e\3\140\1\u1680\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1681\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1682\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u1683\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1684\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0217\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u1685\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u1686\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u1687\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1688\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1689\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u168a\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u168b\2\140\1\u168c\1\u05aa\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\5\140\1\u168d\16\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u03a4\3\140\1\u0bc1\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u03df\1\140\1\u0471"+
+    "\1\140\1\u0527\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\1\u06dd"+
+    "\7\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u06d9"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u168e\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u03eb\6\140\1\u03df\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u168f\11\140\1\u0527\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u06dd\5\140\1\u1690\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u09ed\1\140\1\u1691"+
+    "\1\140\1\u1692\1\u1693\4\140\1\u1694\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u1695\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u1331\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u1696\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1697\2\140\1\u0601\1\u1698"+
+    "\2\140\1\u051e\7\140\1\u10ab\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1699\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u169a\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u169b\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u169c\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u169d\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0503\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u169e"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u169f"+
+    "\4\140\1\u16a0\7\140\1\131\2\0\1\u16a1\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u16a2\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u16a3\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u16a4\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\12\140\1\u16a5\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u16a6\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u16a7"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u16a8\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u12c3\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u16a9\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u12c3\1\u16aa\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u16ab\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u16ac\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\22\140\1\u11a4\1\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u16ad\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u16ae\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u03ce\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u16af\21\140\1\u16b0\1\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u16b1\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u16b2\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u0d89\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u16b3\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u16b4\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u16b5\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u16b6\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0f7d\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\55\0\1\u16b7\3\0\1\u16b8\151\0\1\u16b9"+
+    "\121\0\1\u16ba\57\0\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u16bb\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u16bc\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u16bd\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u16be\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u1367\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u16bf\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u16c0\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u16c1\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u05ba"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u16c2\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u16c3\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0e15\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u16c4\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u16c5\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u16c6\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u16c7\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u07a4\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u16c8\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u16c9\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u16ca\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u1261\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u16cb\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\17\140\1\u0355\4\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\u0eb2\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u16cc\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u16cd\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u16ce\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u16cf\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u110f\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u16d0\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u110f\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u16d1\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u16d2\1\u16d3\1\u16d4\1\140\1\u16d5\1\140\1\u16d6"+
+    "\4\140\1\u16d7\1\u16d8\1\140\1\u03a3\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u16d9\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u16da\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u042f\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u0e2b\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u16db\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\23\140\1\u16dc\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u16dd\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u16de\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\1\140\1\u16df"+
+    "\6\140\1\131\10\0\6\140\1\0\10\140\1\u16e0\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0326\5\140\1\u16e1\1\140\1\u16e2\10\140\1\u0ee0"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u14c3\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0bef\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u16e3\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u16e4\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u16e5\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u16e6\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u16e7\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u16e8\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u1273\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u16e9\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u16ea\2\140\1\u0df3\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u16eb\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\3\140\1\u0224\4\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u16ec\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u16ed\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\23\140\1\u16ee\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u01a0\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u16ef\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u16f0\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u16f1\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u16f2\3\140\1\u1297\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u01a0\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\5\140\1\u0e2e\3\140\1\u16f3\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u16f4\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u093f\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u16f5\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u16f6\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u16f7\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u16f8\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u16f9\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u16fa\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u16fb\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u16fc\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u16fd\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u16fe\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u16ff\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1700\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1701\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0c0b\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u1702\1\140\1\u11a4"+
+    "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1703"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1704"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\1\u1705\7\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1706\12\140"+
+    "\1\u1707\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1708"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1709"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u170a"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u170b"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u170c"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0460"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u170d"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u170e"+
+    "\6\140\1\u0403\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u170f\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1710\1\140\1\u06de\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u1711\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u13a3\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u108c\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u14fd\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1712\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u108c\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1502\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u0318\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1713\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\12\140\1\u1714\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u147f\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1715\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u1716\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1717\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u1718\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1719\1\u171a\3\140\1\u171b\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u171c\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u171d\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u10ea\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u171e\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u171f\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1720\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1721\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u1722\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1723\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u12ab\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u1465\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1724\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1725\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u108d\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u13f1\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1726\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\1\u0378\16\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1727"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1728"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1729"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u035c"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u01a0"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0557\10\140"+
+    "\1\u172a\6\140\1\u172b\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u172c\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u172d\16\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u172e\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u172f\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1730\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1731\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u018d\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u152c\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1732\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1733"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1734"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1735"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1736"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1737"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u1738\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1739\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u0fe0\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u173a\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u173b\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u173c\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u173d\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u173e\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u173f\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1740\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1741\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1742\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1743\1\u05b8\1\140\1\u084a\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1744\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1745\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\16\140\1\u1746\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u1747\6\140\1\u1748\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1749\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u174a\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u174b\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u174c\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\21\140\1\u174d\2\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\17\140\1\u174e\4\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u174f\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u1750\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1751\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0bd6\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1752\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1753"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1754"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u13d9"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1755"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1756\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1757\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1758\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1759\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u175a\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\5\140\1\u0e2e\16\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u175b\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u175c\4\140\1\u056a"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u175d\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u175e\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u175f\22\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1760\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u154b\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1761\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0fc2\4\140"+
+    "\1\u0596\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u1762\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1763"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1764\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u1765\1\u1766\1\140\1\u0421\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\22\140\1\u1767\1\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0421\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u03a2\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1768\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u0421\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u0877\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1769\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u176a\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0a82\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u176b\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u176c\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\23\140\1\u0765\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u176d\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u176e\1\u176f\5\140\1\u1770\1\u1771"+
+    "\2\140\1\u1772\7\140\1\131\2\0\1\140\2\0\1\u1773"+
+    "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1774\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1775\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u07a8\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1776\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1777"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0b8a\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1778\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u08c7\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u061d\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u0326\1\u08ba\1\140"+
+    "\1\u1384\1\140\1\u10e2\1\140\1\u1779\11\140\1\u177a\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\21\140\1\u0c39\2\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u177b\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u177c\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u177d\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u09ed\3\140\1\u177e\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0793\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0748\12\140"+
+    "\1\u177f\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1780"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1781"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1782"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0903"+
+    "\6\140\1\u0b84\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u075a\3\140\1\u02dd\1\u1055\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u1783\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0b66\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u1784\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1785\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u1786\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u1787\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u1788\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1789\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0d87\4\140\1\u178a\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u178b\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u178c\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u178d\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u178e\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0348\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u178f\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0a4c\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u1790\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u1791\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1792\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u050e\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\1\u1793\16\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u1794\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u042f\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1795\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0325"+
+    "\2\140\1\u1796\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u050e\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u050e\22\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0325\1\u1797\7\140\1\u050e\12\140\1\131\2\0\1\140"+
+    "\2\0\1\u1798\16\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\1\u0325\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u050e\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u050e\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1799\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\u179a\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u179b\1\140\1\u179c\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u179d\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1363\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u179d\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u179e\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u179f\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u17a0\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u17a1\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u17a2\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u17a3\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\4\140"+
+    "\1\u17a3\3\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\5\140\1\u17a4\16\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u17a5\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u0363\1\u17a6\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u17a7\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u17a8\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u17a9\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u17aa\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u17ab"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u03e5"+
+    "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0e2b"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u17ac"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u03e5"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u17ad\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\u17ae\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u17af\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u17b0\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u17b1\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u130f\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u17b2\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u17b3\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\17\140\1\u17b4\4\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u17b5\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u17b6\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\17\140\1\u17b7\4\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u17b8\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u17b9\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u17ba\10\140\1\u1382\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u17bb\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u01b7\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u17bc\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u03eb\1\140\1\u17bd\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u17be\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u17bf\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u17ba\10\140\1\u17c0\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u17c1\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u17c2\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u17c3\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\17\140\1\u17c4\4\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u0c1a\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u0c0c\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u17c5\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u17c6\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u17c7\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u17c8\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\17\140\1\u17c9\4\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u17ca\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u17cb\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u17cc\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\23\140\1\u17cd\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u063a\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u17ce\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u12d5\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u17cf\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u17d0\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u17d1\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u17d2\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u13d6\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u05de\5\140"+
+    "\1\u07f4\3\140\1\u0569\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u17d3\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u17d4\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\23\140\1\u17d5\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u17d6\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u17d7\10\140\1\u17d8\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u17d9\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u0778\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\5\140"+
+    "\1\u17da\3\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u17db\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1584\1\140\1\u17dc\5\140\1\u1608\1\u1609\2\140"+
+    "\1\u0569\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0ec6"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0d8c\2\140"+
+    "\1\u1588\4\140\1\u051e\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u17dd\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u13d9"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u17de\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1241\4\140\1\u0629\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\17\140\1\u10f8\4\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1433\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0537\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u17df\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u05aa\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u17e0\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u17e1\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\17\140\1\u17e2\4\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u079c\14\140\1\u06da\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u17e3\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u05b1\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u17e4\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\23\140\1\u17e5\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u17e6\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u0224\1\u17e7\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u17e8\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u17e9"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u17ea\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u17eb\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u17ec\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u17ed\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u17ee\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u17ef\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u160f\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u17f0\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u0a62\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1413\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u17f1\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u17f2\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u17f3\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u17f4\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u17f5\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0c7a\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u17f6\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u17f7\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\12\140\1\u17f8\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u17f9\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0f98\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u17fa\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u17fb\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u17fc\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u17fd\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u17fe\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u17ff\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u1800\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1801\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u1802\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u1803\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u1804\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u1805\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1632\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1806\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u1807\12\140\1\u1808\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u17af\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u1809\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u180a\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u0561\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u180b\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u180c\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u180d\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u180e\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u180f\11\140\1\u1810\4\140\1\u1811"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0836\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1812\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1813\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0b3e\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1814\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u0537\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1815\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u171d\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1816\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1817\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u0c77\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u1818\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u142b\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1819\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\5\140\1\u13d9\16\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u181a\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\23\140\1\u181b\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1488\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u181c\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u181d\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u181e\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0db5\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u181f\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u07a8\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1820\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0cee\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1821\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1822"+
+    "\12\140\1\u0511\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u1823\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0e28\7\140\1\u1824\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u1825\3\140\1\u0ce9\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u1826\10\140\1\u1827\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1828\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1829\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u182a\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u182b\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u182c\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u182d\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u182e\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u182c\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u182f\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1830\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\22\140\1\u1831\1\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1832\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1833\1\0\1\140\1\0\1\131";
+
+  private static final String ZZ_TRANS_PACKED_5 =
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1834\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u14e3\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1835\1\140\1\u1836\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1837\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1838\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u146b\4\140\1\u1831"+
+    "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u1839"+
+    "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u183a"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u183b"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u183c"+
+    "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u183d"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0784"+
+    "\1\u183e\1\u183f\2\140\1\u1840\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1841\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1842\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u1843\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u1844\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1845\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u1846\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1847\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0c03\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1848\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u1849\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u184a\3\140\1\u184b\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u184c\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u184d\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u184e\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u0aac\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1686\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u184f"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u119e\6\140\1\u0f1b\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u1083\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1850\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1851\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u1852\16\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1853\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0224\5\140\1\u03df\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1854\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u1855\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u1856\6\140\1\u1857\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1858\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1859\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u185a\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u185b\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u185c\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0af7\10\140"+
+    "\1\u1410\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u185d\6\140\1\u185e\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u185f\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u1860\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1861\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1862\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1863\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u1864\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1865\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u1866\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1867\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u1868\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u1869\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u186a\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u186b\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\5\140\1\u186c\16\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u186d\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u186e\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u186f"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u1870"+
+    "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1871"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0fdd"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1872"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1873"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1874"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1875"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1876\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1877\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u0473\1\140\1\u1878"+
+    "\5\140\1\u0352\1\u0569\1\u1879\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u187a\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u187b\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u187c\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\71\0\1\u0c99\124\0\1\u06fa"+
+    "\145\0\1\u0c99\50\0\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u187d\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\1\u187e\7\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1505\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u187f\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0336\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1880"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1881\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+    "\1\u05f2\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0509"+
+    "\11\140\1\u1882\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1883\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u1884\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u1885\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\23\140\1\u0c36\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1886\1\u0a17\1\140\1\u1575\2\140\1\u1887\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u1888\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1889\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u188a\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u188b\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u188c\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0e20\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u14b9\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u0e5a\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u110f\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0fa8\2\140\1\u188d\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u188e\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u188f\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\u1890\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0224\4\140\1\u1891\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1892\1\140"+
+    "\1\u03df\1\u1893\16\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u1894\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1895\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u1896\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1897\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u1898\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u1899\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u189a\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u189b"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u189c\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u189d\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u189e\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u189f"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0d71\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0f79\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u18a0\22\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0557\7\140\1\u0224"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0670"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u18a1"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u18a2"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\u18a3\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u18a4\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u03df\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u18a5\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u074d\1\u16f1\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\1\u061a\7\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u18a6\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u18a7\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u18a8\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u18a9\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u18aa\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u18ab\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u0c0b\4\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u18ac\1\u056a\2\140"+
+    "\1\u0819\1\140\1\u046d\4\140\1\u0352\1\140\1\u18ad\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u18ae\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u18af\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u18b0"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u12c3"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u18b0"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u18b1\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u18b2\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u18b3\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u18b4\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u18b5\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u18b6\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u18b7\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u18b8\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u18b9\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u18ba"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u18bb\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u18bc\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\17\140\1\u050e\4\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u18bd\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u18be\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u06c0\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u052c\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u18bf\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u18c0\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u18c1\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0df2\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u18c2\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u18c3\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u18c4\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u18c5\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u18c6\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u18c7\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u1716\7\140\1\u18c8\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u18c9\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u18ca\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u18cb\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u18cc\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u18cd\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u18ce\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u18cf\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u18d0"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+    "\1\u18d1\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u18d2"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u09f9"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u18d3"+
+    "\6\140\1\u18d4\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u18d5\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u076f\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u18d6\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u07f7\22\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u18d7\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u18d8\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\1\140"+
+    "\1\u18d9\6\140\1\131\10\0\6\140\1\0\10\140\1\u18da"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0224\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u18db\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u18dc\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u18dd\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u18de\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u18df\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u18e0\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u18e1"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u18e2"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u18e3\12\140\1\u11c0\2\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u18e4\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u18e5\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u18e6\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\21\140\1\u18e7\2\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u18e8\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u18e9\22\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u18ea\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u18eb\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u18ec\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u18ed\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u18ee\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u18ef\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u18f0"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u18f1\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u115f\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+    "\1\u18f2\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u18f3"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u18f4"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1536"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u18f5"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u18f6"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u18f7"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u18f8"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u18f9"+
+    "\2\140\1\u18fa\1\140\1\u10e2\5\140\1\u151b\2\140\1\u0619"+
+    "\3\140\1\131\2\0\1\140\2\0\1\u18fb\16\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u18fc\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u18fd\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1658\20\140\1\u18fe\1\131\2\0\1\140\2\0\1\u18ff"+
+    "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1900\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1901\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1902\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u1903\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u18af"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u1904\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u1905\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0b42\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u056e\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1906\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1907\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0d8c\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1908\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1909\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u190a\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u190b\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u190c\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u190d\3\140\1\u190e\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u190f\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u1910\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u1911\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1912\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u117b\2\140\1\u0c25\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u1913\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1131\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u1356\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1658\10\140\1\u0c25\1\u1914"+
+    "\6\140\1\u1915\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u1916\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1917\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1918\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1919\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u191a\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u191b\6\140\1\u191c\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u191d\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0cc5\1\140\1\u191e\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u191f\3\140\1\u09f7\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1920\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1921\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1922\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1923\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1924\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1925\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u11ca\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1926\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u1927\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\12\140\1\u147f\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u0f9c\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1928\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0cfb\1\140\1\u039b\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1929\4\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1585\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u0237\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u03a2\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0665\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0ef3\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u10ef\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u192a\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u192b\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u192c\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u192d\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u192e\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u192f\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\1\u1930\16\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u192f"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1931"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1932"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1933"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1934"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1935"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1936"+
+    "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1937"+
+    "\4\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0cf8"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u050e"+
+    "\11\140\1\u1938\1\u07c9\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0325\2\140\1\u0527\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u050e\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u07c9\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u1939\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0f99\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u193a\22\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u193b\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u193c\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u193d\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u193e\22\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u193f\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u1940\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1941"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u115c\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+    "\1\u085a\16\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u07c1\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1942\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1943\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1944"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u109d"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1945"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1946"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u1947"+
+    "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1948"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1949"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u09f9"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u194a\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u194b\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u194c\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u194b\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u194d\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u194e\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u0c84\6\140\1\131"+
+    "\2\0\1\140\2\0\1\u0555\16\140\1\0\4\140\1\u194f"+
+    "\3\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u0d7e\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u130a\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\u0cc0\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0a4e\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1950\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u01b7\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u1951\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1952\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u1953\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u17bd\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1954\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0dca\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0e15\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1955\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u06d2\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1956\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1957\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1958\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u1959\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1958\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u195a\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u195b\1\u195c\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\4\140\1\u195d\3\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u195e\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u195f\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\12\140\1\u1960\11\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1961\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1962\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1963\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1964\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1965\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\22\140\1\u1966\1\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\17\140\1\u1967\4\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1968\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1969\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\4\140\1\u196a"+
+    "\4\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u11c7\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u196b\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u196c\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u196d\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u0d89\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u196e\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u196f\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u1970\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1971\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u1972\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1973\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0345\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1974\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u05de\4\140\1\u03a2\1\u0857\1\u1609\2\140\1\u134b\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u13d6\2\140\1\u0d8c"+
+    "\2\140\1\u0532\4\140\1\u051e\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u1975\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1976\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1977\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u1978\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\17\140\1\u1975\4\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u1979\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u197a"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u197b\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u197c\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u197d\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0e38\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u197e\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u197f\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0ed7"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0473\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1980\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1981"+
+    "\1\u1982\1\140\1\u1983\1\u07fb\1\140\1\u1984\1\140\1\u1985"+
+    "\4\140\1\u01cb\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1986\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1987\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1988\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u1989\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u198a\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u198b\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\23\140\1\u198c\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u198d\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u14a5\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u198e\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u198f\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0695"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1990\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u1991\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1992\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u1993\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u1413\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1994\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1995\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1658\3\140\1\u1996\1\140"+
+    "\1\u117b\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u1997\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u1998\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1998\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1999\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u199a\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u199b\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0991"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u199c"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0d86"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u199d\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u199e\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u199f\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u19a0\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u19a1\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u0793\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\23\140\1\u19a2\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u19a3\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u19a4"+
+    "\6\140\1\u0b9a\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u19a5\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u19a6\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u19a7\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u0aae\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0853\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0629"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1051"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u19a8"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u19a9"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u19aa"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u19ab\14\140"+
+    "\1\u19ac\3\140\1\u19ad\1\140\1\u1827\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u19ae\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u19af\1\u19b0\6\140\1\u19b1\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\17\140\1\u0421\4\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u19b2\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u19b3\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u19b4\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u19b5\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u19b6\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u19b7\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u0af2\5\140\1\u19b8\1\140\1\u19b9\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u18ae\10\140"+
+    "\1\u19ba\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140"+
+    "\1\u1413\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u19bb\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u19bc\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u19bd\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u19be\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u19b5\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u09fc\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u19bf\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u127e\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u19c0\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u19c1\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u19c2\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u127e\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0a88\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u19c3\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u19c4\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u19c5\2\140\1\u0e2e\3\140"+
+    "\1\u19c6\4\140\1\u19c7\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u19c8\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u0b0e\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u19c9\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u19ca\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u19cb\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u19cc"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u19cd"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u19ce"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u19cf"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u119e"+
+    "\10\140\1\u10ab\3\140\1\u19d0\1\u19d1\1\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u19d2\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u050b\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u19d3\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u19d4\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u19d5\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u19d6\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u19d7\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u19d8\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u19d9\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u19da\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u19db\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u19dc\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\u19dd\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+    "\1\u19de\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u19df\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0667\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u19e0\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u19e1\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u19e2\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u19e3\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u18a7\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u19e4\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u19e5"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u19e6"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u19e7"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u19e8"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u19e9"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u19ea"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u19eb"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1359"+
+    "\3\140\1\u0c77\2\140\1\u1359\4\140\1\u19ec\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u19ed\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u19ee\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u19ef\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u19f0\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u19f1\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u19f2\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\21\140\1\u0ecb\2\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u19f3\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u19f4\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u19f5\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u03a4\3\140\1\u19f6\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u19f7\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u19f8\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\u19f9\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u19fa\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u19fb\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u135b"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u19fc\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u19fd\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u19fe\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u19ff\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1a00\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0cd6\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0ce5\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1a01\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u07c4\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u08ba\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u1a02\2\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1228\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1a03\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1a04\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1a05\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1a06\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1a07\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1a08\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1a09\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1a0a\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1a0b\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u1a0c\5\140\1\u1a0d"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1a0e"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1a0f"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1a10"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u1a11"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1a12\12\140"+
+    "\1\131\2\0\1\140\2\0\1\u1a13\16\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u1a14"+
+    "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1a15"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u11c2"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0faf"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1a16\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1a17\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u042f\6\140"+
+    "\1\u1a18\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u1a19\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u1a1a\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u1a1b\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0d8c\2\140\1\u18e3\4\140\1\u051e\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1a1c\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1a1d\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u1a1e\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1a1f\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u1a20\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u07b1\3\140\1\u0c6a\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u0e28\2\140\1\u0911\1\u03a4"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u0670"+
+    "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u07d0"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1a21\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u1a22\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1a23\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u1a24\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u09f0\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\u1a25\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u085b\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1a26\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1a27\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u09e7\7\140\1\u142f\4\140\1\u11a4\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1a28\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1a29\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\17\140\1\u1a2a\4\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1a2b\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u1a2c\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1a2d\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1a2e\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1a2f\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u1a30\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\5\140\1\u193c\16\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1a31\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\21\140\1\u1177\2\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1a32\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1a33\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1a34\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u18c9\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u1a35\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u1a36\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1a37\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u1a38\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1a39\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\5\140\1\u0329\12\140\1\u0c1a\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u1a3a\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1a3b\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u03eb\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u0325\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1a3c\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u1a3d\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1a3e\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u1a3f\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\22\140\1\u1a40\1\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u1a41\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u1a42\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1a43\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u1a44\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u1a45\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u18e3\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1a46\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1a47"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140"+
+    "\1\u0d9d\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u18e3\12\140\1\u11c0\2\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1055\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1a48\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\22\140\1\u1a49\1\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1a4a\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1a4b\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\5\140\1\u1a4c\16\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u1a4d\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1a4e"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1a4f"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1a50"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u07e6"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1a51"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u1a52\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\7\140\1\u1a53\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1a54\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u1a55\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1a56\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u1a57\16\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1a58\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u1a59\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u1a5a\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u1a5b\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1a5c\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1a5d\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1a5e\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1a5f\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1a60\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1a61\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1a62\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1a63\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1a64\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\u1a65\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1a66\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1178\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u1a67\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0532\5\140"+
+    "\1\u0569\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1587\2\140\1\u0532\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1a68\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1a69\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u1a6a\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1a6b\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u1a6c\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0a09\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1a6d\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1a6e\4\140\1\u1a6c\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1a6f\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u1a70\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1a71\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u1a72\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u1a73\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u1a74\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u085e\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1a75\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1a76\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u0345\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\21\140\1\u09f9\2\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1a77\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1a78\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u1a79\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1a7a\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1a7b\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\u1a7c\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1a7d\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u164b\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u1a7e\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1a7f\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\22\140\1\u1a80\1\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u042f\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1a81\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\23\140\1\u177f\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1a82\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u1a83\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u0a4e\4\140\1\u0d86\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u1a84\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1787\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u1a85\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1a86\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1a87\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1a88"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u1a89\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u1a8a\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u1a8b\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u14e6\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1a8c"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1a8d"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u1a8e\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1a8f\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1a90\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u1a91\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u03eb\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u1977\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1a92\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u07f4\3\140\1\u0569\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1a93\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1391\10\140"+
+    "\1\u082d\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1419\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u0a4e\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u1115\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u1a94\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u03e5\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u1a95\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1a96\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1a97\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\16\140\1\u1a98\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1a99\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1a9a\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u0e4f\2\140\1\u15b9\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1a9b\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0256\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1a9c\22\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u03df\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1a9d\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1a9e\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u050a\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0224\3\140"+
+    "\1\u07c4\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u1a9f\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u17ce\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1aa0\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+    "\1\u1aa1\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1aa2"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1aa3"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0631"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u1aa4"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1537\1\140"+
+    "\1\u1aa5\4\140\1\u084d\5\140\1\u1aa6\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u1aa7\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1aa8\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1aa9\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u1aaa\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0f19\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1aab\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1aac\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1aad\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\7\140\1\u1aae\1\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1aaf"+
+    "\3\140\1\u01d3\3\140\1\u08c7\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1ab0\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u1ab1\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\1\u06cd\7\140\1\131\10\0\6\140\1\0\10\140\1\u17e0"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+    "\1\u1ab2\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u100d\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1ab3\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u1ab4\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u1ab5\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u0364\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1ab6"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u1ab7"+
+    "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1782"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1ab8\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1ab9\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1aba\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u01c5\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1002\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1abb\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1abc\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u108d\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1abd\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0402\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1abe\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1abf\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1ac0\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u1ac1\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1ac2\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1ac3\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\17\140\1\u1ac4\4\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1ac5\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1802\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u18c0\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u1743\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u1ac6\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1ac7\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1ac8\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u10d7\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u1ac9\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1aca\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1acb\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u0363\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u1acc\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u10f8\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\23\140\1\u0a03\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1acd\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u052c\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u1ace\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u1acf\22\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\23\140\1\u0f0e\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1ad0"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1ad1"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0325"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1ad2"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1ad3"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1ad4"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u03eb\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1ad5\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\1\u0224\7\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1ad6\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u1244\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1ad7\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1ad8\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u1ad9\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1ada\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\22\140\1\u1adb\1\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1adc\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1add\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1ade"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1adf"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1ae0"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1ae1"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1ae2"+
+    "\11\140\1\u0788\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1ae3\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1ae4\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1ae5"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u050e\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u1ae6\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u1ae7\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1ae8\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1ae9"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u07a1\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1aea\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u18ae\10\140"+
+    "\1\u1ae6\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+    "\1\u1aeb\4\140\1\131\2\0\1\140\2\0\1\u0350\16\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1aec\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u1aed\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u097e\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0d28\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1aee\2\140\1\u1aef\1\140\1\u03a2\1\u0350\3\140\1\u0569"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0d8c"+
+    "\1\140\1\u1af0\1\u0d8e\1\u1af1\3\140\1\u051e\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1af2\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1af3\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u07c4\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u1af4\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u1af5\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u1af6\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u1af7\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u0e74\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1af8\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1af9\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1afa\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1afb\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u1afc\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0bdf\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1afd\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u0c0b\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u1afe\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1aff\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b00"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u15a4\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b01\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1b02"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b03"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1b04\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b05\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1b06\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\u1b07"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1b08\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1b09\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1b0a\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u1b0b\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1b0c\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1866\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1b0d\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1b0e\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1b0f\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u1b10\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1b11\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1b12\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1b13\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1b14\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b15"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\16\140\1\u1b16\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0375"+
+    "\3\140\1\u0661\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u0d89\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1b17\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u1b18\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u0d33\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u1b19\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1b1a\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1b1b\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u1b1c\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u1b1d\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u06a0\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u1b1e\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u1b1f\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b20\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u08ba"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1b21"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u17af"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0d51"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1b22"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1b23"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1b24"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1b25"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1b26"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0159"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1b27"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1b28"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1b29"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\16\140\1\u0cc0\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1b2a\3\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b2b\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1b2c\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1b2d\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1b2e\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1b2f\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1b30\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u10c9\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u1b31\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u1781\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u1b32\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u03a4\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u0bf5\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1acf\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\21\140\1\u18aa\2\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u1200\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1b33\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0a5a\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u056a\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u0b0e\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\5\140\1\u1b34\16\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\17\140\1\u127e\4\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\23\140\1\u1b35\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1b36\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1b37\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u1b38\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\12\140\1\u1b39\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1b3a\14\140\1\u086b\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1b3b\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1b3c\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u0224\2\140\1\u1b3d\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\23\140\1\u085a\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\1\u1b3e\7\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1099\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u05e6\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u1b3f\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u1b40\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u1b41\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\12\140\1\u1b42\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1b43\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\23\140\1\u1b44\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u18c9\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1b45\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u18c9\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1b46\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+    "\1\u1b47\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u1b48"+
+    "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0cc0"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0b80"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u05de"+
+    "\11\140\1\u0569\1\u0582\6\140\1\131\2\0\1\140\2\0"+
+    "\1\u0555\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u07c4\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u19ff\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u1b49\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\12\140\1\u1b4a\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1b4b\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u18e3\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u1b4c\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\21\140\1\u1b4d\2\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u1b4e\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1b4f\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u1b50\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1b51\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1642"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1b52\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1b53\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1b54"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1b55"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0810\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b56\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\7\140\1\u1b57\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u048a\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1b58\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\5\140\1\u1a57\2\140\1\u0bc5"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b59"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1b5a"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1b5b\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1b5c\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u13a3\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1b5d\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1b5e\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1b5f\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b60\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1b61\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u176d\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1b62\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1b63\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u1b64\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1b65\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1b66\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u1b67\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1b68\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0f97\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u190d\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u1b69\22\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u1b6a\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1b6b\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u1b6c\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b6d"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u10f8\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b6e\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u035c"+
+    "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1b6f"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1b70"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1b71\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b72\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u0e3e\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u1b73\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u1b74\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1b75\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\22\140\1\u10c6\1\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u10c6\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1b76\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u1b77\2\140\1\u17bc\7\140"+
+    "\1\u1b78\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u033a"+
+    "\5\140\1\u1b77\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1b79\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u0c84\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1228\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b7a"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1b7b\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1b7c\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1b7d\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0326\1\u1b7e\1\u0cd7\2\140\1\u10e2\1\140\1\u0de4\3\140"+
+    "\1\u1b7f\5\140\1\u06dc\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u1b80\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b81"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b82\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1b83\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0dac\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1010\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u07c4\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1b84\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1b47\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0cc0\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1250\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0a09\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\12\140\1\u03e5\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u083d\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1b85\3\140\1\u1b86"+
+    "\1\140\1\u1b87\4\140\1\u1b88\3\140\1\u1b89\2\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1b8a\5\140\1\u083a"+
+    "\6\140\1\u10cb\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b8b"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1b8c\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u1b8d\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u045e\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1b8e\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b8f\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u07a9"+
+    "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1b90"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1b91"+
+    "\4\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1b92"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1b93"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\4\140\1\u0224\3\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u079c\3\140"+
+    "\1\u1abf\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u1b94\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u17ce\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1b95\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\1\u1b96\16\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u1b97\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1b98"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1b99"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1b9a"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1b9b"+
+    "\2\140\1\u1aaf\7\140\1\u08c7\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1b9c\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\u1b9d\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u0473\1\u1aaf\1\u0c77\3\140\1\u076f\3\140\1\u1b9e\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1a89\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u126d\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1b9f\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u0a64\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1ba0\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\22\140\1\u1ba1\1\140\1\131"+
+    "\2\0\1\140\2\0";
+
+  private static final String ZZ_TRANS_PACKED_6 =
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1ba2\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u07c4\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u1ba3\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1ba4\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1abc\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0a54\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u0e38\1\140\1\u06d9\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u03df\4\140\1\u1ba5\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1ba6\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u1ba7\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u13fd\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u08ba\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1ba8\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u198b\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u1ba9\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1baa\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u1bab\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1bac\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u1bad\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u1bae\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u1baf\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u1bb0\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0565\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1bb1\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1bb2"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u1bb3\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1bb4\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1bb5\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1639\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1bb6\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1bb7\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u0532\7\140\1\u0da4\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u10f8\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u1bb8\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1bb9\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u100e\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u1bba\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u1adb\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u1bbb\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1bbc"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1bbd\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1bbe\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1bbf\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0471\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1bc0\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1aeb\4\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1bc1\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1bc2\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1bc3\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1bc4\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u1bc5\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0cba\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u1bc6\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1bc7\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u09fe\10\140\1\u01aa\4\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0dcf\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u1bc8\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1bc9\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u1358\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u1bca\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u05f2\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u1bcb\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1bcc\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1bcd\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1bce\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u1bcf\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u1228\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1bd0\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u134b\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1bd1\2\140\1\u1bd2\16\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1bd3\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u100c\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1bd4\7\140\1\u1bd5"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u1bd6\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u100c\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u1bd5\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1bd7\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u1bd8\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u1bd9\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u1bda\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u0569\5\140\1\u0553\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1bdb\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u0560\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1bdc\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1bdd\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1bde\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1bdf\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1be0\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1be1\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\15\140\1\u1be2\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u1200\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u1be3\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1be4\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1be5\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1be6\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u1be7\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1be8\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1be9\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1bea\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u1beb\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1bec\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\23\140\1\u1bed\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1bee\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u037c\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1bef\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u1bf0\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1bf1\13\140\1\u1bf2\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1bf3\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u1bf4\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u1bf5\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u1bf6\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1bf7\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u1bf8\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u03de\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1bf9\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1bfa\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u1b47\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u075a\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0a05\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\u0a9a\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1bfb"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1bfc\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0b96\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1bfd\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0871\7\140"+
+    "\1\u0873\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1358"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1bfe"+
+    "\4\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u1bff"+
+    "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1c00"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1c01"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0752"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1c02"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1c03"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1c04"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1baa"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\u061e\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u0379\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1c05\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u1c06\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1c07\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\1\u0b53\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1c08\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1c09\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1c0a\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0cc0\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1c0b\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1c0c\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u1c0d\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u1c0e\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1529\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1c0f\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\u1c10\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1c11"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u1c12\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1c13\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1c14"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1c15\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1c16\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1c17\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1c18\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\14\140\1\u1c19\2\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1c1a\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u154f\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\2\140\1\u0597\5\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u07be\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1c1b\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1c1c\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1002\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1c1d\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1c1e\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1c1f\2\140"+
+    "\1\u1c20\2\140\1\u1c21\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u0dda\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u180c\1\140\1\u1c22\1\u1c23\1\140\1\u10b1"+
+    "\1\140\1\u1c24\4\140\1\u1c25\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1c26\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1c27\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1c28"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1c29\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0999\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1c2a"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1c2b"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1c2c"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u1c2d"+
+    "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1c2e"+
+    "\2\140\1\u1c2f\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u01cb\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\23\140\1\u08d8\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u1c30\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1c31\1\140\1\u1b3f\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\5\140\1\u0928\1\140\1\u1c32\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u1c33\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u1c34\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u1c35\16\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u19b6\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u1c36\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1c37\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1c38\4\140\1\u117b\12\140\1\u1c39"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1c3a\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1c3b\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1c3c\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0cd6\6\140\1\u1c3d\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1818\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0baf\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1c3e\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u12b2\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u159f\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1c3f\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u1c40\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u051e\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1c41\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1c42\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u037c"+
+    "\3\140\1\u1c43\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u1c44\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1c45"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u17b4\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+    "\1\u1c46\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+    "\1\u1c47\2\140\1\u15b9\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1c48\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\1\u1c49\7\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u17ce\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u195b\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u1c4a\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1c4b\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1c4c\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\23\140\1\u1c4d\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1c4e"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1c4f\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b99\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1c50\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1c51\3\140"+
+    "\1\u01d3\5\140\1\u11d6\3\140\1\u13c6\1\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u1c52\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u1c53\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u0b84\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u1c54\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u1c55\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\17\140\1\u07c4\4\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u1c56\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u0224\4\140\1\u1ab9\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1c57\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u084d\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1c58\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u08f6\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u1c59\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u18c0\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u1c5a\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u05de\2\140\1\u1c5b\16\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u0a62\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1c5c\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u1c5d\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\2\140\1\u099b\5\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\22\140\1\u19d1\1\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u1c5e\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\17\140\1\u1c5f\4\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u0568\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u1c60\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u1c61\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\21\140\1\u1adb\2\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\1\140\1\u0393\6\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u1c62\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1c63\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\23\140\1\u1c64\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1c65\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u1c66"+
+    "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1c67"+
+    "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u19af\1\u1c68"+
+    "\6\140\1\u19b1\2\140\1\u0352\1\140\1\u01cb\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u1c69\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1c6a\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1c6b\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1c6c\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1b59\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u0b52\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u01a0\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1073\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u1c6d\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u1c6e\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1c6f\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1c70\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u16e2\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u1c71\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1c72\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u19c5\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u1c73\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1c74\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1c75\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1c76"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1c77"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1c78"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1c79"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1c7a"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1c7b"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u19dd"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1c7c"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1c7d"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1c7e"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1c7f"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1c80"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1c81"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1c82"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1c83"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u0749\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1c84\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1c85\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1c86\2\140"+
+    "\1\u1c87\6\140\1\u1c88\1\u1c89\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1c8a\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1c8b\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1177\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1c8c\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1c8d\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u12c3\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1c8e\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u1c8f\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1c90\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u1c91\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\u1c92\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1c93"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1c94"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1c95"+
+    "\6\140\1\u0748\1\u075b\12\140\1\131\2\0\1\u1c96\2\0"+
+    "\1\u08b9\16\140\1\0\4\140\1\u0a20\3\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u1c97\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\22\140\1\u1c98\1\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1c99\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1c9a\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u0565\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1c9b\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1c9c\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u17c4\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1c9d\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u1c9e\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1c9f\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u1a4e\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1ca0\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1ca1\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u1ca2\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\1\u1ca3\16\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u09f7\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u1ca4\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u1ca5\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1ca6\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u1ca7\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u1ca8\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1ca9\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u1caa\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u172d\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u1cab\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1cac\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u1cad\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u1cae\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1caf\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u1cb0\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1cb1\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u1cb2\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1782\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\4\140\1\u0224\4\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1cb3\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1cb4\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1cb5\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u1002\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1cb6\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1cb7\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u0cf6\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u1cb8\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1cb9\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u1cba\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1cbb\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u1cbc\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\10\140\1\u1cbd\13\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u1cbe\6\140\1\u1cbf\4\140"+
+    "\1\u0c7a\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1cc0"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1cc1\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1cc2\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u1cc3\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140"+
+    "\1\u1cc4\2\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1cc5\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1178\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\u1cc6\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u1cc7\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\21\140\1\u1cc8\2\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1328\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u1cc9\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1cca\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u035d\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u1ccb\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1ccc\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u1ccd\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u05f2\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u1cce\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1ccf\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\5\140\1\u1384\3\140\1\u03a2\11\140\1\u1258\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\5\140\1\u1384\3\140\1\u03a2\4\140"+
+    "\1\u07a8\4\140\1\u1258\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\u1cd0\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0bf5"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0355"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1240"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0d31"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1cd1"+
+    "\4\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1cd2"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1cd3"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1256"+
+    "\4\140\1\u10c0\1\u0d7e\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1cd4\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1cd5\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1cd6"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1cd7\4\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\1\u1cd8\16\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1cd9\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u1cda\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\22\140\1\u1cdb\1\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1c51\11\140\1\u11d6\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1cdc\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1440\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1cdd\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1cde\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1cdf\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1ce0\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u1ce1\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u0cef\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\22\140\1\u1ce2\1\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u1ce3\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u1ce4\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1ce5\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u1bae\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1ce6\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1ce7\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1ce8\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1ce9\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u055a\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1cea\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0af2\3\140\1\u0375\11\140\1\u1ceb\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u1cec\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u19ab\5\140\1\u1ced\1\140"+
+    "\1\u1cee\7\140\1\u1cef\1\u19ad\1\140\1\u1827\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1cf0\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u1cf1\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1cf2\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1cf3\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u084a\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1b85\1\u1cf4\1\u0375\1\140\1\u0e52"+
+    "\1\140\1\u0661\4\140\1\u1cf5\1\u1cf6\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1cf7\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u1cf8\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0df5\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u0af2\1\u1cf9\1\140\1\u1cfa\4\140"+
+    "\1\u1cfb\1\u083a\12\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1cfc\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+    "\1\u1cfd\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u1a70\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1cfe\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1cff"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0770"+
+    "\4\140\1\u046d\7\140\1\u1d00\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u1d01\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u1d02\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1d03\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1d04\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\13\140\1\u1d05\10\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u1d06\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1d07\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1d08"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u1d09\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1d0a\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1d0b\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1d0c"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1d0d"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1d0e"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1d0f"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1d10"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1d11"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1d12"+
+    "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0e28"+
+    "\2\140\1\u1b18\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0ce9\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1d13\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\22\140\1\u1d14\1\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1d15"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1d16\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u17c4\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1d17\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1d18\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1d19\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0b0a\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+    "\1\u16fa\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u1d1a\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u01b7"+
+    "\15\140\1\u1d1b\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\11\140\1\u056e\11\140\1\u056e\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u1d1c\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1bf7\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1c98\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1d1d\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1d1e\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1d1f\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1d20\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1ab8\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u040a\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1d21\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1d22\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u1d23\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u1177\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1d24\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\21\140\1\u1d25\2\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1d26\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u0224\2\140\1\u077b\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u1d27\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1d28\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1d29\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u0e18\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u11ca\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u1d2a\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1d2b\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1d2c"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u1d2d\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1d2e\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u12ab\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u1d2f\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0d47\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1d30"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\1\u1d31\16\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1a6a\16\140"+
+    "\1\u0df3\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0cf6\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u1d32\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1d33\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u05e6\10\140\1\u1d34\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0670\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1d35\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1d36\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1d37\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u1d38\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1d39\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1d3a"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1d3b\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1d3c"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1d3d"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u10ac"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1d3e"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u0eb2"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\1\u1d3f\7\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u10c6\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u1d40\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u042f\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\5\140\1\u1d41\16\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1d42\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\1\u0320\16\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u0d45\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u1180\15\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u17ba\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u1d43\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1d44\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1d45\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1d46\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1d47\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u1d48\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u1d49\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1d4a\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1d4b\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u1d4c\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u0ea9\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1d4d\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u08f6\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u13fd\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u1d4e\22\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1d4f\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1d50\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1d51\2\140\1\u046d\6\140\1\u10d9\6\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1d52\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1d53\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1d54\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u10f8\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u0843\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u1d55\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u1d56\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u1d57\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u1d58\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u19fb\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1d59\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1d5a\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1d5b\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1d5c\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u1d5d\1\u085b\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1d5e\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\14\140\1\u1d5f\7\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1d60\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1d61\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u108d\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1d62\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u1d63\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1d64\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1d65\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u1c73\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1d66\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1d67\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1d68\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1d69\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u1d6a\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1d6b\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u1d6c\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u0a64\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u1d6d\5\140\1\u1d6e\5\140\1\u1d6f"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1d70\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1d71\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1d72\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u1d73\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1d74\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1d75\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1ba8\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\1\u187e\7\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u1d76\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u1d77\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u1d78\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u1d79\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u1d7a\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1d7b\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1d7c\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u1d7d\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u1d7e\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\1\140"+
+    "\1\u1d7f\6\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0670\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u14b5\3\140\1\u1d80\11\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1d81\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1d82\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u0d7a\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1d83\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u1d84\1\140\1\u1bb7\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1d85\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u0484\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1d86\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u1ca3\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1d87\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1d88\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1d89\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1d8a"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1d8b"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1d8c"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u076c\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1d8d\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0d86\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0fcc\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1d8e\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u1d8f\1\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u1d90\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u1112\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1d91\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1d92\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1d93\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u175c\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u1a6a\6\140\1\u0cc2"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0beb"+
+    "\3\140\1\u1d94\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1d95\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1d96\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u127e\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u0a09\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1d97"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1d98\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1d99\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u19ff\5\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1d9a\14\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1d9b\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u03eb\15\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u1d9c\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u0d27\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u0f19\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1d9d\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\11\140\1\u1d9e\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1d9f\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\21\140\1\u1da0\2\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\140\1\u0a9a\22\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1ce4\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u1da1\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u076b\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1da2\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\u03b0\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1da3\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1da4\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u1da5\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\140\1\u1da6\22\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u1da7\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\16\140\1\u1da8\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1da9\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1daa"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u0cba\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u1dab\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1dac\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u043e\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1dad\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+    "\1\u07c4\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1dae\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u0839\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1daf\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1db0\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1db1"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1db2"+
+    "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1db3"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1db4\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1272\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1db5\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1db6\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u1db7\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u1db8\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u1db9\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\17\140\1\u1dba\4\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1dbb\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u1dbc\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1dbd\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u1dbe\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u1dbf\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1dc0\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1dc1\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1dc2"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u1dc3\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u07c4\3\140\1\u0db5\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u07ab\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1dc4\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u1dc5\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1dc6\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1dc7\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u0921\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\1\u06d9\16\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u1dc8\3\140\1\u0d3a\11\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1dc9\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\5\140\1\u1dca\16\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u07a8\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u1baa\3\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1dcb\6\140\1\u1dcc\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u1dcd\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1caa\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\23\140\1\u1dce\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\23\140\1\u0eaf\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u1dcf\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1dd0\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1caf\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u0aed\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u1dd1\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u07c9\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1dd2\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1dd3\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u0f96\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u0cc0\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1dd4"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1dd5\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u1dd6\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u1dd7\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+    "\1\u1dd8\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1dd9\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u0f19\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1dda"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1ddb\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1ddc\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1ddd\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u1dde\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u1ddf\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0569\1\140\1\u1de0\1\140\1\u0df3\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u1de1\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\12\140\1\u1de2\11\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\21\140\1\u1de3\2\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u1de4\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u1de5\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1de6\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1de7\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\6\140\1\u1de8\1\140\1\u1cee\13\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u1de9\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1dea\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1deb\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1cfa\5\140\1\u083a\12\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1dec\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1ded\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u1dee\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1def\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u1df0\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\16\140\1\u1c38\5\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u1df1\1\u1df2\1\u1df3\1\u1df4\4\140"+
+    "\1\u1df2\1\140\1\u1df5\11\140\1\131\2\0\1\u1df6\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1df7\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1df8\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1df9\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1dfa\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1dfb\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u1dfc\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1dfd\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1dfe\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1dff\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u1e00\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u1e01\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1e02\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+    "\1\u1e03\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1e04"+
+    "\3\140\1\u1016\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u1e05\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u1abf\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1e06\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u1e07\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u1e08\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u1e09\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1e0a\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u1e0b\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\6\140\1\u190d\15\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u1e0c\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1e0d\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u1e0e\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1e0f\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u0615\2\140\1\u1d94\5\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u16f3\1\140\1\u0c25\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u16f3\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\7\140\1\u1b84\14\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0329\12\140\1\u1e10\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1e11\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u195e\1\140"+
+    "\1\u195b\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u121d\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+    "\1\u1e12\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1e13\23\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1e14\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1e15\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u1e16\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1e17\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1e18\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1e19\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u1073\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1e1a\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1e1b\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u1e1c\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u10f8\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\12\140\1\u0a5a\11\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u1e1d\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1e1e\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u1d24\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u1e1f\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1b84\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u0a09\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1e20\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u1bd5\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u0694\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u1e21\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1e22\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1e23\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1e24\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u1e25\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1e26\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u07f7\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1e27\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u1e28\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1e29\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1e2a\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+    "\1\u1e2b\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1e2c\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1e2d"+
+    "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1e2e"+
+    "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1e2f"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1e30"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1e31"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1e32\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1e33\10\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1e34\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u052f\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1e35\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u0a75\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\15\140\1\u0a9a\6\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1e36\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1e37\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1e38\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u1e39\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u1e3a\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1e3b\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u082b\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\12\140\1\u14ad\11\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\7\140\1\u0f97\14\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\22\140\1\u0348\1\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u1367\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1e3c\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1a18\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1e3d\20\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\5\140\1\u10e2\16\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1e3e\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1e3f\11\140\1\u0596\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1e40\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\3\140\1\u1e41\20\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\140\1\u1e42\22\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1e43\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1e44\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u1e45\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\11\140\1\u1e46\12\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\2\140\1\u1e47\21\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1e48\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u1e49\16\140\1\u1e4a\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1e4b\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u1e4c\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1e4d\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\20\140\1\u1e4e\3\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1b27\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u1e4f\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1d0d\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1e50\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u1e51\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u1178\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1e52\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1e53\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1e54\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\16\140\1\u1e55\5\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u1d15\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\140\1\u056a\13\140\1\u1e56\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u1e57\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\16\140\1\u1e58\5\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\3\140\1\u1e59\3\140\1\u0449\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1a4c\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\u1e5a\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u1e5b\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u1e5c\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\u05ba\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1e5d\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+    "\1\u1e5e\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1e5f\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+    "\1\u1e60\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u1e61\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+    "\1\u0c3c\1\140\1\u1e62\1\u1e63\1\u1e64\3\140\1\131\2\0"+
+    "\1\140\2\0\1\u1e65\16\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\3\140\1\u1e66\20\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1e67\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1e68\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\10\140\1\u1e69\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\14\140\1\u1e6a\7\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\1\u1e6b\23\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u1e6c\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\10\140\1\u1e6d\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1e6e\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1e6f\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\14\140\1\u1e27\7\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1e70\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1e71\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1e72\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\6\140\1\u1178\15\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1e73\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1e74\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1e75\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1aeb\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1e76\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\7\140\1\u1e77\14\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\4\140\1\u1e78\17\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1e09\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1e79\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\22\140\1\u1e7a\1\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1e7b"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+    "\1\u1e7c\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+    "\1\u1e7d\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1e7e\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1e7f\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1e80"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1e81"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1e82"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1e83"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1e84"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u06dc"+
+    "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1e85"+
+    "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1391"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1e86"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1e87"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u1e88"+
+    "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1e89"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1e8a\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u18be\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\17\140\1\u1d0d\4\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\17\140\1\u1e8b\4\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u1e8c\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1e8d\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\13\140\1\u1e8e\10\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u1e8f\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\15\140\1\u1e90\6\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\4\140\1\u1e91\17\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\140\1\u1e92\22\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\17\140\1\u1e93\4\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\6\140\1\u1e94\15\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\5\140\1\u0329\10\140\1\u0d86\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1e95\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\20\140\1\u1de6\3\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\16\140\1\u1e96\5\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\21\140\1\u19ad\1\140\1\u1827"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u1926\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1e97\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1e98\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1e99\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\6\140\1\u1e9a\15\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1e9b\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\5\140\1\u1e9c\16\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1e9d\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\4\140\1\u1e47\17\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\u1e9e"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\23\140\1\u1e9f\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1ea0\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1ea1\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1ea2\17\140\1\u1d7a\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1ea3\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u1ea4\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u0cba\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1ea5\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1ea6\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u1112\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u17d4\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1ea7\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1ea8\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1926\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1ea9\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\21\140\1\u1926\2\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\20\140\1\u14e3\3\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1eaa"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+    "\1\u1eab\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+    "\1\u1eac\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+    "\1\u1ead\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+    "\1\u1eae\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+    "\1\u1eaf\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1eb0"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1eb1\7\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1eb2\12\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1eb3\20\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1eb4\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\u0527"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\1\u1eb5\23\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\21\140\1\u1eb6\2\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\12\140\1\u1eb7\11\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\10\140\1\u1eb8\13\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1eb9\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\3\140\1\u1eba\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1ebb\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u1ebc\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1ebd\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\15\140\1\u130b\6\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1ebe\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1ebf\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u0615\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\1\u1ec0\2\140\1\u0f62\20\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1ec1\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\4\140\1\u1ec2\17\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\7\140\1\u1ec3\14\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\2\140\1\u1ec4\21\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\20\140\1\u1ec5\3\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+    "\1\u1ec6\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\2\140\1\u1ec7\21\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\21\140\1\u1ec8\2\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\5\140\1\u1178\16\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\3\140\1\u1ec9\20\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\15\140\1\u1eca\6\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\14\140\1\u1ecb\7\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\12\140\1\u1ecc\11\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u1ecd\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u1ece\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\17\140\1\u1ecf\4\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1ed0"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+    "\1\u1ed1\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1ed2\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1ed3"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1ed4"+
+    "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1ed5"+
+    "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1ed6"+
+    "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1ed7"+
+    "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\10\140\1\u1ed8\1\0\1\140"+
+    "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\10\140\1\u1ed9\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\7\140\1\u1eda\14\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\2\140\1\u1edb\21\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\12\140\1\u1edc\11\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1edd\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u14d7\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\10\140\1\u1ede\13\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\1\u1edf\23\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\2\140\1\u0f9b\21\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\10\140\1\u1176\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\10\140\1\u1ee0\13\140\1\131\2\0\1\140"+
+    "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+    "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+    "\2\140\13\0\20\140\1\u12a0\3\140\1\131\2\0\1\140"+
+    "\2\0\1\u12a0\16\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\4\140\1\u1ee1\17\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\13\140\1\u1ee2\10\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\11\140\1\u1ee3\12\140\1\131\2\0"+
+    "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+    "\1\0\11\140\1\0\1\u1ee4\1\0\1\131\1\u0140\1\140"+
+    "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\11\140\1\u1ee5\12\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\13\140\1\u1ee6\10\140\1\131\2\0\1\140\2\0"+
+    "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\1\u1ee7\23\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\10\140\1\u1ee8\13\140\1\131\2\0\1\140\2\0\17\140"+
+    "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1ee9"+
+    "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+    "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+    "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1eea\1\0"+
+    "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+    "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0c6a"+
+    "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1eeb"+
+    "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0e34"+
+    "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+    "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+    "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+    "\2\0\1\140\2\0\16\140\1\u0a9a\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1eec\11\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\u1cb2\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0d86\5\140"+
+    "\1\131\2\0\1\u03b0\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u09e7\16\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1eed\6\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u056a\17\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1eee\21\140"+
+    "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+    "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+    "\1\u0140\1\140\1\0\2\140\13\0\1\u1eef\23\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\13\140\1\u1ef0\10\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+    "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+    "\1\140\1\0\2\140\13\0\14\140\1\u1ef1\7\140\1\131"+
+    "\2\0\1\140\2\0\17\140\1\0\10\140";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[734730];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_1, offset, result);
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_2, offset, result);
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_3, offset, result);
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_4, offset, result);
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_5, offset, result);
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_6, 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 =
+    "\5\0\2\1\1\0\2\1\1\0\2\1\13\0\1\1"+
+    "\3\0\2\1\1\11\4\1\1\11\5\1\2\11\3\1"+
+    "\1\11\1\1\3\11\1\1\1\11\26\1\1\11\1\1"+
+    "\1\11\1\1\6\11\1\1\1\11\2\1\1\11\2\1"+
+    "\2\11\10\1\1\11\3\1\1\11\17\1\1\11\3\1"+
+    "\1\11\1\1\1\11\1\1\2\11\2\1\1\11\6\1"+
+    "\1\11\4\1\1\11\1\1\1\11\34\1\1\11\5\1"+
+    "\1\11\2\1\2\11\2\1\1\11\1\1\3\11\1\1"+
+    "\1\11\5\1\4\11\4\1\4\11\1\1\1\11\6\1"+
+    "\7\11\6\1\1\11\5\0\105\1\1\11\2\0\1\1"+
+    "\1\0\1\11\1\0\75\1\1\11\2\1\1\0\1\11"+
+    "\11\0\12\1\1\11\304\1\2\11\1\1\1\11\1\0"+
+    "\1\11\1\1\15\0\1\1\1\11\5\0\1\1\1\0"+
+    "\1\11\3\1\2\0\1\11\4\0\101\1\3\0\1\1"+
+    "\1\0\3\1\1\0\67\1\14\0\u0181\1\25\0\2\1"+
+    "\1\11\3\0\45\1\3\0\1\11\43\1\1\0\1\11"+
+    "\3\0\1\1\3\0\u01fa\1\20\0\1\11\3\0\2\1"+
+    "\1\11\2\0\25\1\1\11\1\0\1\11\25\1\6\0"+
+    "\u0277\1\16\0\14\1\1\0\14\1\2\0\u02b1\1\12\0"+
+    "\4\1\1\0\6\1\2\0\u02d4\1\6\0\1\1\1\0"+
+    "\2\1\2\0\u029f\1\1\11\4\0\1\1\1\11\1\1"+
+    "\2\11\u0265\1\3\0\u021a\1\3\0\1\11\u0837\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[7921];
+    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;
+
+  /* user code: */
+
+	/**
+	 * Type specific to PHPTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	private static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to PHPTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	private static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to PHPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed HTML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	private static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to PHPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code><script></code> tag.
+	 */
+	private static final int INTERNAL_INTAG_SCRIPT			= -4;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * script tag.
+	 */
+	private static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * script tag.
+	 */
+	private static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+	/**
+	 * Token type specifying that the user has
+	 * ended a line with an unclosed <code><style></code> tag.
+	 */
+	private static final int INTERNAL_INTAG_STYLE			= -7;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * style tag.
+	 */
+	private static final int INTERNAL_ATTR_DOUBLE_QUOTE_STYLE = -8;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * style tag.
+	 */
+	private static final int INTERNAL_ATTR_SINGLE_QUOTE_STYLE = -9;
+
+	/**
+	 * Token type specifying we're in JavaScript.
+	 */
+	private static final int INTERNAL_IN_JS					= -10;
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	private static final int INTERNAL_IN_JS_MLC				= -11;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	private static final int INTERNAL_IN_JS_STRING_INVALID	= -12;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	private static final int INTERNAL_IN_JS_STRING_VALID		= -13;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	private static final int INTERNAL_IN_JS_CHAR_INVALID	= -14;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	private static final int INTERNAL_IN_JS_CHAR_VALID		= -15;
+
+	/**
+	 * Internal type denoting a line ending in CSS.
+	 */
+	private static final int INTERNAL_CSS					= -16;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property.
+	 */
+	private static final int INTERNAL_CSS_PROPERTY			= -17;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property value.
+	 */
+	private static final int INTERNAL_CSS_VALUE				= -18;
+
+	/**
+	 * Internal type denoting line ending in a CSS double-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	private static final int INTERNAL_CSS_STRING				= -(1<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS single-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	private static final int INTERNAL_CSS_CHAR				= -(2<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS multi-line comment.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	private static final int INTERNAL_CSS_MLC				= -(3<<11);
+
+	/**
+	 * Token type specifying we're in PHP.  This particular field is public so
+	 * that we can hack and key off of it for code completion.
+	 */
+	public static final int INTERNAL_IN_PHP					= -(4<<11);
+
+	/**
+	 * Token type specifying we're in a PHP multiline comment.
+	 */
+	private static final int INTERNAL_IN_PHP_MLC				= -(5<<11);
+
+	/**
+	 * Token type specifying we're in a PHP multiline string.
+	 */
+	private static final int INTERNAL_IN_PHP_STRING				= -(6<<11);
+
+	/**
+	 * Token type specifying we're in a PHP multiline char.
+	 */
+	private static final int INTERNAL_IN_PHP_CHAR				= -(7<<11);
+
+	/**
+	 * The state previous CSS-related state we were in before going into a CSS
+	 * string, multi-line comment, etc.
+	 */
+	private int cssPrevState;
+
+	/**
+	 * Whether closing markup tags are automatically completed for PHP.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * The state PHP was started in (YYINITIAL, INTERNAL_IN_JS, etc.).
+	 */
+	private int phpInState;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+	/**
+	 * Language state set on HTML tokens.  Must be 0.
+	 */
+	private static final int LANG_INDEX_DEFAULT = 0;
+
+	/**
+	 * Language state set on JavaScript tokens.
+	 */
+	private static final int LANG_INDEX_JS = 1;
+
+	/**
+	 * Language state set on CSS tokens.
+	 */
+	private static final int LANG_INDEX_CSS = 2;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PHPTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.FUNCTION || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * 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;
+		phpInState = YYINITIAL; // Shouldn't be necessary
+		cssPrevState = CSS; // Shouldn't be necessary
+		int languageIndex = LANG_INDEX_DEFAULT;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.MARKUP_COMMENT:
+				state = COMMENT;
+				break;
+			case Token.VARIABLE:
+				state = DTD;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				break;
+			case INTERNAL_INTAG_STYLE:
+				state = INTAG_STYLE;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_STYLE:
+				state = INATTR_DOUBLE_STYLE;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_STYLE:
+				state = INATTR_SINGLE_STYLE;
+				break;
+			case INTERNAL_IN_JS:
+				state = JAVASCRIPT;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				languageIndex = LANG_INDEX_JS;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = false;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = true;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = false;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				languageIndex = LANG_INDEX_JS;
+				validJSString = true;
+				break;
+			case INTERNAL_CSS:
+				state = CSS;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			case INTERNAL_CSS_PROPERTY:
+				state = CSS_PROPERTY;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			case INTERNAL_CSS_VALUE:
+				state = CSS_VALUE;
+				languageIndex = LANG_INDEX_CSS;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_PHPxxx - phpInState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_PHP:
+							state = PHP;
+							phpInState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_IN_PHP_MLC:
+							state = PHP_MLC;
+							phpInState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_IN_PHP_STRING:
+							state = PHP_STRING;
+							phpInState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_IN_PHP_CHAR:
+							state = PHP_CHAR;
+							phpInState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_CSS_STRING:
+							state = CSS_STRING;
+							languageIndex = LANG_INDEX_CSS;
+							cssPrevState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_CSS_CHAR:
+							state = CSS_CHAR_LITERAL;
+							languageIndex = LANG_INDEX_CSS;
+							cssPrevState = -initialTokenType&0xff;
+							break;
+						case INTERNAL_CSS_MLC:
+							state = CSS_C_STYLE_COMMENT;
+							languageIndex = LANG_INDEX_CSS;
+							cssPrevState = -initialTokenType&0xff;
+							break;
+					}
+				}
+				else {
+					state = Token.NULL;
+				}
+				break;
+		}
+
+		setLanguageIndex(languageIndex);
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 PHPTokenMaker(java.io.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 PHPTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 206) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 97: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 120: break;
+        case 65: 
+          { addToken(Token.OPERATOR); yybegin(CSS_VALUE);
+          }
+        case 121: break;
+        case 84: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 122: break;
+        case 73: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+          }
+        case 123: break;
+        case 23: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT);
+          }
+        case 124: break;
+        case 9: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD);
+          }
+        case 125: break;
+        case 60: 
+          { addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY);
+          }
+        case 126: break;
+        case 4: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+          }
+        case 127: break;
+        case 112: 
+          { addToken(Token.RESERVED_WORD_2);
+          }
+        case 128: break;
+        case 100: 
+          { addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState);
+          }
+        case 129: break;
+        case 98: 
+          { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT);
+          }
+        case 130: break;
+        case 36: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+          }
+        case 131: break;
+        case 5: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 132: break;
+        case 45: 
+          { addToken(Token.COMMENT_EOL); addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken;
+          }
+        case 133: break;
+        case 114: 
+          { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+          }
+        case 134: break;
+        case 99: 
+          { addToken(Token.REGEX);
+          }
+        case 135: break;
+        case 41: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+          }
+        case 136: break;
+        case 118: 
+          { int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+							  yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 137: break;
+        case 94: 
+          { addToken(Token.FUNCTION);
+          }
+        case 138: break;
+        case 38: 
+          { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 139: break;
+        case 56: 
+          { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING);
+          }
+        case 140: break;
+        case 25: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_STYLE);
+          }
+        case 141: break;
+        case 87: 
+          { /* Skip all escaped chars. */
+          }
+        case 142: break;
+        case 81: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL);
+          }
+        case 143: break;
+        case 28: 
+          { yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 144: break;
+        case 109: 
+          { if(JavaScriptTokenMaker.isJavaScriptCompatible("1.6")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+          }
+        case 145: break;
+        case 104: 
+          { if(JavaScriptTokenMaker.isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+          }
+        case 146: break;
+        case 44: 
+          { start = zzMarkedPos-1; yybegin(PHP_STRING);
+          }
+        case 147: break;
+        case 66: 
+          { /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER);
+          }
+        case 148: break;
+        case 16: 
+          { /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG);
+          }
+        case 149: break;
+        case 26: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(CSS, LANG_INDEX_CSS);
+          }
+        case 150: break;
+        case 74: 
+          { addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState);
+          }
+        case 151: break;
+        case 27: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_STYLE);
+          }
+        case 152: break;
+        case 19: 
+          { /* Allowing "<?" and "<?php" to start PHP */
+          }
+        case 153: break;
+        case 7: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+          }
+        case 154: break;
+        case 89: 
+          { /* Invalid latin-1 character \xXX */ validJSString = false;
+          }
+        case 155: break;
+        case 39: 
+          { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+          }
+        case 156: break;
+        case 107: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 157: break;
+        case 115: 
+          { yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+						  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+						  addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+						  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 158: break;
+        case 78: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); phpInState = zzLexicalState; yybegin(PHP);
+          }
+        case 159: break;
+        case 61: 
+          { /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER);
+          }
+        case 160: break;
+        case 8: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+          }
+        case 161: break;
+        case 76: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+									yybegin(INTAG_CHECK_TAG_NAME);
+          }
+        case 162: break;
+        case 50: 
+          { /* Skip escaped chars. */
+          }
+        case 163: break;
+        case 88: 
+          { /* Invalid Unicode character \\uXXXX */ validJSString = false;
+          }
+        case 164: break;
+        case 113: 
+          { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-5,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; cssPrevState = zzLexicalState; yybegin(INTAG_STYLE);
+          }
+        case 165: break;
+        case 90: 
+          { yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 166: break;
+        case 30: 
+          { addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 167: break;
+        case 43: 
+          { addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken;
+          }
+        case 168: break;
+        case 35: 
+          { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 169: break;
+        case 14: 
+          { addToken(Token.OPERATOR);
+          }
+        case 170: break;
+        case 68: 
+          { addToken(Token.OPERATOR); yybegin(CSS_PROPERTY);
+          }
+        case 171: break;
+        case 105: 
+          { start = zzMarkedPos-4; yybegin(COMMENT);
+          }
+        case 172: break;
+        case 102: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT);
+          }
+        case 173: break;
+        case 79: 
+          { addToken(Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP);
+          }
+        case 174: break;
+        case 92: 
+          { addToken(Token.VARIABLE);
+          }
+        case 175: break;
+        case 54: 
+          { /*System.out.println("CSS: " + yytext());*/ addToken(Token.IDENTIFIER);
+          }
+        case 176: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 177: break;
+        case 80: 
+          { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP);
+          }
+        case 178: break;
+        case 110: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 179: break;
+        case 22: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JAVASCRIPT, LANG_INDEX_JS);
+          }
+        case 180: break;
+        case 111: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 181: break;
+        case 91: 
+          { start = zzMarkedPos-2; yybegin(PHP_MLC);
+          }
+        case 182: break;
+        case 52: 
+          { /* Skip escaped single quotes only, but this should still work. */
+          }
+        case 183: break;
+        case 64: 
+          { addToken(Token.SEPARATOR); yybegin(CSS);
+          }
+        case 184: break;
+        case 117: 
+          { yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 185: break;
+        case 31: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING);
+          }
+        case 186: break;
+        case 47: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_PHP_MLC - phpInState); return firstToken;
+          }
+        case 187: break;
+        case 72: 
+          { addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState);
+          }
+        case 188: break;
+        case 62: 
+          { addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+          }
+        case 189: break;
+        case 37: 
+          { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+          }
+        case 190: break;
+        case 95: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.FUNCTION);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+          }
+        case 191: break;
+        case 34: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR);
+          }
+        case 192: break;
+        case 24: 
+          { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG_SCRIPT);
+          }
+        case 193: break;
+        case 83: 
+          { start = zzMarkedPos-2; yybegin(JS_MLC);
+          }
+        case 194: break;
+        case 86: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 195: break;
+        case 70: 
+          { int temp = zzMarkedPos - 2;
+						  addToken(zzStartRead, temp, Token.FUNCTION);
+						  addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+						  zzStartRead = zzCurrentPos = zzMarkedPos;
+          }
+        case 196: break;
+        case 119: 
+          { addToken(Token.ANNOTATION);
+          }
+        case 197: break;
+        case 96: 
+          { yybegin(PHP); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 198: break;
+        case 49: 
+          { yybegin(PHP); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 199: break;
+        case 29: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 200: break;
+        case 67: 
+          { addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+          }
+        case 201: break;
+        case 106: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos;
+          }
+        case 202: break;
+        case 6: 
+          { addToken(Token.MARKUP_ENTITY_REFERENCE);
+          }
+        case 203: break;
+        case 108: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 204: break;
+        case 17: 
+          { /* Shouldn't happen */ yypushback(1); yybegin(INTAG);
+          }
+        case 205: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 206: break;
+        case 55: 
+          { addEndToken(INTERNAL_CSS); return firstToken;
+          }
+        case 207: break;
+        case 116: 
+          { yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 208: break;
+        case 59: 
+          { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL);
+          }
+        case 209: break;
+        case 63: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 210: break;
+        case 51: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_IN_PHP_CHAR - phpInState); return firstToken;
+          }
+        case 211: break;
+        case 11: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+          }
+        case 212: break;
+        case 13: 
+          { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 213: break;
+        case 93: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); start = zzMarkedPos; yybegin(phpInState);
+          }
+        case 214: break;
+        case 57: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 215: break;
+        case 53: 
+          { yybegin(PHP); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+          }
+        case 216: break;
+        case 33: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 217: break;
+        case 101: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-2); //yypushback(count-2);
+									yybegin(INTAG_CHECK_TAG_NAME);
+          }
+        case 218: break;
+        case 71: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+          }
+        case 219: break;
+        case 69: 
+          { /* End of a function */ addToken(Token.SEPARATOR);
+          }
+        case 220: break;
+        case 18: 
+          { addToken(Token.MARKUP_TAG_NAME);
+          }
+        case 221: break;
+        case 10: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 222: break;
+        case 46: 
+          { start = zzMarkedPos-1; yybegin(PHP_CHAR);
+          }
+        case 223: break;
+        case 48: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_IN_PHP_STRING - phpInState); return firstToken;
+          }
+        case 224: break;
+        case 82: 
+          { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT);
+          }
+        case 225: break;
+        case 40: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+          }
+        case 226: break;
+        case 85: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 227: break;
+        case 15: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+          }
+        case 228: break;
+        case 103: 
+          { boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+          }
+        case 229: break;
+        case 75: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+          }
+        case 230: break;
+        case 12: 
+          { addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 231: break;
+        case 32: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 232: break;
+        case 77: 
+          { start = zzMarkedPos-2; yybegin(DTD);
+          }
+        case 233: break;
+        case 20: 
+          { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG);
+          }
+        case 234: break;
+        case 21: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT);
+          }
+        case 235: break;
+        case 42: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 236: break;
+        case 58: 
+          { /* Unknown pseudo class */ addToken(Token.DATA_TYPE);
+          }
+        case 237: break;
+        case 1: 
+          { 
+          }
+        case 238: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case PHP: {
+              addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken;
+            }
+            case 7922: break;
+            case INATTR_SINGLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 7923: break;
+            case JS_CHAR: {
+              addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 7924: break;
+            case CSS_STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+            }
+            case 7925: break;
+            case JS_MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+            }
+            case 7926: break;
+            case CSS_CHAR_LITERAL: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+            }
+            case 7927: break;
+            case INTAG_SCRIPT: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken;
+            }
+            case 7928: break;
+            case CSS_PROPERTY: {
+              addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+            }
+            case 7929: break;
+            case CSS_C_STYLE_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+            }
+            case 7930: break;
+            case PHP_MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_PHP_MLC - phpInState); return firstToken;
+            }
+            case 7931: break;
+            case CSS: {
+              addEndToken(INTERNAL_CSS); return firstToken;
+            }
+            case 7932: break;
+            case CSS_VALUE: {
+              addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+            }
+            case 7933: break;
+            case COMMENT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+            }
+            case 7934: break;
+            case INATTR_DOUBLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 7935: break;
+            case PHP_STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_IN_PHP_STRING - phpInState); return firstToken;
+            }
+            case 7936: break;
+            case JAVASCRIPT: {
+              addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 7937: break;
+            case INTAG: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 7938: break;
+            case INTAG_CHECK_TAG_NAME: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 7939: break;
+            case INATTR_SINGLE_STYLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_STYLE); return firstToken;
+            }
+            case 7940: break;
+            case DTD: {
+              addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+            }
+            case 7941: break;
+            case PHP_CHAR: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_IN_PHP_CHAR - phpInState); return firstToken;
+            }
+            case 7942: break;
+            case JS_EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 7943: break;
+            case INATTR_DOUBLE_STYLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_STYLE); return firstToken;
+            }
+            case 7944: break;
+            case INATTR_SINGLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+            }
+            case 7945: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 7946: break;
+            case INATTR_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+            }
+            case 7947: break;
+            case JS_STRING: {
+              addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 7948: break;
+            case INTAG_STYLE: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_STYLE); return firstToken;
+            }
+            case 7949: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.flex
new file mode 100644
index 0000000..c7117d4
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.flex
@@ -0,0 +1,810 @@
+/*
+ * 01/26/2008
+ *
+ * PerlTokenMaker.java - Scanner for Perl
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Perl.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated PerlTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class PerlTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_UNQUOTED			= -1;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an single quoted EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_SINGLE_QUOTED		= -2;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_UNQUOTED			= -3;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an single quoted EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_SINGLE_QUOTED		= -4;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals we are in a POD
+	 * block.
+	 */
+	public static final int INTERNAL_POD						= -5;
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PerlTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return super.getMarkOccurrencesOfTokenType(type) || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * 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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR_LITERAL;
+				start = text.offset;
+				break;
+			case Token.LITERAL_BACKQUOTE:
+				state = BACKTICKS;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_UNQUOTED:
+				state = HEREDOC_EOF_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_SINGLE_QUOTED:
+				state = HEREDOC_EOF_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_UNQUOTED:
+				state = HEREDOC_EOT_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_SINGLE_QUOTED:
+				state = HEREDOC_EOT_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_POD:
+				state = POD;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Returns whether a regular expression token can follow the specified
+	 * token.
+	 *
+	 * @param t The token to check, which may be <code>null</code>.
+	 * @return Whether a regular expression token may follow this one.
+	 */
+	private static final boolean regexCanFollow(Token t) {
+		char ch;
+		// We basically try to mimic Eclipse's JS editor's behavior here.
+		return t==null ||
+				//t.isOperator() ||
+				(t.textCount==1 && (
+					(ch=t.text[t.textOffset])=='=' ||
+					ch=='(' ||
+					ch==',' ||
+					ch=='?' ||
+					ch==':' ||
+					ch=='[' ||
+					ch=='!' ||
+					ch=='&'
+				)) ||
+				/* Operators "==", "===", "!=", "!==", etc. */
+				(t.type==Token.OPERATOR &&
+					((ch=t.text[t.textOffset+t.textCount-1])=='=' || ch=='~'));
+	}
+
+
+	/**
+	 * 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(java.io.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]
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+/*Escape							= ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)))*/
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\'\`]|"#"|"\\")
+IdentifierStart					= ({Letter}|"_")
+IdentifierPart						= ({IdentifierStart}|{Digit})
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+LineCommentBegin			= "#"
+
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral				= ({IntegerHelper1}[lL]?)
+HexLiteral				= ({IntegerHelper2}[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}+)
+
+Separator					= ([\(\)\{\}\[\]])
+Separator2				= ([\;:,.])
+
+VariableStart				= ([\$\@\%)]"$"?)
+BracedVariable				= ({VariableStart}\{{Identifier}\})
+UnbracedVariable			= ({VariableStart}{Identifier})
+BracedShellVariable			= ([\$]\{[\&\`\'\+\*\.\/\|\,\\\"\;\#\%\=\-\~\^\:\?\!\@\$\<\>\)\(\[\]\)\}])
+UnbracedShellVariable		= ([\$][\&\`\'\+\*\.\/\|\,\\\"\;\#\%\=\-\~\^\:\?\!\@\$\<\>\)\(\[\]\)])
+MatchVariable				= ([\$]{Digit})
+Variable					= ({BracedVariable}|{UnbracedVariable}|{BracedShellVariable}|{UnbracedShellVariable}|{MatchVariable})
+Regex						= ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[msixpogcadlu]*)
+
+NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>"|"->")
+AssignmentOperator			= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+BindingOperator				= ("=~"|"!~")
+FunnyOperator				= (([\*][\'\"])|([\&][\'\"]))
+Operator					= ({NonAssignmentOperator}|{AssignmentOperator}|{BindingOperator}|{FunnyOperator})
+
+PodCommandsExceptCut		= ("="("pod"|"head1"|"head2"|"head3"|"head4"|"over"|"item"|"back"|"begin"|"end"|"for"|"encoding"))
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier			= ({NonSeparator}+)
+
+
+%state STRING
+%state CHAR_LITERAL
+%state BACKTICKS
+%state HEREDOC_EOF_UNQUOTED
+%state HEREDOC_EOF_SINGLE_QUOTED
+%state HEREDOC_EOT_UNQUOTED
+%state HEREDOC_EOT_SINGLE_QUOTED
+%state POD
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"and" |
+	"cmp" |
+	"continue" |
+	"do" |
+	"else" |
+	"elsif" |
+	"eq" |
+	"esac" |
+	"for" |
+	"foreach" |
+	"ge" |
+	"if" |
+	"last" |
+	"le" |
+	"ne" |
+	"next" |
+	"not" |
+	"or" |
+	"redo" |
+	"sub" |
+	"unless" |
+	"until" |
+	"while" |
+	"xor"				{ addToken(Token.RESERVED_WORD); }
+
+	/* Standard Functions */
+	"abs" |
+	"accept" |
+	"alarm" |
+	"atan2" |
+	"bind" |
+	"binmode" |
+	"bless" |
+	"caller" |
+	"chdir" |
+	"chmod" |
+	"chomp" |
+	"chop" |
+	"chown" |
+	"chr" |
+	"chroot" |
+	"close" |
+	"closedir" |
+	"connect" |
+	"cos" |
+	"crypt" |
+	"dbmclose" |
+	"dbmopen" |
+	"defined" |
+	"delete" |
+	"die" |
+	"dump" |
+	"each" |
+	"endgrent" |
+	"endhostent" |
+	"endnetent" |
+	"endprotoent" |
+	"endpwent" |
+	"endservent" |
+	"eof" |
+	"eval" |
+	"exec" |
+	"exists" |
+	"exit" |
+	"exp" |
+	"fcntl" |
+	"fileno" |
+	"flock" |
+	"fork" |
+	"formline" |
+	"getc" |
+	"getgrent" |
+	"getgrgid" |
+	"getgrnam" |
+	"gethostbyaddr" |
+	"gethostbyname" |
+	"gethostent" |
+	"getlogin" |
+	"getnetbyaddr" |
+	"getnetbyname" |
+	"getnetent" |
+	"getpeername" |
+	"getpgrp" |
+	"getppid" |
+	"getpriority" |
+	"getprotobyname" |
+	"getprotobynumber" |
+	"getprotoent" |
+	"getpwent" |
+	"getpwnam" |
+	"getpwuid" |
+	"getservbyname" |
+	"getservbyport" |
+	"getservent" |
+	"getsockname" |
+	"getsockopt" |
+	"glob" |
+	"gmtime" |
+	"goto" |
+	"grep" |
+	"hex" |
+	"index" |
+	"int" |
+	"ioctl" |
+	"join" |
+	"keys" |
+	"kill" |
+	"last" |
+	"lc" |
+	"lcfirst" |
+	"length" |
+	"link" |
+	"listen" |
+	"local" |
+	"localtime" |
+	"log" |
+	"lstat" |
+	"map" |
+	"mkdir" |
+	"msgctl" |
+	"msgget" |
+	"msgrcv" |
+	"msgsnd" |
+	"my" |
+	"next" |
+	"no" |
+	"oct" |
+	"open" |
+	"opendir" |
+	"ord" |
+	"our" |
+	"pack" |
+	"package" |
+	"pipe" |
+	"pop" |
+	"pos" |
+	"print" |
+	"printf" |
+	"prototype" |
+	"push" |
+	"quotemeta" |
+	"rand" |
+	"read" |
+	"readdir" |
+	"readline" |
+	"readlink" |
+	"readpipe" |
+	"recv" |
+	"redo" |
+	"ref" |
+	"rename" |
+	"require" |
+	"reset" |
+	"return" |
+	"reverse" |
+	"rewinddir" |
+	"rindex" |
+	"rmdir" |
+	"scalar" |
+	"seek" |
+	"seekdir" |
+	"select" |
+	"semctl" |
+	"semget" |
+	"semop" |
+	"send" |
+	"sethostent" |
+	"setgrent" |
+	"setnetent" |
+	"setpgrp" |
+	"setpriority" |
+	"setprotoent" |
+	"setpwent" |
+	"setservent" |
+	"setsockopt" |
+	"shift" |
+	"shmctl" |
+	"shmget" |
+	"shmread" |
+	"shmwrite" |
+	"shutdown" |
+	"sin" |
+	"sleep" |
+	"socket" |
+	"socketpair" |
+	"sort" |
+	"splice" |
+	"split" |
+	"sprintf" |
+	"sqrt" |
+	"srand" |
+	"stat" |
+	"study" |
+	"sub" |
+	"substr" |
+	"symlink" |
+	"syscall" |
+	"sysopen" |
+	"sysread" |
+	"sysseek" |
+	"system" |
+	"syswrite" |
+	"tell" |
+	"telldir" |
+	"tie" |
+	"tied" |
+	"time" |
+	"times" |
+	"truncate" |
+	"uc" |
+	"ucfirst" |
+	"umask" |
+	"undef" |
+	"unlink" |
+	"unpack" |
+	"unshift" |
+	"untie" |
+	"use" |
+	"utime" |
+	"values" |
+	"vec" |
+	"wait" |
+	"waitpid" |
+	"wantarray" |
+	"warn" |
+	"write"			{ addToken(Token.FUNCTION); }
+
+}
+
+<YYINITIAL> {
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+	{Variable}					{ addToken(Token.VARIABLE); }
+
+	/* String/Character literals. */
+	\"							{ start = zzMarkedPos-1; yybegin(STRING); }
+	\'							{ start = zzMarkedPos-1; yybegin(CHAR_LITERAL); }
+	\`							{ start = zzMarkedPos-1; yybegin(BACKTICKS); }
+
+	/* Comment literals. */
+	{LineCommentBegin}"!".*			{ addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; }
+	{LineCommentBegin}.*			{ addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+	/* Easily identifiable regexes of the form "/.../". This is not foolproof. */
+	{Regex}		{
+					boolean highlightedAsRegex = false;
+					if (firstToken==null) {
+						addToken(Token.REGEX);
+						highlightedAsRegex = true;
+					}
+					else {
+						// If this is *likely* to be a regex, based on
+						// the previous token, highlight it as such.
+						Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+						if (regexCanFollow(t)) {
+							addToken(Token.REGEX);
+							highlightedAsRegex = true;
+						}
+					}
+					// If it doesn't *appear* to be a regex, highlight it as
+					// individual tokens.
+					if (!highlightedAsRegex) {
+						int temp = zzStartRead + 1;
+						addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+						zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+					}
+				}
+
+	/* More regexes (m/.../, s!...!!, etc.).  This is nowhere near */
+	/* exhaustive, but is rather just the common ones.             */
+	m"/"[^/]*"/"[msixpodualgc]*				{ addToken(Token.REGEX); }
+	m"!"[^!]*"!"[msixpodualgc]*				{ addToken(Token.REGEX); }
+	m"|"[^\|]*"|"[msixpodualgc]*			{ addToken(Token.REGEX); }
+	m\\[^\\]*\\[msixpodualgc]*				{ addToken(Token.REGEX); }
+	s"/"[^/]*"/"[^/]*"/"[msixpodualgcer]*	{ addToken(Token.REGEX); }
+	s"!"[^!]*"!"[^!]*"!"[msixpodualgcer]*	{ addToken(Token.REGEX); }
+	s"|"[^\|]*"|"[^\|]*"|"[msixpodualgcer]*	{ addToken(Token.REGEX); }
+	(tr|y)"/"[^/]*"/"[^/]*"/"[cdsr]*		{ addToken(Token.REGEX); }
+	(tr|y)"!"[^!]*"!"[^!]*"!"[cdsr]*		{ addToken(Token.REGEX); }
+	(tr|y)"|"[^\|]*"|"[^\|]*"|"[cdsr]*		{ addToken(Token.REGEX); }
+	(tr|y)\\[^\\]*\\[^\\]*\\[cdsr]*		{ addToken(Token.REGEX); }
+	qr"/"[^/]*"/"[msixpodual]*			{ addToken(Token.REGEX); }
+	qr"!"[^/]*"!"[msixpodual]*			{ addToken(Token.REGEX); }
+	qr"|"[^/]*"|"[msixpodual]*			{ addToken(Token.REGEX); }
+	qr\\[^/]*\\[msixpodual]*			{ addToken(Token.REGEX); }
+
+	/* "Here-document" syntax.  This is only implemented for the common */
+	/* cases.                                                           */
+	"<<EOF"						{ start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+	"<<" {WhiteSpace}* \""EOF"\"		{ start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+	"<<" {WhiteSpace}* \'"EOF"\'		{ start = zzStartRead; yybegin(HEREDOC_EOF_SINGLE_QUOTED); }
+	"<<" {WhiteSpace}* \`"EOF"\`		{ start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+	"<<EOT"						{ start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+	"<<" {WhiteSpace}* \""EOT"\"		{ start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+	"<<" {WhiteSpace}* \'"EOT"\'		{ start = zzStartRead; yybegin(HEREDOC_EOT_SINGLE_QUOTED); }
+	"<<" {WhiteSpace}* \`"EOT"\`		{ start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+
+	/* POD commands. */
+	{PodCommandsExceptCut}			{ addToken(Token.COMMENT_EOL); start = zzMarkedPos; yybegin(POD); }
+
+	/* Separators and operators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+	{Operator}					{ 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); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<STRING> {
+	[^\n\\\$\@\%\"]+		{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	{Variable}			{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	{VariableStart}		{}
+	\"					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+
+<CHAR_LITERAL> {
+	[^\n\\\']+			{}
+	\\.?					{ /* Skip escaped single quotes only, but this should still work. */ }
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+	\'					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+}
+
+
+<BACKTICKS> {
+	[^\n\\\$\@\%\`]+		{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	{Variable}			{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	{VariableStart}		{}
+	\`					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
+}
+
+
+<HEREDOC_EOF_UNQUOTED> {
+	/* NOTE: The closing "EOF" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOF" will match any line containing  */
+	/* EOF and any other chars.                                         */
+	/* NOTE2: This case is used for unquoted <<EOF, double quoted       */
+	/* <<"EOF" and backticks <<`EOF`, since they all follow the same    */
+	/* syntactic rules.                                                 */
+	"EOF"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\\$\@\%]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	{Variable}			{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.PREPROCESSOR); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	{VariableStart}		{}
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOF_SINGLE_QUOTED> {
+	/* NOTE: The closing "EOF" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOF" will match any line containing  */
+	/* EOF and any other chars.                                         */
+	"EOF"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOT_UNQUOTED> {
+	/* NOTE: The closing "EOT" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOT" will match any line containing  */
+	/* EOF and any other chars.                                         */
+	/* NOTE2: This case is used for unquoted <<EOT, double quoted       */
+	/* <<"EOT" and backticks <<`EOT`, since they all follow the same    */
+	/* syntactic rules.                                                 */
+	"EOT"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\\$\@\%]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	{Variable}			{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.PREPROCESSOR); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	{VariableStart}		{}
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOT_SINGLE_QUOTED> {
+	/* NOTE: The closing "EOT" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOT" will match any line containing  */
+	/* EOT and any other chars.                                         */
+	"EOT"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<POD> {
+	[^\n\=]+				{}
+	"=cut"				{ if (start==zzStartRead) { addToken(Token.COMMENT_DOCUMENTATION); yybegin(YYINITIAL); } }
+	{PodCommandsExceptCut}	{ if (start==zzStartRead) { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; } }
+	=					{}
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_POD); return firstToken; }
+}
+
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.java
new file mode 100644
index 0000000..729c496
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.java
@@ -0,0 +1,2106 @@
+/* The following code was generated by JFlex 1.4.1 on 3/11/12 12:58 AM */
+
+/*
+ * 01/26/2008
+ *
+ * PerlTokenMaker.java - Scanner for Perl
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Perl.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated PerlTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class PerlTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int HEREDOC_EOF_SINGLE_QUOTED = 5;
+  public static final int HEREDOC_EOT_SINGLE_QUOTED = 7;
+  public static final int HEREDOC_EOT_UNQUOTED = 6;
+  public static final int STRING = 1;
+  public static final int BACKTICKS = 3;
+  public static final int YYINITIAL = 0;
+  public static final int HEREDOC_EOF_UNQUOTED = 4;
+  public static final int CHAR_LITERAL = 2;
+  public static final int POD = 8;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\12\1\11\1\0\1\12\1\6\22\0\1\12\1\46\1\102"+
+    "\1\7\1\26\1\24\1\50\1\53\1\21\1\25\1\33\1\41\1\22"+
+    "\1\17\1\20\1\32\1\3\1\61\1\62\1\61\1\61\3\5\2\2"+
+    "\1\22\1\22\1\42\1\43\1\45\1\47\1\23\3\4\1\15\1\16"+
+    "\1\104\5\1\1\14\2\1\1\103\4\1\1\105\3\1\1\13\2\1"+
+    "\1\21\1\10\1\21\1\44\1\1\1\31\1\60\1\70\1\35\1\40"+
+    "\1\57\1\74\1\72\1\56\1\65\1\101\1\71\1\37\1\67\1\73"+
+    "\1\55\1\54\1\76\1\64\1\34\1\66\1\75\1\63\1\77\1\36"+
+    "\1\100\1\1\1\27\1\52\1\30\1\51\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 =
+    "\11\0\1\1\1\2\2\3\1\1\1\4\1\5\1\6"+
+    "\1\7\1\2\1\10\1\2\1\1\1\7\1\10\1\1"+
+    "\1\11\2\7\5\2\10\7\1\12\24\2\1\13\1\14"+
+    "\1\15\1\16\3\14\1\17\1\14\1\20\1\21\1\22"+
+    "\1\14\1\23\3\14\1\24\1\14\1\25\5\14\1\26"+
+    "\1\14\1\27\1\14\1\30\2\14\1\31\1\14\1\32"+
+    "\1\3\1\33\1\32\1\33\1\32\1\34\1\32\1\4"+
+    "\1\35\1\36\1\1\1\0\1\36\1\0\3\36\3\0"+
+    "\1\7\1\0\2\2\2\0\22\2\1\37\1\2\1\40"+
+    "\2\2\1\40\4\2\10\0\1\7\7\2\1\40\31\2"+
+    "\1\1\1\0\1\2\2\0\1\2\1\37\6\2\1\40"+
+    "\2\2\1\37\1\40\14\2\1\1\3\0\1\2\1\15"+
+    "\1\41\1\14\1\0\2\41\1\0\1\20\1\42\1\14"+
+    "\1\0\2\42\1\0\1\14\1\43\1\14\1\0\2\43"+
+    "\1\0\3\14\10\0\1\33\1\0\2\34\1\0\1\44"+
+    "\1\0\1\2\2\0\14\2\1\40\6\2\1\37\15\2"+
+    "\15\0\33\2\1\37\1\2\1\0\2\45\7\2\1\40"+
+    "\10\2\1\1\3\0\5\2\1\0\1\1\5\0\1\46"+
+    "\1\0\1\46\11\0\1\45\10\2\1\37\26\2\4\0"+
+    "\1\47\5\0\1\37\11\2\1\37\5\2\1\37\17\2"+
+    "\1\0\4\45\2\2\1\37\1\2\1\0\2\45\1\50"+
+    "\1\51\5\0\16\2\1\37\2\2\1\52\1\53\6\0"+
+    "\2\2\1\37\25\2\1\45\2\2\3\0\1\37\7\2"+
+    "\7\0\14\2\1\0\4\2\1\54\1\55\1\0\10\2"+
+    "\1\0\1\2\1\0\4\2\1\0\12\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[601];
+    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\106\0\214\0\322\0\u0118\0\u015e\0\u01a4\0\u01ea"+
+    "\0\u0230\0\u0276\0\u02bc\0\u0302\0\u0348\0\u038e\0\u03d4\0\u038e"+
+    "\0\u041a\0\u0460\0\u04a6\0\u038e\0\u038e\0\u04ec\0\u0532\0\u0578"+
+    "\0\u05be\0\u038e\0\u0604\0\u064a\0\u0690\0\u06d6\0\u071c\0\u0762"+
+    "\0\u07a8\0\u07ee\0\u0834\0\u087a\0\u08c0\0\u0906\0\u094c\0\u038e"+
+    "\0\u0992\0\u038e\0\u09d8\0\u0a1e\0\u0a64\0\u0aaa\0\u0af0\0\u0b36"+
+    "\0\u0b7c\0\u0bc2\0\u0c08\0\u0c4e\0\u0c94\0\u0cda\0\u0d20\0\u0d66"+
+    "\0\u0dac\0\u0df2\0\u0e38\0\u0e7e\0\u0ec4\0\u0f0a\0\u038e\0\u0f50"+
+    "\0\u0f96\0\u038e\0\u0fdc\0\u1022\0\u1068\0\u038e\0\u10ae\0\u10f4"+
+    "\0\u038e\0\u038e\0\u113a\0\u038e\0\u1180\0\u11c6\0\u120c\0\u038e"+
+    "\0\u1252\0\u038e\0\u1298\0\u12de\0\u1324\0\u136a\0\u13b0\0\u038e"+
+    "\0\u13f6\0\u038e\0\u143c\0\u038e\0\u1482\0\u14c8\0\u038e\0\u150e"+
+    "\0\u1554\0\u1554\0\u1554\0\u159a\0\u15e0\0\u1626\0\u166c\0\u16b2"+
+    "\0\u16f8\0\u173e\0\u1784\0\u17ca\0\u1810\0\u1856\0\u189c\0\u0276"+
+    "\0\u038e\0\u17ca\0\u18e2\0\u1928\0\u196e\0\u1928\0\u19b4\0\u19fa"+
+    "\0\u1a40\0\u1a86\0\u1acc\0\u1b12\0\u1b58\0\u1b9e\0\u1be4\0\u1c2a"+
+    "\0\u1c70\0\u1cb6\0\u1cfc\0\u1d42\0\u1d88\0\u1dce\0\u1e14\0\u1e5a"+
+    "\0\u1ea0\0\u1ee6\0\u1f2c\0\u1f72\0\u1fb8\0\u1ffe\0\u2044\0\u208a"+
+    "\0\u20d0\0\u2116\0\u02bc\0\u215c\0\u21a2\0\u21e8\0\u222e\0\u2274"+
+    "\0\u22ba\0\u2300\0\u2346\0\u238c\0\u23d2\0\u2418\0\u245e\0\u24a4"+
+    "\0\u24ea\0\u2530\0\u2576\0\u25bc\0\u2602\0\u2648\0\u268e\0\u26d4"+
+    "\0\u271a\0\u2760\0\u27a6\0\u27ec\0\u2832\0\u2878\0\u28be\0\u2904"+
+    "\0\u294a\0\u2990\0\u29d6\0\u2a1c\0\u2a62\0\u2aa8\0\u2aee\0\u2b34"+
+    "\0\u2b7a\0\u2bc0\0\u2c06\0\u2c4c\0\u2c92\0\u2cd8\0\u2d1e\0\u2d64"+
+    "\0\u2daa\0\u2df0\0\u2e36\0\u2e7c\0\u2ec2\0\u2f08\0\u2f4e\0\u02bc"+
+    "\0\u2f94\0\u2fda\0\u3020\0\u3066\0\u30ac\0\u30f2\0\u3138\0\u317e"+
+    "\0\u31c4\0\u320a\0\u3250\0\u3296\0\u32dc\0\u3322\0\u3368\0\u33ae"+
+    "\0\u33f4\0\u343a\0\u3480\0\u34c6\0\u350c\0\u3552\0\u3598\0\u35de"+
+    "\0\u3624\0\u366a\0\u36b0\0\u36f6\0\u038e\0\u373c\0\u3782\0\u37c8"+
+    "\0\u038e\0\u3782\0\u380e\0\u038e\0\u3854\0\u389a\0\u38e0\0\u038e"+
+    "\0\u389a\0\u3926\0\u396c\0\u39b2\0\u39f8\0\u3a3e\0\u038e\0\u39f8"+
+    "\0\u3a84\0\u3aca\0\u3b10\0\u3b56\0\u3b9c\0\u3be2\0\u3c28\0\u3c6e"+
+    "\0\u3cb4\0\u3cfa\0\u3d40\0\u3d86\0\u3dcc\0\u3e12\0\u1554\0\u3e58"+
+    "\0\u3e9e\0\u3ee4\0\u3f2a\0\u3f70\0\u3fb6\0\u3ffc\0\u4042\0\u4088"+
+    "\0\u40ce\0\u4114\0\u415a\0\u41a0\0\u41e6\0\u422c\0\u4272\0\u42b8"+
+    "\0\u26d4\0\u42fe\0\u4344\0\u438a\0\u43d0\0\u4416\0\u445c\0\u44a2"+
+    "\0\u44e8\0\u452e\0\u4574\0\u45ba\0\u4600\0\u4646\0\u468c\0\u46d2"+
+    "\0\u4718\0\u320a\0\u475e\0\u47a4\0\u47ea\0\u4830\0\u4876\0\u48bc"+
+    "\0\u4902\0\u4948\0\u498e\0\u49d4\0\u4a1a\0\u4a60\0\u4aa6\0\u4aec"+
+    "\0\u4b32\0\u4b78\0\u4bbe\0\u4c04\0\u4c4a\0\u4c90\0\u4cd6\0\u4d1c"+
+    "\0\u4d62\0\u4da8\0\u4dee\0\u4e34\0\u4e7a\0\u4ec0\0\u4f06\0\u4f4c"+
+    "\0\u4f92\0\u4fd8\0\u501e\0\u5064\0\u50aa\0\u50f0\0\u5136\0\u517c"+
+    "\0\u51c2\0\u5208\0\u524e\0\u5294\0\u52da\0\u5320\0\u5366\0\u26d4"+
+    "\0\u53ac\0\u53f2\0\u5438\0\u547e\0\u54c4\0\u550a\0\u5550\0\u5596"+
+    "\0\u55dc\0\u5622\0\u5668\0\u56ae\0\u56f4\0\u573a\0\u5780\0\u57c6"+
+    "\0\u580c\0\u5852\0\u5898\0\u58de\0\u5924\0\u596a\0\u59b0\0\u59f6"+
+    "\0\u5a3c\0\u5a82\0\u5ac8\0\u5b0e\0\u5b54\0\u5b9a\0\u5be0\0\u5c26"+
+    "\0\u5c6c\0\u5cb2\0\u5cf8\0\u5d3e\0\u1252\0\u5d84\0\u13b0\0\u5dca"+
+    "\0\u5e10\0\u5e56\0\u5e9c\0\u5ee2\0\u5f28\0\u5f6e\0\u5fb4\0\u5ffa"+
+    "\0\u6040\0\u6086\0\u60cc\0\u6112\0\u6158\0\u619e\0\u61e4\0\u622a"+
+    "\0\u6270\0\u2c4c\0\u62b6\0\u62fc\0\u6342\0\u6388\0\u63ce\0\u6414"+
+    "\0\u645a\0\u64a0\0\u64e6\0\u652c\0\u6572\0\u65b8\0\u65fe\0\u6644"+
+    "\0\u668a\0\u66d0\0\u6716\0\u675c\0\u67a2\0\u67e8\0\u682e\0\u6874"+
+    "\0\u68ba\0\u6900\0\u6946\0\u698c\0\u038e\0\u69d2\0\u6a18\0\u6a5e"+
+    "\0\u6aa4\0\u6aea\0\u6b30\0\u6b76\0\u6bbc\0\u6c02\0\u6c48\0\u6c8e"+
+    "\0\u6cd4\0\u6d1a\0\u6d60\0\u6da6\0\u6dec\0\u6e32\0\u6e78\0\u6ebe"+
+    "\0\u6f04\0\u6f4a\0\u2a62\0\u6f90\0\u6fd6\0\u701c\0\u7062\0\u70a8"+
+    "\0\u70ee\0\u7134\0\u717a\0\u71c0\0\u7206\0\u724c\0\u7292\0\u72d8"+
+    "\0\u731e\0\u7364\0\u73aa\0\u73f0\0\u7436\0\u747c\0\u74c2\0\u7508"+
+    "\0\u754e\0\u7594\0\u75da\0\u7620\0\u7666\0\u76ac\0\u038e\0\u038e"+
+    "\0\u76f2\0\u7738\0\u777e\0\u77c4\0\u780a\0\u7850\0\u7896\0\u78dc"+
+    "\0\u7922\0\u7968\0\u79ae\0\u79f4\0\u7a3a\0\u7a80\0\u7ac6\0\u7b0c"+
+    "\0\u7b52\0\u7b98\0\u7bde\0\u31c4\0\u7c24\0\u7c6a\0\u038e\0\u038e"+
+    "\0\u7cb0\0\u7cf6\0\u7d3c\0\u7d82\0\u7dc8\0\u7e0e\0\u7e54\0\u7e9a"+
+    "\0\u2878\0\u7ee0\0\u7f26\0\u7f6c\0\u7fb2\0\u7ff8\0\u803e\0\u8084"+
+    "\0\u80ca\0\u8110\0\u8156\0\u819c\0\u81e2\0\u8228\0\u826e\0\u82b4"+
+    "\0\u82fa\0\u8340\0\u8386\0\u83cc\0\u8412\0\u8458\0\u849e\0\u84e4"+
+    "\0\u852a\0\u8570\0\u85b6\0\u85fc\0\u8642\0\u8688\0\u86ce\0\u8714"+
+    "\0\u875a\0\u87a0\0\u87e6\0\u882c\0\u8872\0\u88b8\0\u88fe\0\u8944"+
+    "\0\u898a\0\u89d0\0\u8a16\0\u8a5c\0\u8aa2\0\u8ae8\0\u8b2e\0\u8b74"+
+    "\0\u8bba\0\u8c00\0\u8c46\0\u8c8c\0\u8cd2\0\u8d18\0\u8d5e\0\u8da4"+
+    "\0\u8dea\0\u8e30\0\u8e76\0\u8ebc\0\u038e\0\u038e\0\u8f02\0\u8f48"+
+    "\0\u8f8e\0\u8fd4\0\u901a\0\u9060\0\u90a6\0\u90ec\0\u9132\0\u9178"+
+    "\0\u91be\0\u9204\0\u924a\0\u9290\0\u92d6\0\u931c\0\u9362\0\u93a8"+
+    "\0\u93ee\0\u9434\0\u947a\0\u94c0\0\u9506\0\u954c\0\u9592\0\u95d8"+
+    "\0\u961e";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[601];
+    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\12\1\13\1\14\1\15\1\13\1\14\1\16\1\17"+
+    "\1\12\1\20\1\21\4\13\1\22\1\23\1\24\1\25"+
+    "\1\26\1\27\1\30\1\31\2\24\1\32\1\33\1\34"+
+    "\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44"+
+    "\1\45\1\46\1\47\1\50\1\51\1\50\1\45\1\52"+
+    "\1\53\1\54\1\55\1\56\1\57\2\14\1\60\1\61"+
+    "\1\62\1\63\1\64\1\65\1\66\1\67\1\70\1\71"+
+    "\1\72\1\73\1\74\1\75\1\76\1\77\3\13\10\100"+
+    "\1\101\1\102\11\100\2\103\1\104\1\105\53\100\1\106"+
+    "\3\100\10\107\1\110\1\111\41\107\1\112\32\107\10\113"+
+    "\1\101\1\114\11\113\2\115\1\116\1\117\2\113\1\120"+
+    "\54\113\10\121\1\101\1\122\4\121\1\123\4\121\2\124"+
+    "\1\125\1\126\57\121\10\127\1\101\1\130\4\127\1\131"+
+    "\67\127\10\121\1\101\1\132\4\121\1\133\4\121\2\124"+
+    "\1\125\1\126\57\121\10\127\1\101\1\134\4\127\1\135"+
+    "\67\127\11\136\1\137\31\136\1\140\42\136\6\12\1\0"+
+    "\2\12\2\0\4\12\4\0\1\12\2\0\1\12\5\0"+
+    "\5\12\13\0\26\12\1\0\4\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\26\13\1\0\3\13\2\141\2\14\1\141\1\14"+
+    "\1\0\2\141\2\0\1\141\1\142\1\143\1\144\1\0"+
+    "\1\145\2\0\1\141\2\0\1\141\5\0\3\141\1\142"+
+    "\1\143\13\0\3\141\1\144\1\141\2\14\11\141\1\143"+
+    "\5\141\1\0\1\141\1\143\3\141\1\146\1\147\1\141"+
+    "\1\147\1\0\2\141\2\0\1\150\1\142\1\143\1\144"+
+    "\1\0\1\145\2\0\1\141\2\0\1\141\5\0\2\141"+
+    "\1\150\1\142\1\143\13\0\3\141\1\144\1\141\2\147"+
+    "\11\141\1\143\5\141\1\0\1\141\1\143\1\141\106\0"+
+    "\11\151\1\0\34\151\1\152\37\151\12\0\1\21\112\0"+
+    "\1\50\23\0\1\50\1\0\1\50\42\0\2\145\1\0"+
+    "\1\145\53\0\2\145\23\0\1\12\1\153\2\12\1\153"+
+    "\1\12\1\0\2\12\2\0\4\153\4\0\1\12\2\0"+
+    "\1\154\1\155\4\0\5\153\13\0\5\153\2\12\17\153"+
+    "\1\0\3\153\1\0\1\156\2\0\1\156\6\0\4\156"+
+    "\7\0\1\157\1\155\4\0\5\156\2\0\1\50\10\0"+
+    "\5\156\2\0\17\156\1\0\3\156\1\0\1\156\2\0"+
+    "\1\156\6\0\4\156\7\0\1\157\1\155\4\0\5\156"+
+    "\13\0\5\156\2\0\17\156\1\0\3\156\1\12\1\153"+
+    "\2\160\1\153\1\160\1\0\2\160\2\0\4\153\4\161"+
+    "\1\160\2\161\1\162\1\163\1\0\3\161\5\153\13\161"+
+    "\5\153\2\160\17\153\1\161\3\153\10\164\1\165\21\164"+
+    "\2\0\7\164\1\166\42\164\43\0\1\50\7\0\1\50"+
+    "\26\0\1\50\3\0\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\3\0\1\167\1\0"+
+    "\1\13\1\170\1\13\1\171\1\13\5\0\1\172\3\0"+
+    "\1\173\1\0\1\174\1\175\1\176\1\177\4\13\1\200"+
+    "\1\201\1\202\6\13\1\203\1\204\1\13\1\205\1\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\3\13\1\206\1\13"+
+    "\13\0\1\13\1\207\1\210\1\13\1\211\3\13\1\212"+
+    "\2\13\1\213\12\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\214\24\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\215\1\216\3\13\13\0\1\13\1\217"+
+    "\1\13\1\220\1\221\4\13\1\222\14\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\13\1\223\1\13"+
+    "\1\224\5\13\1\225\2\13\1\226\4\13\1\227\4\13"+
+    "\1\0\3\13\41\0\1\50\1\0\1\50\104\0\1\230"+
+    "\1\50\105\0\1\50\5\0\1\50\2\0\1\231\1\232"+
+    "\1\233\1\234\5\0\1\235\2\0\1\236\3\0\1\237"+
+    "\54\0\1\50\105\0\1\50\1\0\1\240\103\0\1\50"+
+    "\5\0\1\50\77\0\1\50\4\0\1\50\2\0\1\50"+
+    "\26\0\1\50\3\0\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\1\13\1\241\2\13\1\242\3\13\1\243\1\244\7\13"+
+    "\1\245\4\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\1\13"+
+    "\1\246\3\13\13\0\1\247\7\13\1\250\10\13\1\251"+
+    "\4\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\3\13\1\252\22\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\253\1\13\1\254\1\255\1\13\13\0\1\13\1\256"+
+    "\2\13\1\257\2\13\1\260\7\13\1\261\2\13\1\223"+
+    "\3\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\13\1\262"+
+    "\1\13\1\263\1\13\13\0\12\13\1\264\1\13\1\265"+
+    "\2\13\1\266\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\3\13\1\267\1\270\21\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\271\1\272"+
+    "\4\13\1\273\1\13\1\274\12\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\13\1\275\15\13\1\276"+
+    "\1\223\5\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\277\4\13\1\300\1\301\14\13\1\0"+
+    "\3\13\1\12\5\13\1\0\1\12\1\302\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\3\0\1\303\1\0\1\304"+
+    "\4\13\5\0\1\305\3\0\1\306\1\0\4\13\1\307"+
+    "\10\13\1\274\6\13\1\310\1\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\3\13\1\311\1\13\13\0\11\13\1\312"+
+    "\14\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\3\13\1\313\5\13\1\314\14\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\3\13\1\315\1\13\13\0\1\13\1\316"+
+    "\1\13\1\317\4\13\1\320\2\13\1\321\12\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\1\13\1\322"+
+    "\1\13\1\323\22\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\13\1\324\1\13\1\325\1\13\13\0\1\13\1\326"+
+    "\7\13\1\327\14\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\225\1\216\3\13\13\0\12\13\1\330\1\331\3\13"+
+    "\1\332\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\10\13\1\333\10\13\1\334\4\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\2\13\1\335\1\13"+
+    "\1\336\3\13\1\337\15\13\1\0\3\13\1\12\5\13"+
+    "\1\0\1\12\1\340\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\3\0\1\341\1\0\5\13\5\0\1\342\3\0"+
+    "\1\343\1\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\344\24\13\1\0\3\13\10\100"+
+    "\2\0\11\100\2\0\1\100\1\0\53\100\1\0\3\100"+
+    "\11\345\1\0\74\345\1\0\1\346\2\0\1\346\6\0"+
+    "\4\346\7\0\1\347\1\350\4\0\5\346\13\0\5\346"+
+    "\2\0\17\346\1\0\3\346\10\100\2\0\11\100\2\0"+
+    "\1\100\1\347\53\100\1\0\3\100\1\0\1\346\2\351"+
+    "\1\346\1\351\1\0\2\351\2\0\4\346\7\351\1\352"+
+    "\1\353\1\0\3\351\5\346\13\351\5\346\2\351\17\346"+
+    "\1\351\3\346\10\107\2\0\41\107\1\0\32\107\11\354"+
+    "\1\0\74\354\10\113\2\0\11\113\2\0\1\113\1\0"+
+    "\2\113\1\0\54\113\1\0\1\355\2\0\1\355\6\0"+
+    "\4\355\7\0\1\356\1\357\4\0\5\355\13\0\5\355"+
+    "\2\0\17\355\1\0\3\355\10\113\2\0\11\113\2\0"+
+    "\1\113\1\356\2\113\1\0\54\113\1\0\1\355\2\360"+
+    "\1\355\1\360\1\0\2\360\2\0\4\355\7\360\1\361"+
+    "\1\362\1\0\3\360\5\355\13\360\5\355\2\360\17\355"+
+    "\1\360\3\355\10\121\2\0\11\121\2\0\1\121\1\0"+
+    "\67\121\2\0\11\121\2\0\1\121\1\0\54\121\1\363"+
+    "\2\121\1\0\1\364\2\0\1\364\6\0\4\364\7\0"+
+    "\1\365\1\366\4\0\5\364\13\0\5\364\2\0\17\364"+
+    "\1\0\3\364\10\121\2\0\11\121\2\0\1\121\1\365"+
+    "\57\121\1\0\1\364\2\367\1\364\1\367\1\0\2\367"+
+    "\2\0\4\364\7\367\1\370\1\371\1\0\3\367\5\364"+
+    "\13\367\5\364\2\367\17\364\1\367\3\364\10\127\2\0"+
+    "\104\127\2\0\71\127\1\372\2\127\10\121\2\0\11\121"+
+    "\2\0\1\121\1\0\54\121\1\373\2\121\10\127\2\0"+
+    "\71\127\1\374\2\127\11\136\1\0\31\136\1\0\42\136"+
+    "\35\0\1\375\16\0\1\376\1\377\1\u0100\1\u0101\5\0"+
+    "\1\u0102\2\0\1\u0103\3\0\1\u0104\11\0\6\141\1\0"+
+    "\2\141\2\0\4\141\4\0\1\141\2\0\1\141\5\0"+
+    "\5\141\13\0\26\141\1\0\5\141\2\u0105\1\141\1\u0105"+
+    "\1\0\2\141\2\0\4\141\1\u0106\3\0\1\141\2\0"+
+    "\1\141\5\0\5\141\1\u0106\12\0\5\141\2\u0105\17\141"+
+    "\1\0\5\141\2\145\1\141\1\145\1\0\2\141\2\0"+
+    "\2\141\1\143\1\144\4\0\1\141\2\0\1\141\5\0"+
+    "\4\141\1\143\13\0\3\141\1\144\1\141\2\145\11\141"+
+    "\1\143\5\141\1\0\1\141\1\143\3\141\2\146\1\141"+
+    "\1\146\1\0\2\141\2\0\2\141\1\143\1\144\1\0"+
+    "\1\145\2\0\1\141\2\0\1\141\5\0\4\141\1\143"+
+    "\13\0\3\141\1\144\1\141\2\146\11\141\1\143\5\141"+
+    "\1\0\1\141\1\143\3\141\1\146\1\147\1\141\1\147"+
+    "\1\0\2\141\2\0\1\141\1\u0107\1\143\1\144\1\0"+
+    "\1\145\2\0\1\141\2\0\1\141\5\0\3\141\1\u0107"+
+    "\1\143\13\0\3\141\1\144\1\141\2\147\11\141\1\143"+
+    "\5\141\1\0\1\141\1\143\3\141\4\u0108\1\0\2\141"+
+    "\2\0\2\141\2\u0108\4\0\1\141\2\0\1\141\5\0"+
+    "\1\141\1\u0108\2\141\1\u0108\13\0\3\141\4\u0108\5\141"+
+    "\1\u0108\3\141\1\u0108\5\141\1\0\1\141\1\u0108\1\141"+
+    "\11\151\1\0\74\151\11\152\1\0\74\152\1\12\5\153"+
+    "\1\0\2\12\2\0\4\153\4\0\1\12\2\0\1\12"+
+    "\5\0\5\153\13\0\26\153\1\0\3\153\1\12\1\153"+
+    "\2\12\1\153\1\12\1\0\2\12\2\0\4\153\4\0"+
+    "\1\12\2\0\1\12\1\155\4\0\5\153\13\0\5\153"+
+    "\2\12\17\153\1\0\3\153\1\0\1\u0109\2\0\1\u0109"+
+    "\6\0\4\u0109\15\0\5\u0109\13\0\5\u0109\2\0\17\u0109"+
+    "\1\0\3\u0109\1\0\5\156\5\0\4\156\15\0\5\156"+
+    "\13\0\26\156\1\0\3\156\1\0\1\156\2\0\1\156"+
+    "\6\0\4\156\10\0\1\155\4\0\5\156\13\0\5\156"+
+    "\2\0\17\156\1\0\3\156\1\0\1\u0109\2\0\1\u0109"+
+    "\2\0\2\161\2\0\4\u0109\10\161\1\0\4\161\5\u0109"+
+    "\13\161\5\u0109\2\0\17\u0109\1\161\3\u0109\10\164\1\165"+
+    "\21\164\1\u010a\64\164\1\0\74\164\32\167\1\u010b\53\167"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\4\13\1\u010c\21\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\3\13"+
+    "\1\320\22\13\1\0\3\13\46\172\1\u010d\37\172\52\173"+
+    "\1\u010e\33\173\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\3\13\1\u010f\1\13"+
+    "\13\0\10\13\1\u0110\15\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\1\13\1\u0111\3\13\13\0\10\13\1\246\15\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\11\13"+
+    "\1\u0112\1\13\1\u0113\5\13\1\u0114\4\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\3\13\1\u0115\1\13\13\0\3\13"+
+    "\1\u0116\6\13\1\u0117\1\u0118\3\13\1\u0119\6\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\4\13\1\272"+
+    "\21\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\17\13\1\310\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\4\13\1\246\14\13\1\u011a\4\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\14\13\1\u011b"+
+    "\11\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\10\13\1\246\15\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\u011c\4\13\13\0\13\13\1\u011d\12\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\13\1\u011e\24\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\1\310\4\13\13\0"+
+    "\17\13\1\u011f\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\4\13\1\u0120\13\0\1\13\1\u0121\6\13\1\u0122\2\13"+
+    "\1\u0123\12\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\3\13"+
+    "\1\u0124\1\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\24\13\1\u0125\1\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\223\25\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\10\13\1\223"+
+    "\15\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\12\13\1\u0126\13\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\20\13\1\u0127\5\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\13\1\u0128\3\13\13\0\16\13\1\310"+
+    "\7\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\17\13\1\u0129\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\u012a\4\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\1\u012b\4\13\13\0\17\13\1\u012c\6\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\3\13\1\u012d\1\13\13\0"+
+    "\20\13\1\u012e\5\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\3\13\1\310\22\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\13\13\1\u012f\12\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\13\13\1\307"+
+    "\12\13\1\0\3\13\12\0\1\u0130\3\0\1\u0131\12\0"+
+    "\1\u0132\11\0\1\50\7\0\1\u0133\26\0\1\u0134\60\0"+
+    "\1\u0135\113\0\1\u0136\101\0\1\u0137\121\0\1\u0138\100\0"+
+    "\1\u0139\76\0\1\u013a\1\u013b\102\0\1\u013c\73\0\1\50"+
+    "\1\0\1\45\40\0\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\310\4\13"+
+    "\13\0\1\310\25\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\13\1\u013d\3\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\13\1\u013e\7\13\1\u013f"+
+    "\14\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\1\225\25\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\1\u0140"+
+    "\4\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\12\13\1\310\13\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\3\13\1\u0141\22\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\4\13\1\310\13\0\26\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\10\13"+
+    "\1\310\15\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\2\13"+
+    "\1\310\2\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\4\13\1\u0142\21\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\310\2\13\1\267"+
+    "\5\13\1\u0143\14\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\u0144\4\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\20\13\1\310\5\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\1\13\1\u0140\3\13\13\0\26\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\4\13"+
+    "\1\u0145\21\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\4\13"+
+    "\1\u0146\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\13\1\u0147\3\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\4\13\1\u0148\21\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\4\13\1\u0149"+
+    "\21\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\310\4\13"+
+    "\13\0\26\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\4\13"+
+    "\1\223\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\13\1\310\3\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\3\13\1\u014a\1\13\13\0\26\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\1\u014b\1\u014c\2\13\1\u014d"+
+    "\13\0\4\13\1\u014e\2\13\1\u014f\2\13\1\u0150\4\13"+
+    "\1\u0151\1\310\1\13\1\u0152\1\u0153\2\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\17\13\1\u0119\6\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\17\13"+
+    "\1\u0154\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\4\13"+
+    "\1\u0120\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\13\1\u0155\3\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\4\13\1\55\13\0\12\13\1\310\13\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\3\13\1\u0156\1\13"+
+    "\13\0\26\13\1\0\3\13\1\12\5\13\1\0\1\12"+
+    "\1\340\2\0\4\13\4\0\1\12\2\0\1\12\3\0"+
+    "\1\341\1\0\5\13\5\0\1\342\3\0\1\343\1\0"+
+    "\21\13\1\u0157\4\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\3\13\1\u0158\7\13\1\u0159\12\13\1\0"+
+    "\3\13\6\302\1\u015a\1\302\1\u015b\2\u015a\4\302\4\u015a"+
+    "\1\302\2\u015a\1\302\5\u015a\5\302\13\u015a\26\302\1\u015a"+
+    "\3\302\32\303\1\u015c\53\303\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\16\13\1\u015d\7\13\1\0\3\13\46\305\1\u015c"+
+    "\37\305\52\306\1\u015c\33\306\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\1\310\25\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\3\13\1\u015e\22\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\17\13\1\u015f\6\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\24\13\1\265"+
+    "\1\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\3\13\1\u0145"+
+    "\1\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\u0160\24\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\12\13\1\u0161\13\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\12\13\1\u0162"+
+    "\13\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\3\13\1\307\22\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\12\13\1\330\13\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\12\13\1\223\13\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\2\13\1\u012a\2\13\13\0"+
+    "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\17\13\1\u0155\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\u0163\24\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\10\13\1\u0164\15\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\3\13\1\u0165\1\13\13\0"+
+    "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\11\13\1\u0166\14\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\4\13\1\u0167\21\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\u0168\2\13\1\u0169\1\u016a\13\0\1\u016b"+
+    "\11\13\1\u016c\13\13\1\0\3\13\1\12\5\13\1\0"+
+    "\1\12\1\u016d\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\3\0\1\u016e\1\0\5\13\5\0\1\u016f\3\0\1\u0170"+
+    "\1\0\26\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\1\13\1\u0171\24\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\11\13\1\u0172\14\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\10\13\1\201\1\u0173"+
+    "\5\13\1\u0174\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\11\13\1\u0175\14\13\1\0\3\13\6\340"+
+    "\1\u0176\1\340\1\u0177\2\u0176\4\340\4\u0176\1\340\2\u0176"+
+    "\1\340\5\u0176\5\340\13\u0176\26\340\1\u0176\3\340\32\341"+
+    "\1\u0178\53\341\46\342\1\u0179\37\342\52\343\1\u017a\33\343"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\11\13\1\201\14\13"+
+    "\1\0\3\13\1\0\5\346\5\0\4\346\15\0\5\346"+
+    "\13\0\26\346\1\0\3\346\1\0\1\346\2\0\1\346"+
+    "\6\0\4\346\10\0\1\350\4\0\5\346\13\0\5\346"+
+    "\2\0\17\346\1\0\3\346\1\0\1\u017b\2\0\1\u017b"+
+    "\6\0\4\u017b\15\0\5\u017b\13\0\5\u017b\2\0\17\u017b"+
+    "\1\0\3\u017b\1\0\1\u017b\2\0\1\u017b\2\0\2\351"+
+    "\2\0\4\u017b\10\351\1\0\4\351\5\u017b\13\351\5\u017b"+
+    "\2\0\17\u017b\1\351\3\u017b\1\0\5\355\5\0\4\355"+
+    "\15\0\5\355\13\0\26\355\1\0\3\355\1\0\1\355"+
+    "\2\0\1\355\6\0\4\355\10\0\1\357\4\0\5\355"+
+    "\13\0\5\355\2\0\17\355\1\0\3\355\1\0\1\u017c"+
+    "\2\0\1\u017c\6\0\4\u017c\15\0\5\u017c\13\0\5\u017c"+
+    "\2\0\17\u017c\1\0\3\u017c\1\0\1\u017c\2\0\1\u017c"+
+    "\2\0\2\360\2\0\4\u017c\10\360\1\0\4\360\5\u017c"+
+    "\13\360\5\u017c\2\0\17\u017c\1\360\3\u017c\10\121\2\0"+
+    "\11\121\2\0\1\121\1\0\55\121\1\u017d\1\121\1\0"+
+    "\5\364\5\0\4\364\15\0\5\364\13\0\26\364\1\0"+
+    "\3\364\1\0\1\364\2\0\1\364\6\0\4\364\10\0"+
+    "\1\366\4\0\5\364\13\0\5\364\2\0\17\364\1\0"+
+    "\3\364\1\0\1\u017e\2\0\1\u017e\6\0\4\u017e\15\0"+
+    "\5\u017e\13\0\5\u017e\2\0\17\u017e\1\0\3\u017e\1\0"+
+    "\1\u017e\2\0\1\u017e\2\0\2\367\2\0\4\u017e\10\367"+
+    "\1\0\4\367\5\u017e\13\367\5\u017e\2\0\17\u017e\1\367"+
+    "\3\u017e\10\127\2\0\72\127\1\u017f\1\127\10\121\2\0"+
+    "\11\121\2\0\1\121\1\0\56\121\1\u017d\10\127\2\0"+
+    "\73\127\1\u017f\75\0\1\u0180\65\0\1\u0181\113\0\1\u0182"+
+    "\101\0\1\u0183\121\0\1\u0184\100\0\1\u0185\76\0\1\u0186"+
+    "\1\u0187\102\0\1\u0188\30\0\2\141\2\u0105\1\141\1\u0105"+
+    "\1\0\2\141\2\0\2\141\1\143\1\141\4\0\1\141"+
+    "\2\0\1\141\5\0\4\141\1\143\13\0\5\141\2\u0105"+
+    "\11\141\1\143\5\141\1\0\1\141\1\143\1\141\2\0"+
+    "\2\u0105\1\0\1\u0105\53\0\2\u0105\23\0\2\141\4\u0108"+
+    "\1\0\2\141\2\0\1\141\1\u0107\2\u0108\4\0\1\141"+
+    "\2\0\1\141\5\0\1\141\1\u0108\1\141\1\u0107\1\u0108"+
+    "\13\0\3\141\4\u0108\5\141\1\u0108\3\141\1\u0108\5\141"+
+    "\1\0\1\141\1\u0108\1\141\1\0\5\u0109\5\0\4\u0109"+
+    "\11\0\1\161\3\0\5\u0109\13\0\26\u0109\1\0\3\u0109"+
+    "\34\0\5\u010a\13\0\2\u010a\2\0\1\u010a\4\0\1\u010a"+
+    "\1\0\1\u010a\2\0\1\u010a\2\0\1\u010a\10\0\32\u010b"+
+    "\1\u0189\53\u010b\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\3\13\1\u018a\1\13"+
+    "\13\0\26\13\1\0\3\13\46\u010d\1\u0189\37\u010d\52\u010e"+
+    "\1\u0189\33\u010e\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\11\13"+
+    "\1\u018b\14\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\11\13\1\u018c\14\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\15\13\1\u018d\10\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\20\13\1\246\5\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\1\13\1\u0155\3\13"+
+    "\13\0\10\13\1\u018e\5\13\1\u014b\4\13\1\u018f\2\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\12\13"+
+    "\1\u0190\13\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\u0191\22\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\15\13\1\u0192\10\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\1\u0193\4\13\13\0\1\u0194\1\13"+
+    "\1\u0195\13\13\1\u0196\1\u0197\6\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\13\1\u0155\3\13\13\0\1\13\1\307"+
+    "\14\13\1\u014b\7\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\4\13\1\u0198\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\1\u0199\4\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\u019a\1\u019b\3\13\13\0\1\13\1\u019c"+
+    "\6\13\1\u018e\1\13\1\u019d\10\13\1\u018f\2\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\3\13\1\u019e\1\13\13\0"+
+    "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\u019f\4\13"+
+    "\13\0\26\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\12\13\1\u01a0\4\13\1\u0115\6\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\11\13\1\251\14\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\1\310"+
+    "\12\13\1\307\7\13\1\201\2\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\13\1\u01a1\24\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\1\13\1\u0119"+
+    "\24\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\3\13\1\u01a2"+
+    "\1\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\246\25\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\4\13\1\246\21\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\11\13\1\u01a3\14\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\4\13"+
+    "\1\u01a4\21\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\16\13\1\u01a5\7\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\12\13\1\u01a6\13\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\15\13\1\310\10\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\3\13"+
+    "\1\u0175\22\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\11\13\1\u01a7\14\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\1\13\1\u01a8\3\13\13\0\1\13\1\u019c\24\13"+
+    "\1\0\3\13\12\0\1\u0130\16\0\1\u0132\21\0\1\u0133"+
+    "\26\0\1\u0134\106\0\1\u01a9\20\0\1\u01aa\105\0\1\u01ab"+
+    "\105\0\1\u01ac\127\0\1\u01ad\124\0\1\u013c\106\0\1\u01ae"+
+    "\62\0\1\u01af\2\0\1\u01ad\124\0\1\u01b0\120\0\1\u01b1"+
+    "\50\0\1\u01b2\134\0\1\u01ad\21\0\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\15\13\1\u01b3\10\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\12\13\1\u01b4\13\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\17\13\1\u01b5"+
+    "\6\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\2\13\1\310\23\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\17\13\1\u0192\6\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\13\1\223\3\13\13\0\26\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\1\u01b6\4\13\13\0\12\13"+
+    "\1\310\13\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\223\5\13\1\u01b7\14\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\3\13\1\310\1\13\13\0\26\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\1\u01b8\4\13\13\0"+
+    "\1\u01b9\1\13\1\u0195\13\13\1\u0196\1\u0197\6\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u0125"+
+    "\22\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\10\13\1\u01ba\15\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\17\13\1\u01bb\6\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\21\13\1\u01bc\4\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\246"+
+    "\22\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\7\13\1\310\16\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\223\24\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\4\13\1\u01bd\13\0\26\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\u01be\22\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\21\13"+
+    "\1\u01bf\4\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\4\13\1\u0166\21\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\21\13\1\u01c0\4\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\11\13\1\u01c1\14\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\4\13\1\55\13\0"+
+    "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\12\13\1\u0145\13\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\3\13\1\u0192\1\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\17\13\1\u01c2\6\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u01c3"+
+    "\22\13\1\0\3\13\10\u015a\1\u015c\75\u015a\6\12\1\0"+
+    "\2\12\2\0\4\12\4\0\1\12\2\0\1\12\5\0"+
+    "\5\u015b\13\0\2\u015b\2\12\1\u015b\4\12\1\u015b\1\12"+
+    "\1\u015b\2\12\1\u015b\2\12\1\u015b\4\12\1\0\3\12"+
+    "\34\0\5\u015c\13\0\2\u015c\2\0\1\u015c\4\0\1\u015c"+
+    "\1\0\1\u015c\2\0\1\u015c\2\0\1\u015c\10\0\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\272\1\u0155\3\13\13\0\10\13\1\u01c4"+
+    "\5\13\1\u014b\7\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\265\4\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\4\13\1\310\13\0\13\13\1\u01c5\12\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\14\13\1\310"+
+    "\11\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\1\13\1\310\24\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\u01c6\1\310\1\13\1\u01c7\1\13\13\0\1\u01c8\1\13"+
+    "\1\u01c9\13\13\1\u01ca\1\u01cb\6\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\13\1\u012c\3\13\13\0\26\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u01cc"+
+    "\7\13\1\u01cd\1\13\1\310\10\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\3\13\1\u01ce\22\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\13\13\1\225"+
+    "\12\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\u012c\4\13"+
+    "\13\0\26\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\2\13\1\u01cf\23\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\u01d0\5\13\1\u01d1\14\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\3\13"+
+    "\1\256\22\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\4\13\1\u0163\21\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\11\13\1\u01d2\14\13\1\0\3\13"+
+    "\6\u016d\1\u01d3\1\u016d\1\u01d4\2\u01d3\4\u016d\4\u01d3\1\u016d"+
+    "\2\u01d3\1\u016d\3\u01d3\1\0\1\u01d3\5\u016d\13\u01d3\26\u016d"+
+    "\1\u01d3\3\u016d\32\u016e\1\u01d5\53\u016e\32\u016f\1\0\13\u016f"+
+    "\1\u01d6\37\u016f\32\u0170\1\0\17\u0170\1\u01d7\33\u0170\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\12\13\1\u01d8\13\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\3\13\1\u01d9\1\13\13\0"+
+    "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\12\13\1\u01da\13\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\12\13\1\u01db\13\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\12\13\1\225\13\13\1\0"+
+    "\3\13\10\u0176\1\u01dc\75\u0176\6\u0177\1\u01dc\1\u0177\1\u01dd"+
+    "\2\u01dc\4\u0177\4\u01dc\1\u0177\2\u01dc\1\u0177\5\u01dc\5\u0177"+
+    "\13\u01dc\26\u0177\1\u01dc\3\u0177\32\u0178\1\u01de\53\u0178\46\u0179"+
+    "\1\u01de\37\u0179\52\u017a\1\u01de\33\u017a\1\0\5\u017b\5\0"+
+    "\4\u017b\11\0\1\351\3\0\5\u017b\13\0\26\u017b\1\0"+
+    "\3\u017b\1\0\5\u017c\5\0\4\u017c\11\0\1\360\3\0"+
+    "\5\u017c\13\0\26\u017c\1\0\3\u017c\1\0\5\u017e\5\0"+
+    "\4\u017e\11\0\1\367\3\0\5\u017e\13\0\26\u017e\1\0"+
+    "\3\u017e\66\0\1\u01df\57\0\1\u01e0\124\0\1\u0188\106\0"+
+    "\1\u01e1\62\0\1\u01e2\2\0\1\u01e0\124\0\1\u01e3\120\0"+
+    "\1\u01e4\50\0\1\u01e5\134\0\1\u01e0\55\0\5\u0189\13\0"+
+    "\2\u0189\1\0\2\u0189\3\0\2\u0189\1\0\1\u0189\2\0"+
+    "\1\u0189\2\0\1\u0189\10\0\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\4\13\1\251\21\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\1\13\1\225\3\13\13\0\12\13\1\310\13\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\17\13"+
+    "\1\u01e6\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\u01e7\22\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\u01e8\22\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\10\13\1\337\15\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\4\13\1\u01e9\13\0"+
+    "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\13\1\246"+
+    "\3\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\u01ea\1\13\1\u01eb\22\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\10\13\1\u01ec"+
+    "\5\13\1\u01ed\4\13\1\u01ee\2\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\13\1\u01ef\24\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\10\13\1\u01ee"+
+    "\15\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\3\13\1\u01f0\22\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\24\13\1\310\1\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\12\13\1\251\13\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u01f1"+
+    "\22\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\4\13\1\314\21\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\u01a6\25\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\u01ba\22\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\11\13\1\u01d1\14\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\3\13"+
+    "\1\u0192\22\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\11\13\1\u01f2\14\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\1\13\1\246\24\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\251\22\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\10\13"+
+    "\1\u01f3\15\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\3\13"+
+    "\1\u01f4\1\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\12\13\1\u0140\13\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\201\22\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\17\13"+
+    "\1\u01f5\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\3\13"+
+    "\1\u01f6\1\13\13\0\26\13\1\0\3\13\104\0\1\u01f7"+
+    "\1\u01f8\103\0\1\u01f9\105\0\1\u01fa\105\0\1\u01fb\42\0"+
+    "\1\u01fc\122\0\1\u01fd\117\0\1\u01ad\103\0\1\u01fe\111\0"+
+    "\1\u01ad\14\0\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\4\13"+
+    "\1\u01ff\21\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\1\13\1\u0200\24\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\12\13\1\u0201\13\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\12\13\1\265\13\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\20\13"+
+    "\1\223\5\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\u01eb\22\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\10\13\1\u0202\12\13\1\u01ee\2\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\13\13"+
+    "\1\310\12\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\6\13\1\310\17\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\265\22\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\3\13\1\u0203\1\u0120\13\0\1\u0204"+
+    "\25\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\10\13\1\u0205\15\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\10\13\1\201\15\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\11\13\1\u0206\14\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\17\13\1\u0207"+
+    "\6\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\13\1\u0208"+
+    "\3\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\13\1\u014c\3\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\13\1\u0209\24\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\1\13\1\u020a"+
+    "\1\13\1\u020b\22\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\u020c\24\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\u020d\2\13\1\u020e\4\13"+
+    "\1\u020f\5\13\1\u01ed\4\13\1\u0210\2\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\13\1\u0211\24\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\10\13"+
+    "\1\u0212\15\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\u0213\22\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\4\13\1\u0214\21\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\3\13\1\u0215\1\13\13\0\26\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\17\13"+
+    "\1\u0161\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\11\13\1\u0112\14\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\1\u0216\4\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\17\13\1\u012c\6\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\3\13\1\223\1\13\13\0"+
+    "\3\13\1\310\22\13\1\0\3\13\10\u01d3\1\u0217\21\u01d3"+
+    "\1\0\53\u01d3\6\u016d\1\u01d3\1\u016d\1\u01d4\2\u01d3\4\u016d"+
+    "\4\u01d3\1\u016d\2\u01d3\1\u016d\3\u01d3\1\0\1\u01d3\1\u01d4"+
+    "\1\u016d\3\u01d4\13\u01d3\2\u01d4\2\u016d\1\u01d4\4\u016d\1\u01d4"+
+    "\1\u016d\1\u01d4\5\u016d\1\u01d4\4\u016d\1\u01d3\3\u016d\34\0"+
+    "\1\u01d5\1\0\3\u01d5\13\0\2\u01d5\2\0\1\u01d5\4\0"+
+    "\1\u01d5\1\0\1\u01d5\5\0\1\u01d5\10\0\32\u016f\1\0"+
+    "\1\u016f\1\u01d6\1\u016f\3\u01d6\5\u016f\1\u01d6\5\u016f\2\u01d6"+
+    "\2\u016f\1\u01d6\4\u016f\1\u01d6\1\u016f\1\u01d6\5\u016f\1\u01d6"+
+    "\10\u016f\32\u0170\1\0\1\u0170\1\u01d7\1\u0170\3\u01d7\11\u0170"+
+    "\1\u01d7\1\u0170\2\u01d7\2\u0170\1\u01d7\4\u0170\1\u01d7\1\u0170"+
+    "\1\u01d7\5\u0170\1\u01d7\10\u0170\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\u0218\22\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\223\22\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\u020d\25\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\4\13\1\u0219"+
+    "\21\13\1\0\3\13\10\u01dc\1\u01de\75\u01dc\6\12\1\0"+
+    "\2\12\2\0\4\12\4\0\1\12\2\0\1\12\5\0"+
+    "\2\u01dd\2\12\1\u01dd\13\0\10\12\1\u01dd\15\12\1\0"+
+    "\3\12\34\0\2\u01de\2\0\1\u01de\23\0\1\u01de\61\0"+
+    "\1\u021a\122\0\1\u021b\117\0\1\u01e0\103\0\1\u021c\111\0"+
+    "\1\u01e0\14\0\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\12\13"+
+    "\1\256\13\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\12\13\1\u021d\13\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\4\13\1\u0119\21\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\13\1\u021e\24\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\1\13\1\u021f\3\13"+
+    "\13\0\26\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\10\13\1\u0220\15\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\1\13\1\u0221\7\13\1\u0222\14\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\10\13"+
+    "\1\307\15\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\u0223\22\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\1\u01f0\4\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\12\13\1\u01ee\13\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u012c"+
+    "\22\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\17\13\1\u0224\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\246\4\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\u0119\22\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\13\1\u0205\24\13"+
+    "\1\0\3\13\104\0\1\u0225\1\u0226\104\0\1\u0227\1\u0228"+
+    "\104\0\1\u0229\1\u022a\61\0\2\u01ad\63\0\1\u022b\140\0"+
+    "\1\u01ad\12\0\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\16\13"+
+    "\1\225\7\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\12\13\1\u022c\13\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\1\13\1\u0221\24\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\11\13\1\u022d\14\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\11\13"+
+    "\1\244\14\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\1\225"+
+    "\4\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\10\13\1\225\15\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\4\13\1\274\13\0\26\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\4\13\1\u0175\21\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\4\13\1\225\13\0"+
+    "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\13\1\u022e"+
+    "\3\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\10\13\1\u022f\15\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\16\13\1\344\7\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\11\13\1\u0119"+
+    "\14\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\3\13\1\u0230\22\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\u0231\7\13\1\u0222\14\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u0223"+
+    "\13\13\1\u0232\1\13\1\u020d\4\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\u0213\4\13\13\0\26\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\u0223\12\13"+
+    "\1\u020d\1\u0232\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\12\13\1\u0233\13\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\13\1\u0234\3\13\13\0\26\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\11\13\1\u0235"+
+    "\14\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\223\4\13"+
+    "\13\0\26\13\1\0\3\13\10\u01d3\1\u0217\21\u01d3\1\0"+
+    "\1\u01d3\1\u0217\1\u01d3\3\u0217\13\u01d3\2\u0217\2\u01d3\1\u0217"+
+    "\4\u01d3\1\u0217\1\u01d3\1\u0217\5\u01d3\1\u0217\10\u01d3\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\13\13\1\u0236\12\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\10\13\1\u0237"+
+    "\15\13\1\0\3\13\61\0\2\u01e0\63\0\1\u0238\140\0"+
+    "\1\u01e0\12\0\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\1\u0239"+
+    "\25\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\23\13\1\201\2\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\15\13\1\u023a\10\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\7\13\1\u01ee\16\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\12\13\1\u023b"+
+    "\13\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\1\13\1\u023c\24\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\17\13\1\246\6\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\21\13\1\u01d9\4\13\1\0"+
+    "\3\13\31\0\1\u01f7\105\0\1\u01f8\127\0\1\u023d\105\0"+
+    "\1\u023e\134\0\1\u01f7\105\0\1\u01f8\70\0\1\u023f\20\0"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\24\13\1\244\1\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\17\13"+
+    "\1\u0240\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\15\13\1\u0241\10\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\7\13\1\u0242\16\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\10\13\1\u0243\15\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\12\13"+
+    "\1\u0244\13\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\4\13\1\u01ba\21\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\u0223\10\13\1\u0245\11\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\2\13"+
+    "\1\223\23\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\17\13\1\225\6\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\u0246\22\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\10\13\1\u0247\15\13"+
+    "\1\0\3\13\65\0\1\u0248\20\0\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\4\13\1\u0120\21\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\13\1\u0125\24\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\1\13\1\u01ee"+
+    "\24\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\10\13\1\u0249\15\13\1\0\3\13\73\0\1\u024a\12\0"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\310\11\13"+
+    "\1\310\10\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\1\13\1\u0125\15\13\1\u0151\6\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\u0223\10\13"+
+    "\1\u024b\11\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\17\13\1\u0151\6\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\1\13\1\u024c\24\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\24\13\1\u024d\1\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\12\13"+
+    "\1\u024e\13\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\4\13\1\u0198\21\13\1\0\3\13\73\0\1\u024f"+
+    "\12\0\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\11\13\1\u0250"+
+    "\14\13\1\0\3\13\72\0\1\u01ad\13\0\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\24\13\1\u0251\1\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\u0223\10\13"+
+    "\1\u0252\11\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\4\13\1\u0253\12\13\1\u0151\6\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\4\13\1\310\21\13"+
+    "\1\0\3\13\72\0\1\u01e0\13\0\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\12\13\1\u0198\13\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\u0254\16\13\1\u0151\6\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\24\13"+
+    "\1\u0255\1\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\4\13"+
+    "\1\u0256\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\204\24\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\17\13\1\u0257\6\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\4\13\1\251\13\0\26\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\4\13"+
+    "\1\u0166\14\13\1\u0258\4\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\13\13\1\u0259\12\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\14\13\1\u01a2\11\13"+
+    "\1\0\3\13";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[38500];
+    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 =
+    "\11\0\4\1\1\11\1\1\1\11\3\1\2\11\4\1"+
+    "\1\11\15\1\1\11\1\1\1\11\24\1\1\11\2\1"+
+    "\1\11\3\1\1\11\2\1\2\11\1\1\1\11\3\1"+
+    "\1\11\1\1\1\11\5\1\1\11\1\1\1\11\1\1"+
+    "\1\11\2\1\1\11\15\1\1\0\1\1\1\0\1\1"+
+    "\1\11\1\1\3\0\1\1\1\0\2\1\2\0\34\1"+
+    "\10\0\43\1\1\0\1\1\2\0\32\1\3\0\1\1"+
+    "\1\11\2\1\1\0\1\11\1\1\1\0\1\11\2\1"+
+    "\1\0\1\11\1\1\1\0\3\1\1\0\1\11\1\1"+
+    "\1\0\3\1\10\0\1\1\1\0\2\1\1\0\1\1"+
+    "\1\0\1\1\2\0\41\1\15\0\35\1\1\0\23\1"+
+    "\3\0\5\1\1\0\1\1\5\0\1\1\1\0\1\1"+
+    "\11\0\40\1\4\0\1\11\5\0\40\1\1\0\10\1"+
+    "\1\0\2\1\2\11\5\0\21\1\2\11\6\0\33\1"+
+    "\3\0\10\1\7\0\14\1\1\0\4\1\2\11\1\0"+
+    "\10\1\1\0\1\1\1\0\4\1\1\0\12\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[601];
+    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;
+
+  /* user code: */
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_UNQUOTED			= -1;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an single quoted EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_SINGLE_QUOTED		= -2;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_UNQUOTED			= -3;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an single quoted EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_SINGLE_QUOTED		= -4;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals we are in a POD
+	 * block.
+	 */
+	public static final int INTERNAL_POD						= -5;
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PerlTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return super.getMarkOccurrencesOfTokenType(type) || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * 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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR_LITERAL;
+				start = text.offset;
+				break;
+			case Token.LITERAL_BACKQUOTE:
+				state = BACKTICKS;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_UNQUOTED:
+				state = HEREDOC_EOF_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_SINGLE_QUOTED:
+				state = HEREDOC_EOF_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_UNQUOTED:
+				state = HEREDOC_EOT_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_SINGLE_QUOTED:
+				state = HEREDOC_EOT_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_POD:
+				state = POD;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Returns whether a regular expression token can follow the specified
+	 * token.
+	 *
+	 * @param t The token to check, which may be <code>null</code>.
+	 * @return Whether a regular expression token may follow this one.
+	 */
+	private static final boolean regexCanFollow(Token t) {
+		char ch;
+		// We basically try to mimic Eclipse's JS editor's behavior here.
+		return t==null ||
+				//t.isOperator() ||
+				(t.textCount==1 && (
+					(ch=t.text[t.textOffset])=='=' ||
+					ch=='(' ||
+					ch==',' ||
+					ch=='?' ||
+					ch==':' ||
+					ch=='[' ||
+					ch=='!' ||
+					ch=='&'
+				)) ||
+				/* Operators "==", "===", "!=", "!==", etc. */
+				(t.type==Token.OPERATOR &&
+					((ch=t.text[t.textOffset+t.textCount-1])=='=' || ch=='~'));
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 PerlTokenMaker(java.io.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 PerlTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 174) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 46: break;
+        case 34: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 47: break;
+        case 40: 
+          { if (start==zzStartRead) { addToken(Token.COMMENT_DOCUMENTATION); yybegin(YYINITIAL); }
+          }
+        case 48: break;
+        case 26: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 49: break;
+        case 11: 
+          { start = zzMarkedPos-1; yybegin(STRING);
+          }
+        case 50: break;
+        case 38: 
+          { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; }
+          }
+        case 51: break;
+        case 31: 
+          { addToken(Token.FUNCTION);
+          }
+        case 52: break;
+        case 36: 
+          { boolean highlightedAsRegex = false;
+					if (firstToken==null) {
+						addToken(Token.REGEX);
+						highlightedAsRegex = true;
+					}
+					else {
+						// If this is *likely* to be a regex, based on
+						// the previous token, highlight it as such.
+						Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+						if (regexCanFollow(t)) {
+							addToken(Token.REGEX);
+							highlightedAsRegex = true;
+						}
+					}
+					// If it doesn't *appear* to be a regex, highlight it as
+					// individual tokens.
+					if (!highlightedAsRegex) {
+						int temp = zzStartRead + 1;
+						addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+						zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+					}
+          }
+        case 53: break;
+        case 30: 
+          { addToken(Token.VARIABLE);
+          }
+        case 54: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 55: break;
+        case 24: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken;
+          }
+        case 56: break;
+        case 4: 
+          { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 57: break;
+        case 29: 
+          { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken;
+          }
+        case 58: break;
+        case 41: 
+          { if (start==zzStartRead) { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+          }
+        case 59: break;
+        case 44: 
+          { start = zzStartRead; yybegin(HEREDOC_EOF_SINGLE_QUOTED);
+          }
+        case 60: break;
+        case 45: 
+          { start = zzStartRead; yybegin(HEREDOC_EOT_SINGLE_QUOTED);
+          }
+        case 61: break;
+        case 42: 
+          { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED);
+          }
+        case 62: break;
+        case 13: 
+          { /* Skip escaped chars. */
+          }
+        case 63: break;
+        case 37: 
+          { addToken(Token.REGEX);
+          }
+        case 64: break;
+        case 18: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+          }
+        case 65: break;
+        case 28: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 66: break;
+        case 21: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken;
+          }
+        case 67: break;
+        case 6: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 68: break;
+        case 10: 
+          { start = zzMarkedPos-1; yybegin(CHAR_LITERAL);
+          }
+        case 69: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 70: break;
+        case 33: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 71: break;
+        case 20: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE);
+          }
+        case 72: break;
+        case 15: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 73: break;
+        case 16: 
+          { /* Skip escaped single quotes only, but this should still work. */
+          }
+        case 74: break;
+        case 23: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken;
+          }
+        case 75: break;
+        case 35: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.PREPROCESSOR); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 76: break;
+        case 39: 
+          { addToken(Token.COMMENT_EOL); start = zzMarkedPos; yybegin(POD);
+          }
+        case 77: break;
+        case 32: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 78: break;
+        case 19: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+          }
+        case 79: break;
+        case 8: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 80: break;
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 81: break;
+        case 7: 
+          { addToken(Token.OPERATOR);
+          }
+        case 82: break;
+        case 17: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+          }
+        case 83: break;
+        case 25: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_POD); return firstToken;
+          }
+        case 84: break;
+        case 27: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 85: break;
+        case 43: 
+          { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED);
+          }
+        case 86: break;
+        case 9: 
+          { start = zzMarkedPos-1; yybegin(BACKTICKS);
+          }
+        case 87: break;
+        case 12: 
+          { 
+          }
+        case 88: break;
+        case 14: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 89: break;
+        case 22: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken;
+          }
+        case 90: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case HEREDOC_EOF_SINGLE_QUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken;
+            }
+            case 602: break;
+            case HEREDOC_EOT_SINGLE_QUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken;
+            }
+            case 603: break;
+            case HEREDOC_EOT_UNQUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken;
+            }
+            case 604: break;
+            case STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 605: break;
+            case BACKTICKS: {
+              addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+            }
+            case 606: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 607: break;
+            case HEREDOC_EOF_UNQUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken;
+            }
+            case 608: break;
+            case CHAR_LITERAL: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+            }
+            case 609: break;
+            case POD: {
+              addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_POD); return firstToken;
+            }
+            case 610: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex
new file mode 100644
index 0000000..ae687ad
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex
@@ -0,0 +1,226 @@
+/*
+ * 11/07/2008
+ *
+ * PlainTextTokenMaker.flex - Scanner for plain text files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for plain text files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>), so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>PlainTextTokenMaker.java</code> file will contain
+ *       two definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class PlainTextTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PlainTextTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @param link Whether this token is a hyperlink.
+	 */
+	private void addToken(int tokenType, boolean link) {
+		int so = zzStartRead + offsetShift;
+		super.addToken(zzBuffer, zzStartRead,zzMarkedPos-1, tokenType, so, link);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Always returns <code>Token.NULL</code>, as there are no multiline
+	 * tokens in properties files.
+	 *
+	 * @param text The line of tokens to examine.
+	 * @param initialTokenType The token type to start with (i.e., the value
+	 *        of <code>getLastTokenTypeOnLine</code> for the line before
+	 *        <code>text</code>).
+	 * @return <code>Token.NULL</code>.
+	 */
+	public int getLastTokenTypeOnLine(Segment text, int initialTokenType) {
+		return Token.NULL;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return <code>null</code>, as there are no comments in plain text.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return null;
+	}
+
+
+	/**
+	 * Always returns <tt>false</tt>, as you never want "mark occurrences"
+	 * working in plain text files.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	/**
+	 * 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.
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(YYINITIAL);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	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(java.io.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;
+	}
+
+
+%}
+
+LetterOrDigit	= ([a-zA-Z0-9])
+Identifier		= ({LetterOrDigit}+)
+Separator		= ([^a-zA-Z0-9 \t\n])
+WhiteSpace		= ([ \t]+)
+LineTerminator	= ([\n])
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrDigit}|[_\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{LetterOrDigit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%%
+
+<YYINITIAL> {
+	{URL}				{ addToken(Token.IDENTIFIER, true); }
+	{Identifier}		{ addToken(Token.IDENTIFIER, false); }
+	{Separator}			{ addToken(Token.IDENTIFIER, false); }
+	{WhiteSpace}		{ addToken(Token.WHITESPACE, false); }
+	{LineTerminator}	{ addNullToken(); return firstToken; }
+	<<EOF>>				{ addNullToken(); return firstToken; }
+	.					{ /* Never happens */ addToken(Token.IDENTIFIER, false); }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java
new file mode 100644
index 0000000..f8884f5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java
@@ -0,0 +1,643 @@
+/* The following code was generated by JFlex 1.4.1 on 12/9/11 6:40 PM */
+
+/*
+ * 11/07/2008
+ *
+ * PlainTextTokenMaker.flex - Scanner for plain text files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for plain text files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>), so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>PlainTextTokenMaker.java</code> file will contain
+ *       two definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class PlainTextTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int YYINITIAL = 0;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\3\1\2\25\0\1\3\1\4\1\0\1\4\1\6\1\4"+
+    "\7\4\1\4\1\21\1\5\12\1\1\17\1\4\1\0\1\4\1\0"+
+    "\2\4\32\1\1\4\1\0\1\4\1\0\1\4\1\0\4\1\1\16"+
+    "\1\13\1\1\1\7\1\14\2\1\1\15\3\1\1\11\2\1\1\12"+
+    "\1\10\2\1\1\20\3\1\3\0\1\4\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 =
+    "\1\0\2\1\1\2\1\3\14\1\1\0\1\4\2\0";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[21];
+    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\22\0\44\0\22\0\66\0\110\0\132\0\154"+
+    "\0\176\0\220\0\242\0\264\0\306\0\330\0\352\0\374"+
+    "\0\u010e\0\u0120\0\u0132\0\u0144\0\u0132";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[21];
+    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\2\1\3\1\4\1\5\3\2\1\6\3\3\1\7"+
+    "\3\3\1\2\1\10\1\2\23\0\1\3\5\0\10\3"+
+    "\1\0\1\3\4\0\1\5\17\0\1\3\5\0\1\3"+
+    "\1\11\6\3\1\0\1\3\2\0\1\3\5\0\1\3"+
+    "\1\12\3\3\1\13\2\3\1\0\1\3\2\0\1\3"+
+    "\5\0\10\3\1\0\1\14\2\0\1\3\5\0\1\3"+
+    "\1\15\6\3\1\0\1\3\2\0\1\3\5\0\2\3"+
+    "\1\16\5\3\1\0\1\3\2\0\1\3\5\0\6\3"+
+    "\1\17\1\3\1\0\1\3\2\0\1\3\5\0\10\3"+
+    "\1\0\1\20\2\0\1\3\5\0\2\3\1\21\5\3"+
+    "\1\0\1\3\2\0\1\3\5\0\10\3\1\22\1\3"+
+    "\2\0\1\3\5\0\7\3\1\16\1\0\1\3\2\0"+
+    "\1\3\5\0\10\3\1\0\1\3\1\23\1\0\1\3"+
+    "\5\0\3\3\1\16\4\3\1\22\1\3\6\0\1\24"+
+    "\15\0\1\23\2\0\1\25\12\23\1\25\1\23\1\25"+
+    "\5\0\1\23\14\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[342];
+    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 =
+    "\1\0\1\11\1\1\1\11\15\1\1\0\1\1\2\0";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[21];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PlainTextTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @param link Whether this token is a hyperlink.
+	 */
+	private void addToken(int tokenType, boolean link) {
+		int so = zzStartRead + offsetShift;
+		super.addToken(zzBuffer, zzStartRead,zzMarkedPos-1, tokenType, so, link);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Always returns <code>Token.NULL</code>, as there are no multiline
+	 * tokens in properties files.
+	 *
+	 * @param text The line of tokens to examine.
+	 * @param initialTokenType The token type to start with (i.e., the value
+	 *        of <code>getLastTokenTypeOnLine</code> for the line before
+	 *        <code>text</code>).
+	 * @return <code>Token.NULL</code>.
+	 */
+	public int getLastTokenTypeOnLine(Segment text, int initialTokenType) {
+		return Token.NULL;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return <code>null</code>, as there are no comments in plain text.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return null;
+	}
+
+
+	/**
+	 * Always returns <tt>false</tt>, as you never want "mark occurrences"
+	 * working in plain text files.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	/**
+	 * 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.
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(YYINITIAL);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	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(java.io.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;
+		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 PlainTextTokenMaker(java.io.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 PlainTextTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 94) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 3: 
+          { addToken(Token.WHITESPACE, false);
+          }
+        case 5: break;
+        case 2: 
+          { addNullToken(); return firstToken;
+          }
+        case 6: break;
+        case 4: 
+          { addToken(Token.IDENTIFIER, true);
+          }
+        case 7: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER, false);
+          }
+        case 8: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 22: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.flex
new file mode 100644
index 0000000..45edee6
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.flex
@@ -0,0 +1,235 @@
+/*
+ * 03/21/2005
+ *
+ * PropertiesFileTokenMaker.java - Scanner for properties files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class splits up text into tokens representing a Java properties file.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>PropertiesFileTokenMaker.java</code> file will
+ *       contain two definitions of both <code>zzRefill</code> and
+ *       <code>yyreset</code>.  You should hand-delete the second of each
+ *       definition (the ones generated by the lexer), as these generated
+ *       methods modify the input buffer, which we'll never have to do.
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+%%
+
+%public
+%class PropertiesFileTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PropertiesFileTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = VALUE;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	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(java.io.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;
+	}
+
+
+%}
+
+Equals				= ([=\:])
+Name					= ([^=\: \t\n#!]*)
+Whitespace			= ([ \t]+)
+Comment				= ([#!].*)
+SingleQuote			= (')
+
+%state VALUE
+
+%%
+
+<YYINITIAL> {
+	{Name}			{ addToken(Token.RESERVED_WORD); }
+	{Equals}			{ start = zzMarkedPos; addToken(Token.OPERATOR); yybegin(VALUE); }
+	{Whitespace}		{ addToken(Token.WHITESPACE); }
+	{Comment}			{ addToken(Token.COMMENT_EOL); }
+	<<EOF>>			{ addNullToken(); return firstToken; }
+}
+
+<VALUE> {
+	{SingleQuote}[^']*{SingleQuote}?	{ addToken(start, zzMarkedPos-1, Token.LITERAL_STRING_DOUBLE_QUOTE); start = zzMarkedPos; }
+	[^'\{\\]+						{}
+	"{"[^\}]*"}"?					{ int temp=zzStartRead; addToken(start, zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp, zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	[\\].							{}
+	[\\]							{ addToken(start, zzEndRead, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	<<EOF>>							{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addNullToken(); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.java
new file mode 100644
index 0000000..ce2b859
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.java
@@ -0,0 +1,661 @@
+/* The following code was generated by JFlex 1.4.1 on 1/28/11 4:16 PM */
+
+/*
+ * 03/21/2005
+ *
+ * PropertiesFileTokenMaker.java - Scanner for properties files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class splits up text into tokens representing a Java properties file.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>PropertiesFileTokenMaker.java</code> file will
+ *       contain two definitions of both <code>zzRefill</code> and
+ *       <code>yyreset</code>.  You should hand-delete the second of each
+ *       definition (the ones generated by the lexer), as these generated
+ *       methods modify the input buffer, which we'll never have to do.
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+
+public class PropertiesFileTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** 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 VALUE = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\3\1\2\25\0\1\3\1\4\1\0\1\4\3\0\1\5"+
+    "\22\0\1\1\2\0\1\1\36\0\1\6\36\0\1\7\1\0\1\10"+
+    "\uff82\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 =
+    "\1\1\1\0\1\1\1\2\1\3\1\4\1\5\1\6"+
+    "\1\7\1\10\1\6\1\5\1\10";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[13];
+    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\11\0\22\0\33\0\44\0\55\0\66\0\77"+
+    "\0\110\0\121\0\33\0\33\0\33";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[13];
+    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\1\4\1\0\1\5\1\6\4\3\5\7\1\10"+
+    "\1\11\1\12\1\7\1\3\4\0\4\3\14\0\1\5"+
+    "\5\0\2\6\1\0\6\6\5\7\3\0\1\7\5\10"+
+    "\1\13\3\10\2\14\1\0\6\14\10\12\1\15";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[90];
+    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 =
+    "\1\1\1\0\1\1\1\11\6\1\3\11";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[13];
+    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[] = new char[ZZ_BUFFERSIZE];
+
+  /** 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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PropertiesFileTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = VALUE;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	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(java.io.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;
+		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 PropertiesFileTokenMaker(java.io.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 PropertiesFileTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 42) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 7: 
+          { addToken(start, zzEndRead, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 9: break;
+        case 2: 
+          { start = zzMarkedPos; addToken(Token.OPERATOR); yybegin(VALUE);
+          }
+        case 10: break;
+        case 8: 
+          { int temp=zzStartRead; addToken(start, zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp, zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 11: break;
+        case 3: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 12: break;
+        case 6: 
+          { addToken(start, zzMarkedPos-1, Token.LITERAL_STRING_DOUBLE_QUOTE); start = zzMarkedPos;
+          }
+        case 13: break;
+        case 1: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 14: break;
+        case 5: 
+          { 
+          }
+        case 15: break;
+        case 4: 
+          { addToken(Token.COMMENT_EOL);
+          }
+        case 16: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 14: break;
+            case VALUE: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addNullToken(); return firstToken;
+            }
+            case 15: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.flex
new file mode 100644
index 0000000..d5c51df
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.flex
@@ -0,0 +1,441 @@
+/*
+ * 12/06/2005
+ *
+ * PythonTokenMaker.java - Token maker for the Python programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
+import org.fife.ui.rsyntaxtextarea.Token;
+import org.fife.ui.rsyntaxtextarea.TokenMaker;
+
+
+/**
+ * Scanner for the Python programming language.
+ *
+ * @author Robert Futrell
+ * @version 0.3
+ */
+%%
+
+%public
+%class PythonTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PythonTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = LONG_STRING_2;
+				break;
+			case Token.LITERAL_CHAR:
+				state = LONG_STRING_1;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+%}
+
+/* This part is taken from http://www.python.org/doc/2.2.3/ref/grammar.txt */
+identifier		= (({letter}|"_")({letter}|{digit}|"_")*)
+letter			= ({lowercase}|{uppercase})
+lowercase			= ([a-z])
+uppercase			= ([A-Z])
+digit			= ([0-9])
+stringliteral		= ({stringprefix}?{shortstring})
+stringprefix		= ("r"|"u"[rR]?|"R"|"U"[rR]?)
+shortstring1		= ([\']{shortstring1item}*[\']?)
+shortstring2		= ([\"]{shortstring2item}*[\"]?)
+shortstring		= ({shortstring1}|{shortstring2})
+shortstring1item	= ({shortstring1char}|{escapeseq})
+shortstring2item	= ({shortstring2char}|{escapeseq})
+shortstring1char	= ([^\\\n\'])
+shortstring2char	= ([^\\\n\"])
+escapeseq			= ([\\].)
+longinteger		= ({integer}[lL])
+integer			= ({decimalinteger}|{octinteger}|{hexinteger})
+decimalinteger		= ({nonzerodigit}{digit}*|"0")
+octinteger		= ("0"{octdigit}+)
+hexinteger		= ("0"[xX]{hexdigit}+)
+nonzerodigit		= ([1-9])
+octdigit			= ([0-7])
+hexdigit			= ({digit}|[a-f]|[A-F])
+floatnumber		= ({pointfloat}|{exponentfloat})
+pointfloat		= ({intpart}?{fraction}|{intpart}".")
+exponentfloat		= (({intpart}|{pointfloat}){exponent})
+intpart			= ({digit}+)
+fraction			= ("."{digit}+)
+exponent			= ([eE][\+\-]?{digit}+)
+imagnumber		= (({floatnumber}|{intpart})[jJ])
+
+ErrorNumberFormat	= ({digit}{NonSeparator}+)
+NonSeparator		= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#")
+
+LongStringStart1	= ({stringprefix}?\'\'\')
+LongStringStart2	= ({stringprefix}?\"\"\")
+
+LineTerminator		= (\n)
+WhiteSpace		= ([ \t\f])
+
+LineComment		= ("#".*)
+
+
+%state LONG_STRING_1
+%state LONG_STRING_2
+
+
+%%
+
+/* Keywords */
+<YYINITIAL> "and"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "as"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "assert"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "break"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "class"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "continue"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "def"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "del"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "elif"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "else"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "except"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "exec"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "finally"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "for"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "from"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "global"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "if"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "import"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "in"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "is"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lambda"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "not"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "or"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "pass"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "print"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "raise"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "return"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "try"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "while"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "yield"					{ addToken(Token.RESERVED_WORD); }
+
+/* Data types. */
+<YYINITIAL> "char"					{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "double"				{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "float"					{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "int"					{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "long"					{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "short"					{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "signed"				{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "unsigned"				{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "void"					{ addToken(Token.DATA_TYPE); }
+
+/* Standard functions */
+<YYINITIAL> "abs"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "apply"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "bool"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "buffer"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "callable"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "chr"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "classmethod"			{ addToken(Token.FUNCTION); }
+<YYINITIAL> "cmp"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "coerce"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "compile"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "complex"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "delattr"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "dict"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "dir"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "divmod"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "enumerate"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "eval"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "execfile"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "file"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "filter"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "float"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "getattr"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "globals"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "hasattr"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "hash"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "hex"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "id"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "input"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "int"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "intern"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "isinstance"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "issubclass"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "iter"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "len"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "list"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "locals"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "long"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "map"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "max"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "min"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "object"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "oct"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "open"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "ord"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "pow"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "property"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "range"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "raw_input"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "reduce"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "reload"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "repr"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "round"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "setattr"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "slice"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "staticmethod"			{ addToken(Token.FUNCTION); }
+<YYINITIAL> "str"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "sum"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "super"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "tuple"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "type"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "unichr"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "unicode"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "vars"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "xrange"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "zip"					{ addToken(Token.FUNCTION); }
+
+
+<YYINITIAL> {
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character Literals. */
+	{stringliteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{LongStringStart1}				{ yybegin(LONG_STRING_1); addToken(Token.LITERAL_CHAR); }
+	{LongStringStart2}				{ yybegin(LONG_STRING_2); addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+
+	/* Comment Literals. */
+	{LineComment}					{ addToken(Token.COMMENT_EOL); }
+
+	/* Separators. */
+	"("							{ addToken(Token.SEPARATOR); }
+	")"							{ addToken(Token.SEPARATOR); }
+	"["							{ addToken(Token.SEPARATOR); }
+	"]"							{ addToken(Token.SEPARATOR); }
+	"{"							{ addToken(Token.SEPARATOR); }
+	"}"							{ addToken(Token.SEPARATOR); }
+
+	/* Operators. */
+	"="							{ addToken(Token.OPERATOR); }
+	"+"							{ addToken(Token.OPERATOR); }
+	"-"							{ addToken(Token.OPERATOR); }
+	"*"							{ addToken(Token.OPERATOR); }
+	"/"							{ addToken(Token.OPERATOR); }
+	"%"							{ addToken(Token.OPERATOR); }
+	"**"							{ addToken(Token.OPERATOR); }
+	"~"							{ addToken(Token.OPERATOR); }
+	"<"							{ addToken(Token.OPERATOR); }
+	">"							{ addToken(Token.OPERATOR); }
+	"<<"							{ addToken(Token.OPERATOR); }
+	">>"							{ addToken(Token.OPERATOR); }
+	"=="							{ addToken(Token.OPERATOR); }
+	"+="							{ addToken(Token.OPERATOR); }
+	"-="							{ addToken(Token.OPERATOR); }
+	"*="							{ addToken(Token.OPERATOR); }
+	"/="							{ addToken(Token.OPERATOR); }
+	"%="							{ addToken(Token.OPERATOR); }
+	">>="						{ addToken(Token.OPERATOR); }
+	"<<="						{ addToken(Token.OPERATOR); }
+	"^"							{ addToken(Token.OPERATOR); }
+	"&"							{ addToken(Token.OPERATOR); }
+	"&&"							{ addToken(Token.OPERATOR); }
+	"|"							{ addToken(Token.OPERATOR); }
+	"||"							{ addToken(Token.OPERATOR); }
+	"?"							{ addToken(Token.OPERATOR); }
+	":"							{ addToken(Token.OPERATOR); }
+	","							{ addToken(Token.OPERATOR); }
+	"!"							{ addToken(Token.OPERATOR); }
+	"++"							{ addToken(Token.OPERATOR); }
+	"--"							{ addToken(Token.OPERATOR); }
+	"."							{ addToken(Token.OPERATOR); }
+	","							{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{longinteger}|{integer}			{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{floatnumber}|{imagnumber}		{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	/* Other punctuation, we'll highlight it as "identifiers." */
+	"@"							{ addToken(Token.IDENTIFIER); }
+	";"							{ addToken(Token.IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<LONG_STRING_1> {
+	[^\']+						{ addToken(Token.LITERAL_CHAR); }
+	"'''"						{ yybegin(YYINITIAL); addToken(Token.LITERAL_CHAR); }
+	"'"							{ addToken(Token.LITERAL_CHAR); }
+	<<EOF>>						{
+									if (firstToken==null) {
+										addToken(Token.LITERAL_CHAR); 
+									}
+									return firstToken;
+								}
+}
+
+<LONG_STRING_2> {
+	[^\"]+						{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	\"\"\"						{ yybegin(YYINITIAL); addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	\"							{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>						{
+									if (firstToken==null) {
+										addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); 
+									}
+									return firstToken;
+								}
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.java
new file mode 100644
index 0000000..9ae5938
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.java
@@ -0,0 +1,1088 @@
+/* The following code was generated by JFlex 1.4.1 on 10/16/06 10:31 AM */
+
+/*
+ * 12/06/2005
+ *
+ * PythonTokenMaker.java - Token maker for the Python programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * Scanner for the Python programming language.
+ *
+ * @author Robert Futrell
+ * @version 0.3
+ */
+
+public class PythonTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int YYINITIAL = 0;
+  public static final int LONG_STRING_2 = 2;
+  public static final int LONG_STRING_1 = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\34\1\12\1\0\1\34\1\32\22\0\1\34\1\64\1\11"+
+    "\1\33\1\0\1\63\1\67\1\10\1\57\1\57\1\62\1\61\1\64"+
+    "\1\27\1\24\1\63\1\16\7\21\2\3\1\64\1\72\1\65\1\60"+
+    "\1\66\1\64\1\71\4\23\1\26\1\23\3\2\1\31\1\2\1\15"+
+    "\5\2\1\6\2\2\1\7\2\2\1\20\2\2\1\57\1\13\1\57"+
+    "\1\64\1\1\1\0\1\35\1\42\1\44\1\37\1\25\1\22\1\52"+
+    "\1\54\1\46\1\30\1\43\1\14\1\51\1\36\1\45\1\47\1\2"+
+    "\1\4\1\40\1\41\1\5\1\55\1\53\1\17\1\50\1\56\1\57"+
+    "\1\70\1\57\1\64\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 =
+    "\3\0\1\1\1\2\1\3\4\2\2\4\1\5\1\2"+
+    "\1\3\2\2\1\6\1\2\1\6\1\7\1\10\21\2"+
+    "\1\11\10\6\1\2\2\12\2\4\1\13\1\3\1\14"+
+    "\1\13\1\14\4\2\2\4\1\0\2\4\1\0\4\2"+
+    "\1\13\1\3\1\13\12\2\1\15\27\2\1\15\3\2"+
+    "\2\15\1\16\1\15\15\2\3\0\2\14\1\0\12\2"+
+    "\1\4\1\17\1\20\3\2\1\3\15\2\1\15\22\2"+
+    "\1\21\14\2\1\22\1\23\1\14\6\2\1\21\3\2"+
+    "\1\15\36\2\1\15\17\2\1\15\6\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[265];
+    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\73\0\166\0\261\0\354\0\u0127\0\u0162\0\u019d"+
+    "\0\u01d8\0\u0213\0\u024e\0\u0289\0\261\0\u02c4\0\u02ff\0\u033a"+
+    "\0\u0375\0\u03b0\0\u03eb\0\u0426\0\u0461\0\u049c\0\u04d7\0\u0512"+
+    "\0\u054d\0\u0588\0\u05c3\0\u05fe\0\u0639\0\u0674\0\u06af\0\u06ea"+
+    "\0\u0725\0\u0760\0\u079b\0\u07d6\0\u0811\0\u084c\0\u0887\0\261"+
+    "\0\u08c2\0\u08fd\0\u0938\0\261\0\u0973\0\u09ae\0\u09e9\0\u0a24"+
+    "\0\261\0\u0a5f\0\u0a9a\0\u0ad5\0\u0b10\0\u0b4b\0\u0b4b\0\u0b86"+
+    "\0\u0bc1\0\u0b4b\0\u0bfc\0\u0c37\0\u0c72\0\u0cad\0\u0ce8\0\u0d23"+
+    "\0\u0d5e\0\u0d99\0\u0dd4\0\u0e0f\0\u0e4a\0\u0e85\0\u0ec0\0\u0efb"+
+    "\0\u0f36\0\u0f71\0\u0fac\0\u0fe7\0\u1022\0\u105d\0\u1098\0\u10d3"+
+    "\0\u110e\0\u1149\0\u1184\0\u11bf\0\u11fa\0\u1235\0\u1270\0\u12ab"+
+    "\0\u12e6\0\u1321\0\u135c\0\u1397\0\u13d2\0\u140d\0\u1448\0\u1483"+
+    "\0\u14be\0\u14f9\0\u1534\0\u156f\0\u15aa\0\u15e5\0\u1620\0\u165b"+
+    "\0\u1696\0\u16d1\0\u170c\0\u1747\0\u1782\0\u17bd\0\u17f8\0\u1833"+
+    "\0\u186e\0\354\0\u18a9\0\354\0\u18e4\0\u191f\0\u195a\0\u1995"+
+    "\0\u19d0\0\u1a0b\0\u1a46\0\u1a81\0\u1abc\0\u1af7\0\u1b32\0\u1b6d"+
+    "\0\u1ba8\0\u1be3\0\u1c1e\0\u1c59\0\u1c94\0\261\0\u1ccf\0\u1d0a"+
+    "\0\u1d45\0\u1d80\0\u1dbb\0\u1df6\0\u1e31\0\u1e6c\0\u1ea7\0\u1ee2"+
+    "\0\u1f1d\0\u1f58\0\261\0\261\0\261\0\u1f93\0\u1fce\0\u2009"+
+    "\0\u2044\0\u207f\0\u20ba\0\u20f5\0\u2130\0\u216b\0\u21a6\0\u21e1"+
+    "\0\u221c\0\u2257\0\u2292\0\u22cd\0\u2308\0\u2343\0\u237e\0\u23b9"+
+    "\0\u23f4\0\u242f\0\u237e\0\u246a\0\u24a5\0\u24e0\0\u251b\0\u2556"+
+    "\0\u2591\0\u25cc\0\u2607\0\u2642\0\u267d\0\u26b8\0\u26f3\0\u272e"+
+    "\0\u2769\0\u27a4\0\u27df\0\u281a\0\u2855\0\u2890\0\u28cb\0\u2906"+
+    "\0\u2941\0\u297c\0\u29b7\0\u29f2\0\u2a2d\0\u2a68\0\261\0\261"+
+    "\0\u2aa3\0\u2ade\0\u2b19\0\u2b54\0\u17bd\0\u2b8f\0\u2bca\0\354"+
+    "\0\u2c05\0\u2c40\0\u2c7b\0\u2cb6\0\u2cf1\0\u2d2c\0\u2d67\0\u2da2"+
+    "\0\u2ddd\0\u2e18\0\u2e53\0\u2e8e\0\u2ec9\0\u2f04\0\u2f3f\0\u2f7a"+
+    "\0\u2fb5\0\u2ff0\0\u302b\0\u3066\0\u30a1\0\u30dc\0\u3117\0\u3152"+
+    "\0\u318d\0\u31c8\0\u3203\0\u323e\0\u3279\0\u32b4\0\u32ef\0\u332a"+
+    "\0\u3365\0\u33a0\0\u33db\0\u3416\0\u3451\0\u348c\0\u34c7\0\u3502"+
+    "\0\u353d\0\u3578\0\u35b3\0\u35ee\0\u33db\0\u3629\0\u3664\0\u369f"+
+    "\0\u36da\0\u3715\0\u1270\0\u3750\0\u378b\0\u37c6\0\u3801\0\u383c"+
+    "\0\u3877";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[265];
+    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\4\2\5\1\6\1\7\1\10\1\11\1\12\1\13"+
+    "\1\14\1\15\1\4\1\16\1\5\1\17\1\20\1\5"+
+    "\1\6\1\21\1\5\1\22\1\23\1\5\1\24\2\5"+
+    "\1\4\1\25\1\26\1\27\1\30\1\31\1\32\1\33"+
+    "\1\34\1\5\1\35\1\36\1\37\1\40\1\41\1\42"+
+    "\1\43\1\44\1\45\1\46\1\47\1\50\1\51\1\52"+
+    "\1\53\1\51\1\54\1\55\1\56\1\57\1\60\2\61"+
+    "\10\62\1\63\62\62\11\64\1\65\61\64\74\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\22\5"+
+    "\14\0\3\66\1\6\4\66\3\0\1\66\2\67\1\6"+
+    "\2\66\1\6\2\66\1\70\2\71\1\0\2\72\1\0"+
+    "\1\66\1\0\22\66\12\0\1\66\2\0\7\5\1\13"+
+    "\1\14\2\0\10\5\1\0\1\73\1\5\1\0\2\5"+
+    "\3\0\1\74\7\5\1\75\11\5\15\0\3\5\1\11"+
+    "\1\5\1\11\1\5\1\13\1\14\2\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\1\5\1\76\20\5\15\0"+
+    "\7\5\1\13\1\14\2\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\22\5\15\0\3\5\1\11\1\5\1\11"+
+    "\1\5\1\13\1\14\2\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\22\5\14\0\10\77\1\100\1\77\1\0"+
+    "\1\101\57\77\11\102\1\103\1\0\1\104\57\102\1\0"+
+    "\7\5\4\0\10\5\1\0\1\105\1\5\1\0\2\5"+
+    "\3\0\1\106\7\5\1\107\1\110\10\5\14\0\3\66"+
+    "\1\111\4\66\3\0\1\66\2\67\1\112\2\113\1\112"+
+    "\2\66\1\70\2\71\1\0\2\72\1\0\1\66\1\0"+
+    "\22\66\12\0\1\66\2\0\3\5\1\114\3\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+    "\3\5\1\115\3\5\4\0\1\116\7\5\1\0\2\5"+
+    "\1\0\2\5\3\0\10\5\1\117\1\120\10\5\17\0"+
+    "\1\70\12\0\1\70\2\0\1\70\52\0\7\5\4\0"+
+    "\1\121\2\5\1\122\4\5\1\0\2\5\1\0\2\5"+
+    "\3\0\1\5\1\123\16\5\1\124\1\5\43\0\1\54"+
+    "\30\0\1\54\12\0\12\25\1\0\60\25\34\0\1\26"+
+    "\37\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\1\5\1\125\1\5\1\126\1\5\1\127\4\5"+
+    "\1\130\7\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\10\5\1\131\11\5\15\0\7\5"+
+    "\4\0\10\5\1\0\1\132\1\5\1\0\2\5\3\0"+
+    "\10\5\1\133\1\134\10\5\15\0\4\5\1\135\2\5"+
+    "\4\0\1\136\7\5\1\0\1\137\1\5\1\0\2\5"+
+    "\3\0\4\5\1\140\4\5\1\141\5\5\1\142\2\5"+
+    "\15\0\3\5\1\143\1\144\2\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\13\5\1\145\6\5\15\0"+
+    "\3\5\1\146\1\147\2\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\10\5\1\150\11\5\15\0\7\5"+
+    "\4\0\1\151\7\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\152\7\5\1\153\3\5\1\154\2\5\1\155\2\5"+
+    "\15\0\3\5\1\156\3\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\5\5\1\157\1\5\1\160\2\5"+
+    "\1\161\7\5\15\0\7\5\4\0\6\5\1\162\1\5"+
+    "\1\0\2\5\1\0\2\5\3\0\1\5\1\163\1\164"+
+    "\1\165\1\166\7\5\1\167\5\5\15\0\3\5\1\170"+
+    "\3\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\171\7\5\1\172\11\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\11\5\1\173\10\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\1\174\10\5\1\105\10\5\15\0\7\5\4\0"+
+    "\1\175\7\5\1\0\1\137\1\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\17\5\1\176\2\5\15\0\7\5\4\0"+
+    "\10\5\1\0\1\177\1\5\1\0\2\5\3\0\1\200"+
+    "\21\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\1\201\7\5\1\202\11\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\11\5"+
+    "\1\154\10\5\74\0\1\54\72\0\2\54\71\0\1\54"+
+    "\1\0\1\54\75\0\1\51\73\0\1\51\73\0\1\54"+
+    "\73\0\1\54\2\0\10\62\1\0\62\62\10\0\1\203"+
+    "\62\0\11\64\1\0\61\64\11\0\1\204\61\0\10\66"+
+    "\3\0\11\66\1\0\2\66\1\0\2\66\1\0\1\66"+
+    "\1\0\22\66\12\0\1\66\4\0\1\70\12\0\1\70"+
+    "\2\0\1\70\3\0\2\205\1\0\2\206\41\0\3\66"+
+    "\1\207\4\66\3\0\3\66\1\207\2\66\1\207\2\66"+
+    "\1\0\2\66\1\210\2\66\1\0\1\66\1\0\22\66"+
+    "\2\0\1\210\7\0\1\66\2\0\7\5\4\0\1\211"+
+    "\7\5\1\0\2\5\1\0\2\5\3\0\2\5\1\212"+
+    "\1\5\1\213\5\5\1\214\7\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\1\5\1\215"+
+    "\7\5\1\216\4\5\1\217\3\5\15\0\4\5\1\220"+
+    "\2\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\3\5\1\221\5\5\1\222\10\5\14\0"+
+    "\10\77\1\223\1\77\1\0\1\101\57\77\10\0\1\224"+
+    "\62\0\12\77\1\0\60\77\11\102\1\223\1\0\1\104"+
+    "\57\102\11\0\1\225\61\0\12\102\1\0\60\102\1\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\5\1\164\20\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\14\5\1\226\5\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\5\1\227\5\5\1\230\12\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\3\5\1\160"+
+    "\16\5\14\0\3\66\1\111\4\66\3\0\3\66\1\111"+
+    "\2\66\1\111\2\66\1\70\2\71\1\0\2\72\1\0"+
+    "\1\66\1\0\22\66\12\0\1\66\1\0\3\66\1\111"+
+    "\4\66\3\0\1\66\2\67\1\112\2\66\1\112\2\66"+
+    "\1\70\2\71\1\0\2\72\1\0\1\66\1\0\22\66"+
+    "\12\0\1\66\1\0\3\66\1\231\4\66\3\0\3\66"+
+    "\1\231\2\66\3\231\1\0\2\231\1\0\2\66\1\0"+
+    "\1\66\1\0\1\231\1\66\1\231\2\66\1\231\1\66"+
+    "\1\231\12\66\12\0\1\66\2\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\1\232\21\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\10\5\1\233\11\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\10\5\1\234\11\5\15\0"+
+    "\3\5\1\162\3\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\22\5\15\0\7\5\4\0\1\235\7\5"+
+    "\1\0\2\5\1\0\2\5\3\0\1\5\1\236\20\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\3\5\1\237\5\5\1\240\10\5\15\0\7\5"+
+    "\4\0\10\5\1\0\1\241\1\5\1\0\2\5\3\0"+
+    "\7\5\1\242\12\5\15\0\4\5\1\243\2\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\244\21\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\2\5\1\162\17\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\3\5"+
+    "\1\245\16\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\3\5\1\164\16\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"+
+    "\1\246\7\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\4\5\1\162\15\5\15\0\7\5"+
+    "\4\0\1\247\5\5\1\162\1\5\1\0\2\5\1\0"+
+    "\2\5\3\0\22\5\15\0\4\5\1\250\2\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+    "\3\5\1\164\3\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\7\5\1\160\10\5\1\251\1\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\12\5\1\166\1\5\1\164\5\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\11\5\1\252"+
+    "\10\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\4\5\1\253\15\5\15\0\3\5\1\164"+
+    "\3\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\254\21\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\15\5\1\255\4\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5"+
+    "\1\256\11\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\13\5\1\162\6\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"+
+    "\1\257\7\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\12\5\1\260\7\5\15\0\7\5"+
+    "\4\0\10\5\1\0\1\261\1\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\6\5\1\262\1\5\1\0"+
+    "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\10\5\1\244"+
+    "\11\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\1\263\21\5\15\0\7\5\4\0\1\264"+
+    "\7\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+    "\7\5\4\0\10\5\1\0\1\265\1\5\1\0\2\5"+
+    "\3\0\1\5\1\266\12\5\1\267\5\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"+
+    "\1\164\7\5\15\0\3\5\1\164\3\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\1\270\21\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\2\5\1\164\17\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\1\271\1\5\3\0\22\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\4\5"+
+    "\1\164\15\5\15\0\7\5\4\0\10\5\1\0\1\105"+
+    "\1\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\4\5\1\272"+
+    "\5\5\1\273\7\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\3\5\1\274\5\5\1\275"+
+    "\10\5\15\0\7\5\4\0\10\5\1\0\1\214\1\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\12\5\1\276\7\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\10\5\1\277\1\300\10\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\3\5\1\301"+
+    "\16\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\16\5\1\164\3\5\15\0\7\5\4\0"+
+    "\10\5\1\0\1\302\1\5\1\0\2\5\3\0\22\5"+
+    "\15\0\7\5\4\0\3\5\1\164\4\5\1\0\2\5"+
+    "\1\0\2\5\3\0\12\5\1\164\7\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5"+
+    "\1\303\11\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\11\5\1\304\10\5\15\0\7\5"+
+    "\4\0\3\5\1\164\4\5\1\0\2\5\1\0\2\5"+
+    "\3\0\22\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\3\5\1\305\16\5\15\0\3\5"+
+    "\1\127\3\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\22\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\11\5\1\306\10\5\24\0\1\307"+
+    "\73\0\1\310\64\0\1\311\12\0\1\311\2\0\1\311"+
+    "\5\0\1\210\31\0\1\210\11\0\3\66\1\207\4\66"+
+    "\3\0\3\66\1\207\2\66\1\207\2\66\1\0\2\66"+
+    "\1\0\2\72\1\0\1\66\1\0\22\66\12\0\1\66"+
+    "\4\0\1\311\12\0\1\311\2\0\1\311\52\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5"+
+    "\1\312\11\5\15\0\4\5\1\252\2\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\4\5"+
+    "\1\313\2\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\22\5\15\0\3\5\1\164\3\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\15\5"+
+    "\1\260\4\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\3\5\1\237\16\5\15\0\1\314"+
+    "\6\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\1\5\1\315\20\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\11\5\1\141"+
+    "\10\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\7\5\1\316\12\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\5\5\1\317"+
+    "\14\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\15\5\1\320\4\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\1\321\21\5"+
+    "\14\0\3\66\1\231\4\66\3\0\1\66\2\67\1\231"+
+    "\2\66\3\231\1\0\2\231\1\0\2\66\1\0\1\66"+
+    "\1\0\1\231\1\66\1\231\2\66\1\231\1\66\1\231"+
+    "\12\66\12\0\1\66\2\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\1\5\1\215\20\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\14\5\1\162\5\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\1\322\21\5\15\0\7\5"+
+    "\4\0\10\5\1\0\1\164\1\5\1\0\2\5\3\0"+
+    "\4\5\1\166\15\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\1\323\21\5\15\0\7\5"+
+    "\4\0\10\5\1\0\1\162\1\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\6\5\1\162\1\5\1\0"+
+    "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\7\5\1\324"+
+    "\12\5\15\0\7\5\4\0\10\5\1\0\1\325\1\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\14\5\1\326\5\5"+
+    "\15\0\7\5\4\0\1\164\7\5\1\0\2\5\1\0"+
+    "\2\5\3\0\22\5\15\0\7\5\4\0\10\5\1\0"+
+    "\1\327\1\5\1\0\2\5\3\0\22\5\15\0\7\5"+
+    "\4\0\1\330\7\5\1\0\2\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\1\331\21\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\5\5\1\332\14\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\14\5\1\333\5\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\7\5\1\260\12\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\4\5\1\334\15\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\1\5\1\335\20\5"+
+    "\15\0\3\5\1\322\3\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\1\260"+
+    "\7\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+    "\7\5\4\0\10\5\1\0\1\164\1\5\1\0\2\5"+
+    "\3\0\22\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\1\336\21\5\15\0\7\5\4\0"+
+    "\6\5\1\166\1\5\1\0\2\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\3\5\1\337\16\5\15\0\7\5\4\0"+
+    "\1\340\7\5\1\0\2\5\1\0\2\5\3\0\22\5"+
+    "\15\0\3\5\1\252\3\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\4\5\1\341\15\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\12\5\1\342\7\5\15\0\3\5\1\320\3\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\22\5"+
+    "\15\0\7\5\4\0\10\5\1\0\1\343\1\5\1\0"+
+    "\2\5\3\0\22\5\15\0\7\5\4\0\10\5\1\0"+
+    "\1\344\1\5\1\0\2\5\3\0\22\5\15\0\4\5"+
+    "\1\160\2\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\22\5\15\0\4\5\1\345\2\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\1\5"+
+    "\1\346\20\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\10\5\1\327\11\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"+
+    "\1\347\7\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\1\5\1\131\20\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\3\5"+
+    "\1\162\16\5\15\0\7\5\4\0\1\125\7\5\1\0"+
+    "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\5\5\1\350"+
+    "\14\5\15\0\7\5\4\0\1\237\7\5\1\0\2\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\1\331\16\5\1\164"+
+    "\2\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\2\5\1\320\17\5\17\0\1\311\12\0"+
+    "\1\311\2\0\1\311\6\0\2\206\42\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\1\315\21\5"+
+    "\15\0\3\5\1\351\3\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\11\5\1\352\10\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\10\5\1\353\6\5\1\214\2\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\2\5"+
+    "\1\354\17\5\15\0\7\5\4\0\1\127\7\5\1\0"+
+    "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\4\5\1\320"+
+    "\15\5\15\0\7\5\4\0\1\355\7\5\1\0\2\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\6\5"+
+    "\1\356\1\5\1\0\2\5\1\0\2\5\3\0\22\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\12\5\1\131\7\5\15\0\7\5\4\0\10\5"+
+    "\1\0\1\357\1\5\1\0\2\5\3\0\22\5\15\0"+
+    "\3\5\1\131\3\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\22\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\13\5\1\164\6\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\4\5\1\360\15\5\15\0\7\5\4\0\1\361\7\5"+
+    "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5"+
+    "\1\315\11\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\11\5\1\362\10\5\15\0\7\5"+
+    "\4\0\10\5\1\0\1\306\1\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\6\5\1\162\13\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\3\5\1\363"+
+    "\16\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\1\364\21\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\11\5\1\365\10\5"+
+    "\15\0\7\5\4\0\1\366\7\5\1\0\2\5\1\0"+
+    "\2\5\3\0\11\5\1\257\10\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\7\5\1\160"+
+    "\12\5\15\0\3\5\1\105\3\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\5\5\1\367"+
+    "\14\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\3\5\1\370\16\5\15\0\7\5\4\0"+
+    "\10\5\1\0\1\371\1\5\1\0\2\5\3\0\22\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\1\372\21\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\1\5\1\162\20\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\5\1\373\20\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\2\5\1\260\17\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\162\21\5\15\0\7\5\4\0\1\143\7\5\1\0"+
+    "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\11\5\1\257"+
+    "\10\5\15\0\3\5\1\374\3\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\4\5\1\214"+
+    "\15\5\15\0\7\5\4\0\10\5\1\0\1\320\1\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\7\5\1\375\12\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\14\5\1\376\5\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\5\5\1\257\14\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\1\5\1\377\20\5\15\0\7\5\4\0\10\5"+
+    "\1\0\1\177\1\5\1\0\2\5\3\0\22\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\7\5\1\u0100\12\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\4\5\1\u0101\15\5\15\0"+
+    "\3\5\1\u0102\3\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\22\5\15\0\7\5\4\0\1\u0103\7\5"+
+    "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"+
+    "\1\273\7\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\1\u0104\21\5\15\0\7\5\4\0"+
+    "\10\5\1\0\1\u0105\1\5\1\0\2\5\3\0\22\5"+
+    "\15\0\4\5\1\237\2\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\1\u0106"+
+    "\7\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\u0107\21\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\4\5\1\330\15\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\4\5"+
+    "\1\260\15\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\4\5\1\u0108\15\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\1\u0109"+
+    "\21\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\1\5\1\252\20\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\17\5\1\333"+
+    "\2\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\3\5\1\127\16\5\14\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[14514];
+    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 =
+    "\3\0\1\11\10\1\1\11\32\1\1\11\3\1\1\11"+
+    "\4\1\1\11\17\1\1\0\2\1\1\0\76\1\3\0"+
+    "\1\11\1\1\1\0\12\1\3\11\61\1\2\11\101\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[265];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PythonTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = LONG_STRING_2;
+				break;
+			case Token.LITERAL_CHAR:
+				state = LONG_STRING_1;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+		zzAtEOF  = false;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+
+
+  /**
+   * 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 PythonTokenMaker(java.io.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 PythonTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 168) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 20: break;
+        case 10: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 21: break;
+        case 8: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 22: break;
+        case 12: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 23: break;
+        case 13: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 24: break;
+        case 9: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 25: break;
+        case 15: 
+          { yybegin(LONG_STRING_1); addToken(Token.LITERAL_CHAR);
+          }
+        case 26: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 27: break;
+        case 14: 
+          { addToken(Token.FUNCTION);
+          }
+        case 28: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 29: break;
+        case 17: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 30: break;
+        case 4: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 31: break;
+        case 7: 
+          { addToken(Token.COMMENT_EOL);
+          }
+        case 32: break;
+        case 11: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 33: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 34: break;
+        case 6: 
+          { addToken(Token.OPERATOR);
+          }
+        case 35: break;
+        case 19: 
+          { yybegin(YYINITIAL); addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 36: break;
+        case 16: 
+          { yybegin(LONG_STRING_2); addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 37: break;
+        case 18: 
+          { yybegin(YYINITIAL); addToken(Token.LITERAL_CHAR);
+          }
+        case 38: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 266: break;
+            case LONG_STRING_2: {
+              if (firstToken==null) {
+										addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); 
+									}
+									return firstToken;
+            }
+            case 267: break;
+            case LONG_STRING_1: {
+              if (firstToken==null) {
+										addToken(Token.LITERAL_CHAR); 
+									}
+									return firstToken;
+            }
+            case 268: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.flex
new file mode 100644
index 0000000..119f82f
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.flex
@@ -0,0 +1,763 @@
+/*
+ * 09/11/2008
+ *
+ * RubyTokenMaker.java - Scanner for Ruby
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Ruby.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated RubyTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class RubyTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_UNQUOTED			= -1;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an single quoted EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_SINGLE_QUOTED		= -2;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an double quoted EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_DOUBLE_QUOTED		= -3;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_UNQUOTED			= -4;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an single quoted EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_SINGLE_QUOTED		= -5;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an double quoted EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_DOUBLE_QUOTED		= -6;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q!...! style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_BANG				= -7;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q{...} style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_CURLY_BRACE		= -8;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q<...> style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_LT					= -9;
+
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q(...) style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_PAREN					= -10;
+
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q/.../ style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_SLASH				= -11;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q[...] style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_SQUARE_BRACKET		= -12;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public RubyTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * 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) {
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR_LITERAL;
+				start = text.offset;
+				break;
+			case Token.LITERAL_BACKQUOTE:
+				state = BACKTICKS;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_UNQUOTED:
+				state = HEREDOC_EOF_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_SINGLE_QUOTED:
+				state = HEREDOC_EOF_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_DOUBLE_QUOTED:
+				state = HEREDOC_EOF_DOUBLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_UNQUOTED:
+				state = HEREDOC_EOT_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_SINGLE_QUOTED:
+				state = HEREDOC_EOT_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_DOUBLE_QUOTED:
+				state = HEREDOC_EOT_DOUBLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_BANG:
+				state = STRING_Q_BANG;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_CURLY_BRACE:
+				state = STRING_Q_CURLY_BRACE;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_LT:
+				state = STRING_Q_LT;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_PAREN:
+				state = STRING_Q_PAREN;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_SLASH:
+				state = STRING_Q_SLASH;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_SQUARE_BRACKET:
+				state = STRING_Q_SQUARE_BRACKET;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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]
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+BinaryDigit							= ([01])
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\'\`]|"#"|"\\")
+
+IdentifierStart					= ({Letter}|"_")
+IdentifierPart						= ({IdentifierStart}|{Digit})
+BooleanLiteral				= ("true"|"false")
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+LineCommentBegin			= "#"
+DocCommentBegin				= "=begin"
+DocCommentEnd				= "=end"
+
+DigitOrUnderscore			= ({Digit}|[_])
+BinaryIntLiteral			= ("0b"{BinaryDigit}([01_]*{BinaryDigit})?)
+OctalLiteral				= ("0"([0-7_]*{OctalDigit})?)
+DecimalLiteral1				= ("0d"{Digit}({DigitOrUnderscore}*{Digit})?)
+DecimalLiteral2				= ({NonzeroDigit}({DigitOrUnderscore}*{Digit})?)
+DecimalLiteral				= ({BinaryIntLiteral}|{OctalLiteral}|{DecimalLiteral1}|{DecimalLiteral2})
+HexLiteral					= ("0x"{HexDigit}([0-9a-zA-Z_]*{HexDigit})?)
+FloatLiteral				= ({NonzeroDigit}({DigitOrUnderscore}*{Digit})?[Ee]({Digit}({DigitOrUnderscore}*{Digit})?)?)
+
+Separator					= ([\(\)\{\}])
+Operator1					= ("::"|"."|"["|"]"|"-"|"+"|"!"|"~"|"*"|"/"|"%"|"<<"|">>"|"&"|"|"|"^")
+Operator2					= (">"|">="|"<"|"<="|"<=>"|"=="|"==="|"!="|"=~"|"!~"|"&&"|"||")
+Operator3					= (".."|"..."|"="|"+="|"-="|"*="|"/="|"%=")
+Operator					= ({Operator1}|{Operator2}|{Operator3})
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+Symbol					= ([:]{Identifier})
+ErrorIdentifier			= ({NonSeparator}+)
+
+PreDefinedVariable			= ("$"([!@&`\'+0-9~=/\,;.<>_*$?:\"]|"DEBUG"|"FILENAME"|"LOAD_PATH"|"stderr"|"stdin"|"stdout"|"VERBOSE"|([\-][0adFiIlpwv])))
+Variable					= ({PreDefinedVariable}|([@][@]?|[$]){Identifier})
+
+%state STRING
+%state STRING_Q_BANG
+%state STRING_Q_CURLY_BRACE
+%state STRING_Q_PAREN
+%state STRING_Q_SLASH
+%state STRING_Q_SQUARE_BRACKET
+%state STRING_Q_LT
+%state CHAR_LITERAL
+%state BACKTICKS
+%state HEREDOC_EOF_UNQUOTED
+%state HEREDOC_EOF_SINGLE_QUOTED
+%state HEREDOC_EOF_DOUBLE_QUOTED
+%state HEREDOC_EOT_UNQUOTED
+%state HEREDOC_EOT_SINGLE_QUOTED
+%state HEREDOC_EOT_DOUBLE_QUOTED
+%state DOCCOMMENT
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"alias" |
+	"BEGIN" |
+	"begin" |
+	"break" |
+	"case" |
+	"class" |
+	"def" |
+	"defined" |
+	"do" |
+	"else" |
+	"elsif" |
+	"END" |
+	"end" |
+	"ensure" |
+	"for" |
+	"if" |
+	"in" |
+	"module" |
+	"next" |
+	"nil" |
+	"redo" |
+	"rescue" |
+	"retry" |
+	"return" |
+	"self" |
+	"super" |
+	"then" |
+	"undef" |
+	"unless" |
+	"until" |
+	"when" |
+	"while" |
+	"yield"					{ addToken(Token.RESERVED_WORD); }
+
+	"Array" |
+	"Float" |
+	"Integer" |
+	"String" |
+	"at_exit" |
+	"autoload" |
+	"binding" |
+	"caller" |
+	"catch" |
+	"chop" |
+	"chop!" |
+	"chomp" |
+	"chomp!" |
+	"eval" |
+	"exec" |
+	"exit" |
+	"exit!" |
+	"fail" |
+	"fork" |
+	"format" |
+	"gets" |
+	"global_variables" |
+	"gsub" |
+	"gsub!" |
+	"iterator?" |
+	"lambda" |
+	"load" |
+	"local_variables" |
+	"loop" |
+	"open" |
+	"p" |
+	"print" |
+	"printf" |
+	"proc" |
+	"putc" |
+	"puts" |
+	"raise" |
+	"rand" |
+	"readline" |
+	"readlines" |
+	"require" |
+	"select" |
+	"sleep" |
+	"split" |
+	"sprintf" |
+	"srand" |
+	"sub" |
+	"sub!" |
+	"syscall" |
+	"system" |
+	"test" |
+	"trace_var" |
+	"trap" |
+	"untrace_var"					{ addToken(Token.FUNCTION); } 
+
+	"and" |
+	"or" |
+	"not"					{ addToken(Token.OPERATOR); }
+
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+	{Variable}						{ addToken(Token.VARIABLE); }
+	{Symbol}						{ addToken(Token.PREPROCESSOR); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	\"							{ start = zzMarkedPos-1; yybegin(STRING); }
+	\'							{ start = zzMarkedPos-1; yybegin(CHAR_LITERAL); }
+	[\%][QqWwx]?[\(]			{ start = zzMarkedPos-yylength(); yybegin(STRING_Q_PAREN); }
+	[\%][QqWwx]?[\{]			{ start = zzMarkedPos-yylength(); yybegin(STRING_Q_CURLY_BRACE); }
+	[\%][QqWwx]?[\[]			{ start = zzMarkedPos-yylength(); yybegin(STRING_Q_SQUARE_BRACKET); }
+	[\%][QqWwx]?[\<]			{ start = zzMarkedPos-yylength(); yybegin(STRING_Q_LT); }
+	[\%][QqWwx]?[\!]			{ start = zzMarkedPos-yylength(); yybegin(STRING_Q_BANG); }
+	[\%][QqWwx]?[\/]			{ start = zzMarkedPos-yylength(); yybegin(STRING_Q_SLASH); }
+	\`							{ start = zzMarkedPos-1; yybegin(BACKTICKS); }
+
+	/* Comment literals. */
+	{LineCommentBegin}.*			{ addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+	{DocCommentBegin}				{ start = zzMarkedPos-6; yybegin(DOCCOMMENT); }
+
+	/* "Here-document" syntax.  This is only implemented for the common */
+	/* cases.                                                           */
+	"<<EOF"						{ start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+	"<<" {WhiteSpace}* \""EOF"\"		{ start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+	"<<" {WhiteSpace}* \'"EOF"\'		{ start = zzStartRead; yybegin(HEREDOC_EOF_SINGLE_QUOTED); }
+	"<<" {WhiteSpace}* \`"EOF"\`		{ start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+	"<<EOT"						{ start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+	"<<" {WhiteSpace}* \""EOT"\"		{ start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+	"<<" {WhiteSpace}* \'"EOT"\'		{ start = zzStartRead; yybegin(HEREDOC_EOT_SINGLE_QUOTED); }
+	"<<" {WhiteSpace}* \`"EOT"\`		{ start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+
+	/* Separators and operators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{DecimalLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+
+<STRING> {
+	[^\n\\\"]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\"					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+
+<STRING_Q_BANG> {
+	[^\n\\\!]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_BANG); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\!					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_BANG); return firstToken; }
+}
+
+
+<STRING_Q_CURLY_BRACE> {
+	[^\n\\\}]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_CURLY_BRACE); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\}					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_CURLY_BRACE); return firstToken; }
+}
+
+
+<STRING_Q_LT> {
+	[^\n\\\>]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_LT); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\>					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_LT); return firstToken; }
+}
+
+
+<STRING_Q_PAREN> {
+	[^\n\\\)]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_PAREN); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\)					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_PAREN); return firstToken; }
+}
+
+
+<STRING_Q_SLASH> {
+	[^\n\\\/]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SLASH); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\/					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SLASH); return firstToken; }
+}
+
+
+<STRING_Q_SQUARE_BRACKET> {
+	[^\n\\\]]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SQUARE_BRACKET); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\]					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SQUARE_BRACKET); return firstToken; }
+}
+
+
+<CHAR_LITERAL> {
+	[^\n\\\']+			{}
+	\\.?					{ /* Skip escaped single quotes only, but this should still work. */ }
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+	\'					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+}
+
+
+<BACKTICKS> {
+	[^\n\\\`]+		{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\`					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
+}
+
+
+<HEREDOC_EOF_UNQUOTED> {
+	/* NOTE: The closing "EOF" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOF" will match any line containing  */
+	/* EOF and any other chars.                                         */
+	/* NOTE2: This case is used for unquoted <<EOF, double quoted       */
+	/* <<"EOF" and backticks <<`EOF`, since they all follow the same    */
+	/* syntactic rules.                                                 */
+	"EOF"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOF_SINGLE_QUOTED> {
+	/* NOTE: The closing "EOF" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOF" will match any line containing  */
+	/* EOF and any other chars.                                         */
+	"EOF"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOF_DOUBLE_QUOTED> {
+	/* NOTE: The closing "EOF" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOF" will match any line containing  */
+	/* EOF and any other chars.                                         */
+	"EOF"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOT_UNQUOTED> {
+	/* NOTE: The closing "EOT" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOT" will match any line containing  */
+	/* EOF and any other chars.                                         */
+	/* NOTE2: This case is used for unquoted <<EOT, double quoted       */
+	/* <<"EOT" and backticks <<`EOT`, since they all follow the same    */
+	/* syntactic rules.                                                 */
+	"EOT"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOT_SINGLE_QUOTED> {
+	/* NOTE: The closing "EOT" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOT" will match any line containing  */
+	/* EOT and any other chars.                                         */
+	"EOT"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOT_DOUBLE_QUOTED> {
+	/* NOTE: The closing "EOT" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOT" will match any line containing  */
+	/* EOT and any other chars.                                         */
+	"EOT"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<DOCCOMMENT> {
+
+	[^\n\=]+				{}
+	{DocCommentEnd}			{ yybegin(YYINITIAL); addToken(start,zzStartRead+3, Token.COMMENT_DOCUMENTATION); }
+	=					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken; }
+	<<EOF>>					{ yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.java
new file mode 100644
index 0000000..80f3714
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.java
@@ -0,0 +1,1666 @@
+/* The following code was generated by JFlex 1.4.1 on 1/20/09 10:04 AM */
+
+/*
+ * 09/11/2008
+ *
+ * RubyTokenMaker.java - Scanner for Ruby
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Ruby.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated RubyTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class RubyTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int HEREDOC_EOF_SINGLE_QUOTED = 11;
+  public static final int DOCCOMMENT = 14;
+  public static final int HEREDOC_EOT_SINGLE_QUOTED = 13;
+  public static final int HEREDOC_EOT_UNQUOTED = 12;
+  public static final int STRING_Q_SLASH = 5;
+  public static final int STRING_Q_BANG = 2;
+  public static final int STRING_Q_LT = 7;
+  public static final int STRING = 1;
+  public static final int BACKTICKS = 9;
+  public static final int YYINITIAL = 0;
+  public static final int HEREDOC_EOF_UNQUOTED = 10;
+  public static final int STRING_Q_CURLY_BRACE = 3;
+  public static final int STRING_Q_PAREN = 4;
+  public static final int HEREDOC_EOF_DOUBLE_QUOTED = 11;
+  public static final int CHAR_LITERAL = 8;
+  public static final int HEREDOC_EOT_DOUBLE_QUOTED = 13;
+  public static final int STRING_Q_SQUARE_BRACKET = 6;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\24\1\23\1\0\1\24\1\7\22\0\1\24\1\44\1\105"+
+    "\1\10\1\55\1\47\1\52\1\106\1\110\1\35\1\43\1\43\1\57"+
+    "\1\42\1\37\1\46\1\3\1\4\6\6\2\2\1\36\1\57\1\50"+
+    "\1\25\1\51\1\103\1\56\1\66\1\61\1\5\1\60\1\34\1\63"+
+    "\1\62\1\1\1\64\2\1\1\1\1\1\1\65\1\67\1\1\1\107"+
+    "\1\1\1\72\1\70\1\1\1\1\1\107\3\1\1\40\1\11\1\41"+
+    "\1\54\1\12\1\112\1\20\1\26\1\75\1\32\1\16\1\17\1\27"+
+    "\1\101\1\30\1\1\1\74\1\21\1\76\1\31\1\71\1\100\1\104"+
+    "\1\14\1\22\1\13\1\15\1\73\1\102\1\33\1\77\1\1\1\111"+
+    "\1\53\1\113\1\45\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 =
+    "\17\0\1\1\1\2\2\3\1\2\1\4\10\2\1\5"+
+    "\1\6\1\7\6\2\1\10\1\2\11\7\2\1\11\2"+
+    "\1\11\1\2\1\12\1\13\1\14\1\15\1\16\1\17"+
+    "\1\20\1\15\1\21\1\15\1\22\1\15\1\23\1\15"+
+    "\1\24\1\15\1\25\1\15\1\26\1\15\1\27\1\30"+
+    "\1\31\1\15\1\32\1\33\1\15\1\34\1\15\1\35"+
+    "\1\36\1\15\1\37\1\15\1\40\1\15\1\1\1\41"+
+    "\1\3\4\1\30\2\1\0\7\2\1\42\5\2\1\43"+
+    "\1\7\1\0\1\44\1\45\1\46\1\47\1\50\1\51"+
+    "\2\7\3\52\1\0\1\1\4\2\1\7\12\2\1\16"+
+    "\1\27\2\15\1\0\1\41\2\3\1\53\24\2\1\42"+
+    "\7\2\1\11\6\2\1\0\10\2\1\42\5\0\20\2"+
+    "\1\54\1\0\4\1\1\55\1\2\1\11\16\2\1\11"+
+    "\5\2\1\0\3\2\4\0\11\2\1\56\12\2\1\0"+
+    "\2\2\1\57\1\60\3\0\2\2\1\11\5\2\1\61"+
+    "\1\2\6\0\4\2\1\62\1\63\1\11\7\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[344];
+    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\114\0\230\0\344\0\u0130\0\u017c\0\u01c8\0\u0214"+
+    "\0\u0260\0\u02ac\0\u02f8\0\u0344\0\u0390\0\u03dc\0\u0428\0\u0474"+
+    "\0\u04c0\0\u050c\0\u0558\0\u05a4\0\u05f0\0\u063c\0\u0688\0\u06d4"+
+    "\0\u0720\0\u076c\0\u07b8\0\u0804\0\u0850\0\u05a4\0\u089c\0\u08e8"+
+    "\0\u0934\0\u0980\0\u09cc\0\u0a18\0\u0a64\0\u0ab0\0\u05a4\0\u0afc"+
+    "\0\u0b48\0\u05a4\0\u0b94\0\u0be0\0\u0c2c\0\u0c78\0\u0cc4\0\u0d10"+
+    "\0\u0d5c\0\u0da8\0\u0df4\0\u0e40\0\u0e8c\0\u0ed8\0\u0f24\0\u0f70"+
+    "\0\u0fbc\0\u1008\0\u1054\0\u10a0\0\u10ec\0\u1138\0\u05a4\0\u05a4"+
+    "\0\u05a4\0\u1184\0\u11d0\0\u05a4\0\u05a4\0\u121c\0\u05a4\0\u1268"+
+    "\0\u05a4\0\u12b4\0\u05a4\0\u1300\0\u05a4\0\u134c\0\u05a4\0\u1398"+
+    "\0\u05a4\0\u13e4\0\u1430\0\u05a4\0\u05a4\0\u147c\0\u05a4\0\u05a4"+
+    "\0\u14c8\0\u05a4\0\u1514\0\u05a4\0\u05a4\0\u1560\0\u05a4\0\u15ac"+
+    "\0\u05a4\0\u15f8\0\u1644\0\u1690\0\u16dc\0\u16dc\0\u1728\0\u1774"+
+    "\0\u17c0\0\u180c\0\u1858\0\u18a4\0\u18f0\0\u193c\0\u1988\0\u19d4"+
+    "\0\u1a20\0\u1a6c\0\u1ab8\0\u1b04\0\u1b50\0\u1b9c\0\u1be8\0\u1c34"+
+    "\0\u1c80\0\u1ccc\0\u1d18\0\u1d64\0\u1db0\0\u1dfc\0\u1e48\0\u1e94"+
+    "\0\u1ee0\0\u1f2c\0\u1f78\0\u1fc4\0\u2010\0\u205c\0\u20a8\0\u20f4"+
+    "\0\u2140\0\u04c0\0\u218c\0\u21d8\0\u2224\0\u2270\0\u22bc\0\u2308"+
+    "\0\u2354\0\u23a0\0\u05a4\0\u05a4\0\u05a4\0\u05a4\0\u05a4\0\u05a4"+
+    "\0\u23ec\0\u2438\0\u2484\0\u0474\0\u05a4\0\u24d0\0\u251c\0\u2568"+
+    "\0\u25b4\0\u2600\0\u264c\0\u04c0\0\u2698\0\u26e4\0\u2730\0\u277c"+
+    "\0\u27c8\0\u2814\0\u2860\0\u28ac\0\u28f8\0\u2944\0\u05a4\0\u05a4"+
+    "\0\u2990\0\u29dc\0\u2a28\0\u2a74\0\u2ac0\0\u2b0c\0\u2b58\0\u2ba4"+
+    "\0\u2bf0\0\u2c3c\0\u2c88\0\u2cd4\0\u2d20\0\u2d6c\0\u2db8\0\u2e04"+
+    "\0\u2e50\0\u2e9c\0\u2ee8\0\u2f34\0\u2f80\0\u2fcc\0\u3018\0\u3064"+
+    "\0\u30b0\0\u30fc\0\u3148\0\u3194\0\u31e0\0\u322c\0\u3278\0\u32c4"+
+    "\0\u3310\0\u335c\0\u33a8\0\u33f4\0\u3440\0\u348c\0\u34d8\0\u3524"+
+    "\0\u3570\0\u35bc\0\u3608\0\u3654\0\u36a0\0\u36ec\0\u3738\0\u3784"+
+    "\0\u37d0\0\u381c\0\u3868\0\u38b4\0\u3900\0\u394c\0\u3998\0\u39e4"+
+    "\0\u3a30\0\u3a7c\0\u3ac8\0\u3b14\0\u3b60\0\u3bac\0\u3bf8\0\u3c44"+
+    "\0\u3c90\0\u3cdc\0\u3d28\0\u3d74\0\u3dc0\0\u3e0c\0\u3e58\0\u3ea4"+
+    "\0\u3ef0\0\u14c8\0\u3f3c\0\u2a74\0\u2ac0\0\u2b0c\0\u2b58\0\u04c0"+
+    "\0\u3f88\0\u04c0\0\u3fd4\0\u4020\0\u406c\0\u40b8\0\u4104\0\u4150"+
+    "\0\u419c\0\u41e8\0\u4234\0\u4280\0\u42cc\0\u4318\0\u4364\0\u43b0"+
+    "\0\u05a4\0\u43fc\0\u4448\0\u4494\0\u44e0\0\u452c\0\u4578\0\u45c4"+
+    "\0\u4610\0\u465c\0\u46a8\0\u46f4\0\u4740\0\u478c\0\u47d8\0\u4824"+
+    "\0\u4870\0\u48bc\0\u4908\0\u4954\0\u49a0\0\u49ec\0\u4a38\0\u05a4"+
+    "\0\u4a84\0\u4ad0\0\u4b1c\0\u4b68\0\u4bb4\0\u4c00\0\u4c4c\0\u4c98"+
+    "\0\u4ce4\0\u4d30\0\u4d7c\0\u4dc8\0\u4e14\0\u05a4\0\u05a4\0\u4e60"+
+    "\0\u4eac\0\u4ef8\0\u4f44\0\u4f90\0\u4fdc\0\u5028\0\u5074\0\u50c0"+
+    "\0\u510c\0\u4fdc\0\u05a4\0\u5158\0\u51a4\0\u51f0\0\u523c\0\u5288"+
+    "\0\u52d4\0\u5320\0\u536c\0\u53b8\0\u5404\0\u5450\0\u05a4\0\u05a4"+
+    "\0\u3738\0\u549c\0\u54e8\0\u5534\0\u5580\0\u55cc\0\u5618\0\u5664";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[344];
+    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\20\1\21\1\22\1\23\1\22\1\21\1\22\1\24"+
+    "\1\25\1\20\1\21\1\26\1\27\1\30\1\31\1\32"+
+    "\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42"+
+    "\1\43\1\44\1\45\1\21\1\46\1\47\1\50\1\51"+
+    "\2\52\2\53\1\54\1\52\1\53\1\55\1\56\1\57"+
+    "\1\60\1\61\1\52\1\62\1\63\1\24\1\21\1\64"+
+    "\1\21\1\65\1\66\1\21\1\67\2\21\1\70\1\71"+
+    "\2\21\1\72\1\73\1\74\1\75\1\21\1\76\1\24"+
+    "\1\21\1\77\1\100\1\21\2\47\1\101\1\47\11\102"+
+    "\1\103\11\102\1\104\61\102\1\105\6\102\11\106\1\103"+
+    "\11\106\1\107\20\106\1\105\47\106\11\110\1\103\11\110"+
+    "\1\111\67\110\1\105\11\112\1\103\11\112\1\113\11\112"+
+    "\1\105\56\112\11\114\1\103\11\114\1\115\22\114\1\105"+
+    "\45\114\11\116\1\103\11\116\1\117\15\116\1\105\52\116"+
+    "\11\120\1\103\11\120\1\121\25\120\1\105\42\120\11\122"+
+    "\1\123\11\122\1\124\62\122\1\125\5\122\11\126\1\103"+
+    "\11\126\1\127\66\126\1\130\1\126\11\131\1\103\11\131"+
+    "\1\132\10\131\1\133\70\131\1\103\11\131\1\134\10\131"+
+    "\1\133\70\131\1\103\11\131\1\135\10\131\1\136\70\131"+
+    "\1\103\11\131\1\137\10\131\1\136\57\131\23\140\1\141"+
+    "\1\140\1\142\66\140\7\20\1\0\13\20\3\0\7\20"+
+    "\20\0\2\20\1\0\23\20\1\0\1\20\2\0\1\20"+
+    "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\2\20\3\22\1\20\1\22\1\0\2\20\1\143"+
+    "\3\20\1\144\4\20\3\0\6\20\1\144\20\0\2\20"+
+    "\1\0\23\20\1\0\1\20\2\0\1\20\4\0\3\20"+
+    "\2\145\1\20\1\145\1\0\2\20\1\146\10\20\3\0"+
+    "\1\147\3\20\1\150\1\151\1\20\20\0\2\20\1\0"+
+    "\23\20\1\0\1\20\2\0\1\20\120\0\23\25\1\0"+
+    "\70\25\1\20\6\21\1\0\2\20\2\21\1\152\1\21"+
+    "\1\153\4\21\3\0\7\21\20\0\2\20\1\0\21\21"+
+    "\1\154\1\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\4\21\1\155\1\21\1\156\2\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\11\21"+
+    "\3\0\3\21\1\157\3\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\7\21\1\160\1\21\3\0\3\21\1\161\1\21"+
+    "\1\162\1\21\20\0\2\20\1\0\13\21\1\163\7\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\6\21\1\164\2\21\3\0\7\21\20\0\2\20"+
+    "\1\0\11\21\1\165\11\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\1\21\1\166\1\21"+
+    "\1\167\3\21\1\170\1\21\3\0\3\21\1\171\3\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\6\21\1\172\2\21"+
+    "\3\0\7\21\20\0\2\20\1\0\11\21\1\173\11\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\2\21\1\174\1\175\1\176\2\21\1\177\1\21"+
+    "\3\0\7\21\20\0\2\20\1\0\17\21\1\200\1\201"+
+    "\2\21\1\0\1\21\2\0\1\21\30\0\1\37\114\0"+
+    "\1\53\1\202\16\0\1\52\46\0\1\20\6\21\1\0"+
+    "\2\20\2\21\1\203\1\21\1\204\4\21\3\0\2\21"+
+    "\1\205\4\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\4\21"+
+    "\1\206\2\21\1\207\1\210\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\1\21\1\211\3\21\1\212\3\21"+
+    "\3\0\3\21\1\212\3\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\4\21\1\213\4\21\3\0\2\21\1\214\4\21"+
+    "\20\0\2\20\1\0\11\21\1\215\11\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\4\21"+
+    "\1\216\4\21\3\0\7\21\20\0\2\20\1\0\11\21"+
+    "\1\212\11\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\7\21\20\0\2\20"+
+    "\1\0\5\21\1\217\15\21\1\0\1\21\2\0\1\21"+
+    "\5\0\1\220\3\0\1\220\4\0\11\220\3\0\7\220"+
+    "\1\0\1\52\21\0\23\220\1\0\1\220\2\0\1\220"+
+    "\43\0\1\221\101\0\1\52\113\0\1\52\17\0\1\52"+
+    "\73\0\1\52\5\0\1\222\4\0\1\223\3\0\1\224"+
+    "\1\0\1\225\1\0\1\226\31\0\1\222\1\0\1\222"+
+    "\2\0\1\222\1\227\1\230\27\0\1\231\22\0\1\232"+
+    "\70\0\1\52\23\0\1\52\114\0\1\52\114\0\1\52"+
+    "\40\0\1\20\1\233\3\234\1\233\1\234\1\0\2\20"+
+    "\11\233\2\0\1\235\7\233\1\0\2\235\2\0\1\236"+
+    "\4\235\1\0\3\235\2\0\2\234\1\235\23\233\1\235"+
+    "\1\233\2\235\1\233\2\0\1\235\1\0\1\20\1\233"+
+    "\3\20\1\233\1\20\1\0\2\20\11\233\3\0\7\233"+
+    "\20\0\1\20\1\237\1\0\23\233\1\0\1\233\2\0"+
+    "\1\233\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\6\21\1\240\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\7\21"+
+    "\1\241\1\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\11\21\3\0\3\21\1\242\3\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\2\21\1\243\6\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\2\21\1\244\6\21"+
+    "\3\0\7\21\20\0\2\20\1\0\20\21\1\245\2\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\1\21\1\246\7\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\6\21\1\247\1\250\1\21\3\0"+
+    "\7\21\20\0\2\20\1\0\21\21\1\251\1\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\11\21\1\252"+
+    "\11\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\2\21\1\253\4\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\2\21\1\254\1\255\5\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\11\21"+
+    "\3\0\7\21\20\0\2\20\1\0\21\21\1\256\1\21"+
+    "\1\0\1\21\2\0\1\21\4\0\11\102\1\0\11\102"+
+    "\1\0\61\102\1\0\6\102\23\257\1\0\70\257\11\106"+
+    "\1\0\11\106\1\0\20\106\1\0\47\106\11\110\1\0"+
+    "\11\110\1\0\67\110\1\0\11\112\1\0\11\112\1\0"+
+    "\11\112\1\0\56\112\11\114\1\0\11\114\1\0\22\114"+
+    "\1\0\45\114\11\116\1\0\11\116\1\0\15\116\1\0"+
+    "\52\116\11\120\1\0\11\120\1\0\25\120\1\0\42\120"+
+    "\11\122\1\0\11\122\1\0\62\122\1\0\5\122\23\260"+
+    "\1\0\70\260\11\126\1\0\11\126\1\0\66\126\1\0"+
+    "\1\126\11\131\1\0\11\131\1\0\101\131\1\0\11\131"+
+    "\1\0\43\131\1\261\35\131\1\0\11\131\1\0\43\131"+
+    "\1\262\24\131\23\140\1\0\1\140\1\0\66\140\16\0"+
+    "\1\263\75\0\2\20\3\22\1\20\1\22\1\0\2\20"+
+    "\1\143\10\20\3\0\7\20\20\0\2\20\1\0\23\20"+
+    "\1\0\1\20\2\0\1\20\4\0\2\20\3\264\1\20"+
+    "\1\264\1\0\13\20\3\0\7\20\20\0\2\20\1\0"+
+    "\23\20\1\0\1\20\2\0\1\20\4\0\3\20\2\145"+
+    "\1\20\1\145\1\0\2\20\1\146\10\20\3\0\7\20"+
+    "\20\0\2\20\1\0\23\20\1\0\1\20\2\0\1\20"+
+    "\4\0\3\20\2\265\2\20\1\0\13\20\3\0\7\20"+
+    "\20\0\2\20\1\0\23\20\1\0\1\20\2\0\1\20"+
+    "\4\0\2\20\3\266\1\20\1\266\1\0\13\20\3\0"+
+    "\7\20\20\0\2\20\1\0\23\20\1\0\1\20\2\0"+
+    "\1\20\4\0\2\20\5\267\1\0\6\20\3\267\2\20"+
+    "\3\0\1\267\3\20\1\267\1\20\1\267\20\0\2\20"+
+    "\1\0\2\267\1\20\1\267\2\20\1\267\6\20\1\267"+
+    "\5\20\1\0\1\20\2\0\1\20\4\0\1\20\6\21"+
+    "\1\0\2\20\3\21\1\270\2\21\1\271\2\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\10\21\1\272"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\4\21"+
+    "\1\273\4\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\1\21\1\274\4\21\1\275\1\21\1\276\3\0"+
+    "\4\21\1\277\2\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\300\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\2\21\1\301\1\302\3\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\1\21\1\303\5\21\1\304\1\21"+
+    "\3\0\4\21\1\305\2\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\10\21\1\306\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\10\21\1\307\3\0\4\21\1\212\2\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\4\21\1\310\4\21"+
+    "\3\0\2\21\1\311\4\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\6\21\1\312\2\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\7\21\1\313\1\21\3\0\2\21"+
+    "\1\312\4\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\2\21"+
+    "\1\314\6\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\1\315\10\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\1\21\1\316\7\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\2\21\1\317"+
+    "\4\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\4\21\1\244\2\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\16\21\1\320"+
+    "\4\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\6\21\1\302\2\21\3\0\7\21\20\0"+
+    "\2\20\1\0\11\21\1\321\3\21\1\322\5\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\6\21\1\323\2\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\1\324\6\21\20\0\2\20"+
+    "\1\0\20\21\1\325\2\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\7\21\1\326\1\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\4\21"+
+    "\1\327\4\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\10\21\1\330\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\2\21\1\331\4\21\1\332\1\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\22\0\1\333\75\0\1\20\6\21\1\0\2\20"+
+    "\4\21\1\334\4\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\1\21\1\335\5\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\3\21\1\336"+
+    "\3\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\1\21\1\337"+
+    "\7\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\11\21\1\340"+
+    "\11\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\3\21\1\341\5\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\4\21\1\342\4\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\5\21\1\343\1\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\7\21\1\212\1\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\1\21\1\244\7\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\5\21\1\344\3\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\1\212\22\21\1\0\1\21"+
+    "\2\0\1\21\5\0\6\220\3\0\11\220\3\0\7\220"+
+    "\23\0\23\220\1\0\1\220\2\0\1\220\43\0\1\52"+
+    "\114\0\1\223\3\0\1\224\1\0\1\225\1\0\1\226"+
+    "\37\0\1\227\1\230\53\0\1\52\66\0\1\345\7\0"+
+    "\1\346\50\0\1\347\1\350\3\0\1\351\1\0\1\20"+
+    "\6\233\1\0\2\20\11\233\3\0\7\233\20\0\2\20"+
+    "\1\0\23\233\1\0\1\233\2\0\1\233\7\0\1\235"+
+    "\14\0\2\235\6\0\1\235\1\0\1\235\30\0\2\235"+
+    "\6\0\1\235\4\0\1\235\1\0\1\235\11\0\1\20"+
+    "\1\233\3\20\1\233\1\20\1\0\2\20\11\233\3\0"+
+    "\7\233\20\0\2\20\1\0\23\233\1\0\1\233\2\0"+
+    "\1\233\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\2\21\1\352\20\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\11\21\1\353"+
+    "\11\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\1\21\1\354\7\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\2\21\1\355\6\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\4\21\1\356"+
+    "\4\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\2\21\1\357\6\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\1\21\1\360\5\21\1\361\1\362\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\6\21\1\363"+
+    "\2\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\11\21\1\364"+
+    "\11\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\4\21\1\365\2\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\4\21\1\366\4\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\2\21\1\367\4\21\20\0\2\20\1\0\11\21\1\310"+
+    "\11\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\1\21\1\370\7\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\4\21\1\273\4\21\3\0"+
+    "\2\21\1\371\4\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\11\131\1\0\11\131\1\0"+
+    "\37\131\1\372\41\131\1\0\11\131\1\0\44\131\1\372"+
+    "\23\131\31\0\1\373\62\0\2\20\3\264\1\20\1\264"+
+    "\1\0\2\20\1\374\10\20\3\0\7\20\20\0\2\20"+
+    "\1\0\23\20\1\0\1\20\2\0\1\20\4\0\3\20"+
+    "\2\265\2\20\1\0\2\20\1\375\10\20\3\0\7\20"+
+    "\20\0\2\20\1\0\23\20\1\0\1\20\2\0\1\20"+
+    "\4\0\2\20\3\266\1\20\1\266\1\0\2\20\1\376"+
+    "\10\20\3\0\7\20\20\0\2\20\1\0\23\20\1\0"+
+    "\1\20\2\0\1\20\4\0\1\20\1\377\5\267\1\0"+
+    "\2\20\4\377\3\267\2\377\3\0\1\267\3\377\1\267"+
+    "\1\377\1\267\20\0\2\20\1\0\2\267\1\377\1\267"+
+    "\2\377\1\267\6\377\1\267\5\377\1\0\1\377\2\0"+
+    "\1\377\4\0\1\20\6\21\1\0\2\20\4\21\1\u0100"+
+    "\4\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\15\21\1\u0101"+
+    "\2\21\1\u0102\2\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\1\21\1\u0102\7\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\3\21\1\212\3\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\2\21\1\u0103\1\u0104\5\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\4\21\1\u0105\2\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\7\21"+
+    "\20\0\2\20\1\0\15\21\1\u0106\5\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\11\21"+
+    "\3\0\7\21\20\0\2\20\1\0\11\21\1\212\11\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\3\21\1\u0107\5\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\10\21\1\u0108\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\4\21\1\u0102"+
+    "\2\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\2\21\1\u0109"+
+    "\6\21\3\0\2\21\1\214\4\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\4\21\1\363\4\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\4\21\1\u010a\4\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\4\21\1\212"+
+    "\4\21\3\0\2\21\1\u010a\4\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\3\21\1\u010b\5\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\7\21\20\0"+
+    "\2\20\1\0\15\21\1\u0102\5\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\1\21\1\324"+
+    "\7\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\7\21\1\u0102\1\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\10\21\1\270\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\7\21\20\0\2\20"+
+    "\1\0\14\21\1\u0102\1\21\1\353\4\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\4\21"+
+    "\1\u010c\4\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\11\21\3\0\7\21\20\0\2\20\1\0\11\21"+
+    "\1\u010d\11\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\6\21\1\u010e\2\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\1\u010f"+
+    "\6\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\20\21\1\u0102\2\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\6\21\1\u0110\2\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\3\21\1\302\3\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\7\21\7\0"+
+    "\1\u0111\10\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\4\21\1\u0112"+
+    "\4\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\4\21\1\u0113\1\212\3\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\4\21\1\321\4\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\1\21\1\u0114\7\21"+
+    "\3\0\7\21\20\0\2\20\1\0\15\21\1\u0115\5\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\11\21\3\0\2\21\1\u0116\4\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\2\21\1\272\4\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\33\0\1\u0117\64\0\1\20\6\21\1\0\2\20\6\21"+
+    "\1\u0118\2\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\11\21\3\0\2\21\1\273\4\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\4\21\1\357\2\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\10\21\1\u0102\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\1\322\6\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\11\21"+
+    "\3\0\1\324\6\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\2\21\1\u0119\6\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\1\21\1\212\7\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\2\21\1\u011a"+
+    "\4\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\30\0\1\345\60\0\1\347\1\350\3\0\1\351"+
+    "\70\0\1\u011b\60\0\1\u011c\113\0\1\u011d\113\0\1\u011e"+
+    "\57\0\1\20\6\21\1\0\2\20\11\21\3\0\7\21"+
+    "\20\0\2\20\1\0\4\21\1\u011f\16\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\6\21"+
+    "\1\272\2\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\4\21\1\u0120\4\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\6\21\1\u0121\2\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\3\21"+
+    "\1\u0102\3\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\11\21"+
+    "\3\0\2\21\1\u0122\4\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\11\21\3\0\7\21\20\0\2\20\1\0\15\21"+
+    "\1\u0123\5\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\7\21\1\u0124\1\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\4\21\1\212\4\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\10\21"+
+    "\1\u010e\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\16\21\1\u0125"+
+    "\1\21\1\324\2\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\3\21\1\371\5\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\7\21\1\u0126"+
+    "\1\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\3\21\1\u0127\3\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\10\21\1\u0102\3\0\7\21\20\0\2\20"+
+    "\1\0\15\21\1\u0102\5\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\7\21\1\362\1\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\36\0\1\u0128\61\0\1\20\6\21\1\0"+
+    "\2\20\4\21\1\u0129\4\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\7\21\20\0\2\20"+
+    "\1\0\17\21\1\212\3\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\2\21\1\273\6\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\7\21"+
+    "\1\u012a\1\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\3\21\1\362\5\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\2\21\1\u012b\4\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\4\21\1\u0102\4\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\6\21"+
+    "\1\u012c\2\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\5\21\1\212\3\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\2\21\1\362\6\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\5\21"+
+    "\1\332\1\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\7\21"+
+    "\1\u012d\1\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\10\21\1\212\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\4\21\1\u012e\2\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\7\21\1\u012f\1\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\2\21\1\212"+
+    "\6\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\15\21\1\272"+
+    "\5\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\4\21\1\u0130\4\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\6\21\1\u0131\2\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\3\21\1\u0132\3\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\34\0\1\u0133\63\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\7\21\20\0\2\20\1\0"+
+    "\14\21\1\212\6\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\6\21\1\u0134\2\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\3\21\1\u0135\3\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\67\0\1\u0136\4\0\1\u0137\112\0"+
+    "\1\u0138\113\0\1\u0139\113\0\1\u013a\24\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\7\21\20\0\2\20\1\0"+
+    "\5\21\1\212\15\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\1\21\1\u0124"+
+    "\5\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\17\21\1\u0102\3\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\3\21\1\u013b\3\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\7\21\20\0\2\20\1\0"+
+    "\21\21\1\u0102\1\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\4\21\1\u013c\4\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\20\21\1\324\2\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\4\21\1\212\2\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\1\21\1\u013d\7\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\1\u013e\10\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\2\21"+
+    "\1\u013f\4\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\2\21"+
+    "\1\u0108\6\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\11\21\3\0\7\21\20\0\2\20\1\0\15\21"+
+    "\1\u0101\5\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\7\21\20\0\2\20"+
+    "\1\0\11\21\1\u0140\11\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\6\21\1\u0102\2\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\1\u0141"+
+    "\10\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\16\21\1\u0102"+
+    "\4\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\7\21\1\312\1\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\1\21\1\u0142\7\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\35\0\1\u0143\62\0\1\20\6\21\1\0\2\20"+
+    "\1\21\1\u0144\7\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\4\21\1\u0126\4\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\67\0"+
+    "\1\u0145\4\0\1\u0146\106\0\1\u0147\4\0\1\u0148\106\0"+
+    "\1\u0149\4\0\1\u014a\23\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\1\21\1\u0102\5\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\2\21\1\u0102\6\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\5\21\1\u0102\3\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\13\21\1\u014b\7\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\3\21\1\u014c\3\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\6\21\1\302\2\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\7\21\20\0"+
+    "\2\20\1\0\13\21\1\u014d\7\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\11\21\1\u014e\11\21\1\0"+
+    "\1\21\2\0\1\21\111\0\1\u0136\113\0\1\u0137\114\0"+
+    "\1\u014f\113\0\1\u0150\117\0\1\u0136\113\0\1\u0137\1\0"+
+    "\1\20\6\21\1\0\2\20\6\21\1\u013c\2\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\4\21\1\u0151"+
+    "\4\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\6\21\1\u0152\2\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\2\21\1\u0153\6\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\2\21\1\u0154\6\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\u0111\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\2\21\1\u0155\4\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\6\21\1\u0156\2\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\1\u0157\6\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\7\21\1\u0158\1\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\4\21\1\337\4\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[22192];
+    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 =
+    "\17\0\4\1\1\11\11\1\1\11\10\1\1\11\2\1"+
+    "\1\11\24\1\3\11\2\1\2\11\1\1\1\11\1\1"+
+    "\1\11\1\1\1\11\1\1\1\11\1\1\1\11\1\1"+
+    "\1\11\2\1\2\11\1\1\2\11\1\1\1\11\1\1"+
+    "\2\11\1\1\1\11\1\1\1\11\40\1\1\0\17\1"+
+    "\1\0\6\11\4\1\1\11\1\0\20\1\2\11\2\1"+
+    "\1\0\47\1\1\0\11\1\5\0\21\1\1\0\25\1"+
+    "\1\11\5\1\1\0\3\1\4\0\11\1\1\11\12\1"+
+    "\1\0\2\1\2\11\3\0\10\1\1\11\1\1\6\0"+
+    "\4\1\2\11\10\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[344];
+    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;
+
+  /* user code: */
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_UNQUOTED			= -1;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an single quoted EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_SINGLE_QUOTED		= -2;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an double quoted EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_DOUBLE_QUOTED		= -3;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_UNQUOTED			= -4;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an single quoted EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_SINGLE_QUOTED		= -5;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an double quoted EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_DOUBLE_QUOTED		= -6;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q!...! style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_BANG				= -7;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q{...} style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_CURLY_BRACE		= -8;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q<...> style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_LT					= -9;
+
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q(...) style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_PAREN					= -10;
+
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q/.../ style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_SLASH				= -11;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q[...] style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_SQUARE_BRACKET		= -12;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public RubyTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * 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) {
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR_LITERAL;
+				start = text.offset;
+				break;
+			case Token.LITERAL_BACKQUOTE:
+				state = BACKTICKS;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_UNQUOTED:
+				state = HEREDOC_EOF_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_SINGLE_QUOTED:
+				state = HEREDOC_EOF_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_DOUBLE_QUOTED:
+				state = HEREDOC_EOF_DOUBLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_UNQUOTED:
+				state = HEREDOC_EOT_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_SINGLE_QUOTED:
+				state = HEREDOC_EOT_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_DOUBLE_QUOTED:
+				state = HEREDOC_EOT_DOUBLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_BANG:
+				state = STRING_Q_BANG;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_CURLY_BRACE:
+				state = STRING_Q_CURLY_BRACE;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_LT:
+				state = STRING_Q_LT;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_PAREN:
+				state = STRING_Q_PAREN;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_SLASH:
+				state = STRING_Q_SLASH;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_SQUARE_BRACKET:
+				state = STRING_Q_SQUARE_BRACKET;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+		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 RubyTokenMaker(java.io.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 RubyTokenMaker(java.io.InputStream in) {
+    this(new java.io.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;
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 39: 
+          { start = zzMarkedPos-yylength(); yybegin(STRING_Q_LT);
+          }
+        case 52: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 53: break;
+        case 45: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 54: break;
+        case 32: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken;
+          }
+        case 55: break;
+        case 19: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_PAREN); return firstToken;
+          }
+        case 56: break;
+        case 18: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_CURLY_BRACE); return firstToken;
+          }
+        case 57: break;
+        case 20: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SLASH); return firstToken;
+          }
+        case 58: break;
+        case 46: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+3, Token.COMMENT_DOCUMENTATION);
+          }
+        case 59: break;
+        case 10: 
+          { start = zzMarkedPos-1; yybegin(STRING);
+          }
+        case 60: break;
+        case 44: 
+          { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; }
+          }
+        case 61: break;
+        case 9: 
+          { addToken(Token.FUNCTION);
+          }
+        case 62: break;
+        case 22: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_LT); return firstToken;
+          }
+        case 63: break;
+        case 42: 
+          { addToken(Token.VARIABLE);
+          }
+        case 64: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 65: break;
+        case 31: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken;
+          }
+        case 66: break;
+        case 4: 
+          { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 67: break;
+        case 41: 
+          { start = zzMarkedPos-yylength(); yybegin(STRING_Q_CURLY_BRACE);
+          }
+        case 68: break;
+        case 50: 
+          { start = zzStartRead; yybegin(HEREDOC_EOF_SINGLE_QUOTED);
+          }
+        case 69: break;
+        case 51: 
+          { start = zzStartRead; yybegin(HEREDOC_EOT_SINGLE_QUOTED);
+          }
+        case 70: break;
+        case 47: 
+          { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED);
+          }
+        case 71: break;
+        case 14: 
+          { /* Skip escaped chars. */
+          }
+        case 72: break;
+        case 25: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+          }
+        case 73: break;
+        case 43: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 74: break;
+        case 28: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken;
+          }
+        case 75: break;
+        case 6: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 76: break;
+        case 17: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_BANG); return firstToken;
+          }
+        case 77: break;
+        case 35: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 78: break;
+        case 11: 
+          { start = zzMarkedPos-1; yybegin(CHAR_LITERAL);
+          }
+        case 79: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 80: break;
+        case 38: 
+          { start = zzMarkedPos-yylength(); yybegin(STRING_Q_SLASH);
+          }
+        case 81: break;
+        case 27: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE);
+          }
+        case 82: break;
+        case 16: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 83: break;
+        case 37: 
+          { start = zzMarkedPos-yylength(); yybegin(STRING_Q_BANG);
+          }
+        case 84: break;
+        case 23: 
+          { /* Skip escaped single quotes only, but this should still work. */
+          }
+        case 85: break;
+        case 30: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken;
+          }
+        case 86: break;
+        case 49: 
+          { start = zzMarkedPos-6; yybegin(DOCCOMMENT);
+          }
+        case 87: break;
+        case 34: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 88: break;
+        case 26: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+          }
+        case 89: break;
+        case 36: 
+          { start = zzMarkedPos-yylength(); yybegin(STRING_Q_SQUARE_BRACKET);
+          }
+        case 90: break;
+        case 8: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 91: break;
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 92: break;
+        case 21: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SQUARE_BRACKET); return firstToken;
+          }
+        case 93: break;
+        case 40: 
+          { start = zzMarkedPos-yylength(); yybegin(STRING_Q_PAREN);
+          }
+        case 94: break;
+        case 7: 
+          { addToken(Token.OPERATOR);
+          }
+        case 95: break;
+        case 24: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+          }
+        case 96: break;
+        case 33: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 97: break;
+        case 48: 
+          { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED);
+          }
+        case 98: break;
+        case 12: 
+          { start = zzMarkedPos-1; yybegin(BACKTICKS);
+          }
+        case 99: break;
+        case 13: 
+          { 
+          }
+        case 100: break;
+        case 15: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 101: break;
+        case 29: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken;
+          }
+        case 102: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case HEREDOC_EOF_SINGLE_QUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken;
+            }
+            case 345: break;
+            case DOCCOMMENT: {
+              yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken;
+            }
+            case 346: break;
+            case HEREDOC_EOT_SINGLE_QUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken;
+            }
+            case 347: break;
+            case HEREDOC_EOT_UNQUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken;
+            }
+            case 348: break;
+            case STRING_Q_SLASH: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SLASH); return firstToken;
+            }
+            case 349: break;
+            case STRING_Q_BANG: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_BANG); return firstToken;
+            }
+            case 350: break;
+            case STRING_Q_LT: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_LT); return firstToken;
+            }
+            case 351: break;
+            case STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 352: break;
+            case BACKTICKS: {
+              addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+            }
+            case 353: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 354: break;
+            case HEREDOC_EOF_UNQUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken;
+            }
+            case 355: break;
+            case STRING_Q_CURLY_BRACE: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_CURLY_BRACE); return firstToken;
+            }
+            case 356: break;
+            case STRING_Q_PAREN: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_PAREN); return firstToken;
+            }
+            case 357: break;
+            case CHAR_LITERAL: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+            }
+            case 358: break;
+            case STRING_Q_SQUARE_BRACKET: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SQUARE_BRACKET); return firstToken;
+            }
+            case 359: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.flex
new file mode 100644
index 0000000..161c05a
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.flex
@@ -0,0 +1,675 @@
+/*
+ * 02/25/2005
+ *
+ * SASTokenMaker.java - Scanner for SAS files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class generates tokens representing a text stream as SAS.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated SASTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class SASTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public SASTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "*", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * 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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+	}
+
+
+%}
+
+LineTerminator		= ([\n])
+Letter			= ([A-Za-z_])
+Digit			= ([0-9])
+Whitespace		= ([ \t]+)
+Semicolon			= ([;])
+
+Identifier		= (({Letter}|{Digit})+)
+MacroVariable		= (&{Identifier})
+
+Operators1		= ("+"|"-"|"*"|"/"|"^"|"|")
+Operators2		= (([\^\~]?=)|(">"[=]?)|("<"[=]?))
+Operators3		= ("eq"|"ne"|"gt"|"lt"|"ge"|"le"|"in")
+Operator			= ({Operators1}|{Operators2}|{Operators3})
+Separator			= ([\(\)])
+
+StringBoundary		= (\")
+CharBoundary		= (\')
+
+LineCommentBegin	= ("*")
+MLCBegin			= ("/*")
+MLCEnd			= ("*/")
+
+%state STRING
+%state CHAR
+%state MLC
+
+%%
+
+<YYINITIAL>  {
+
+	/* Keywords */
+	"_all_" |
+	"_character_" |
+	"_data_" |
+	"_infile_" |
+	"_last_" |
+	"_null_" |
+	"_numeric_" |
+	"_page_" |
+	"_temporary_" |
+	"abend" |
+	"abort" |
+	"all" |
+	"alter" |
+	"and" |
+	"array" |
+	"as" |
+	"ascending" |
+	"attrib" |
+	"axis" |
+	"bell" |
+	"blank" |
+	"border" |
+	"bounds" |
+	"by" |
+	"call" |
+	"cancel" |
+	"cards" |
+	"cards4" |
+	"choro" |
+	"class" |
+	"classes" |
+	"clear" |
+	"close" |
+	"compute" |
+	"contrast" |
+	"coord" |
+	"coordinates" |
+	"cov" |
+	"create" |
+	"data" |
+	"datalines" |
+	"datalines4" |
+	"delete" |
+	"descending" |
+	"describe" |
+	"discrete" |
+	"disk" |
+	"display" |
+	"dm" |
+	"do" |
+	"drop" |
+	"dummy" |
+	"else" |
+	"end" |
+	"endrsubmit" |
+	"endsas" |
+	"error" |
+	"except" |
+	"expandtabs" |
+	"factors" |
+	"file" |
+	"filename" |
+	"flowover" |
+	"footnote" |
+	"frame" |
+	"freq" |
+	"from" |
+	"go" |
+	"goption" |
+	"goptions" |
+	"goto" |
+	"grid" |
+	"group" |
+	"groupby" |
+	"groupformat" |
+	"having" |
+	"haxis" |
+	"hbar" |
+	"heading" |
+	"high" |
+	"html" |
+	"id" |
+	"if" |
+	"infile" |
+	"informat" |
+	"inner" |
+	"input" |
+	"insert" |
+	"intersect" |
+	"keep" |
+	"keylabel" |
+	"label" |
+	"lable" |
+	"legend" |
+	"length" |
+	"libname" |
+	"lineqs" |
+	"link" |
+	"list" |
+	"listing" |
+	"log" |
+	"lostcard" |
+	"low" |
+	"mark" |
+	"matings" |
+	"mean" |
+	"merge" |
+	"missing" |
+	"missover" |
+	"mod" |
+	"model" |
+	"modify" |
+	"n" |
+	"nocell" |
+	"nocharacters" |
+	"nodupkey" |
+	"noexpandtabs" |
+	"noframe" |
+	"noheading" |
+	"noinput" |
+	"nolegend" |
+	"nopad" |
+	"noprint" |
+	"nosharebuffers" |
+	"not" |
+	"note" |
+	"notitle" |
+	"notitles" |
+	"notsorted" |
+	"ods" |
+	"old" |
+	"option" |
+	"or" |
+	"order" |
+	"orderby" |
+	"other" |
+	"otherwise" |
+	"outer" |
+	"output" |
+	"over" |
+	"overlay" |
+	"overprint" |
+	"pad" |
+	"pageby" |
+	"pagesize" |
+	"parmcards" |
+	"parmcards4" |
+	"parms" |
+	"pattern" |
+	"pct" |
+	"pctn" |
+	"pctsum" |
+	"picture" |
+	"pie" |
+	"pie3d" |
+	"plotter" |
+	"predict" |
+	"prefix" |
+	"printer" |
+	"proc" |
+	"ps" |
+	"put" |
+	"quit" |
+	"random" |
+	"range" |
+	"remove" |
+	"rename" |
+	"response" |
+	"replace" |
+	"reset" |
+	"retain" |
+	"return" |
+	"rsubmit" |
+	"run" |
+	"s2" |
+	"select" |
+	"set" |
+	"sharebuffers" |
+	"signoff" |
+	"signon" |
+	"sim" |
+	"skip" |
+	"source2" |
+	"startsas" |
+	"std" |
+	"stop" |
+	"stopover" |
+	"strata" |
+	"sum" |
+	"sumby" |
+	"supvar" |
+	"symbol" |
+	"table" |
+	"tables" |
+	"tape" |
+	"terminal" |
+	"test" |
+	"then" |
+	"time" |
+	"title" |
+	"to" |
+	"transform" |
+	"treatments" |
+	"truncover" |
+	"unbuf" |
+	"unbuffered" |
+	"union" |
+	"until" |
+	"update" |
+	"validate" |
+	"value" |
+	"var" |
+	"variables" |
+	"vaxis" |
+	"vbar" |
+	"weight" |
+	"when" |
+	"where" |
+	"while" |
+	"with" |
+	"window" |
+	"x"				{ addToken(Token.RESERVED_WORD); }
+
+	/* Base SAS procs. */
+	"append" |
+	"calendar" |
+	"catalog" |
+	"chart" |
+	"cimport" |
+	"compare" |
+	"contents" |
+	"copy" |
+	"cpm" |
+	"cport" |
+	"datasets" |
+	"display" |
+	"explode" |
+	"export" |
+	"fontreg" |
+	"format" |
+	"forms" |
+	"fslist" |
+	"import" |
+	"means" |
+	"migrate" |
+	"options" |
+	"optload" |
+	"optsave" |
+	"plot" |
+	"pmenu" |
+	"print" |
+	"printto" |
+	"proto" |
+	"prtdef" |
+	"prtexp" |
+	"pwencode" |
+	"rank" |
+	"registry" |
+	"report" |
+	"sort" |
+	"sql" |
+	"standard" |
+	"summary" |
+	"tabulate" |
+	"template" |
+	"timeplot" |
+	"transpose"			{ addToken(Token.DATA_TYPE); }
+
+	/* SAS/STAT procs. */
+	"corr" |
+	"freq" |
+	"univariate"			{ addToken(Token.DATA_TYPE); }
+
+	/* Macros. */
+	"%abort" |
+	"%bquote" |
+	"%by" |
+	"%cms" |
+	"%copy" |
+	"%display" |
+	"%do" |
+	"%else" |
+	"%end" |
+	"%eval" |
+	"%global" |
+	"%go" |
+	"%goto" |
+	"%if" |
+	"%inc" |
+	"%include" |
+	"%index" |
+	"%input" |
+	"%keydef" |
+	"%length" |
+	"%let" |
+	"%local" |
+	"%macro" |
+	"%mend" |
+	"%nrbquote" |
+	"%nrquote" |
+	"%nrstr" |
+	"%put" |
+	"%qscan" |
+	"%qsubstr" |
+	"%qsysfunc" |
+	"%quote" |
+	"%qupcase" |
+	"%scan" |
+	"%str" |
+	"%substr" |
+	"%superq" |
+	"%syscall" |
+	"%sysevalf" |
+	"%sysexec" |
+	"%sysfunc" |
+	"%sysget" |
+	"%sysprod" |
+	"%sysrput" |
+	"%then" |
+	"%to" |
+	"%tso" |
+	"%unquote" |
+	"%until" |
+	"%upcase" |
+	"%while" |
+	"%window"				{ addToken(Token.FUNCTION); }
+
+}
+
+<YYINITIAL> {
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	/* Comments. */
+	/* Do comments before operators as "*" can signify a line comment as */
+	/* well as an operator. */
+	^[ \t]*{LineCommentBegin}		{
+									// We must do this because of how we
+									// abuse JFlex; since we return an entire
+									// list of tokens at once instead of a
+									// single token at a time, the "^" regex
+									// character doesn't really work, so we must
+									// check that we're at the beginning of a
+									// line ourselves.
+									start = zzStartRead;
+									// Might not be any whitespace.
+									if (yylength()>1) {
+										addToken(zzStartRead,zzMarkedPos-2, Token.WHITESPACE);
+										zzStartRead = zzMarkedPos-1;
+									}
+									// Remember:  zzStartRead may now be updated,
+									// so we must check against 'start'.
+									if (start==s.offset) {
+										addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL);
+										addNullToken();
+										return firstToken;
+									}
+									else {
+										addToken(zzStartRead,zzStartRead, Token.OPERATOR);
+									}
+								}
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+
+	/* Do operators before identifiers since some of them are words. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+	{Separator}					{ addToken(Token.SEPARATOR); }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	{MacroVariable}				{ addToken(Token.VARIABLE); }
+	{Semicolon}					{ addToken(Token.IDENTIFIER); }
+
+	{Whitespace}					{ addToken(Token.WHITESPACE); }
+
+	{StringBoundary}				{ start = zzMarkedPos-1; yybegin(STRING); }
+	{CharBoundary}					{ start = zzMarkedPos-1; yybegin(CHAR); }
+
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as OK;    */
+	/* This will include "." from statements like "from lib.dataset". */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+<STRING> {
+
+	[^\n\"]+						{}
+	{LineTerminator}				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+/*	{StringBoundary}{StringBoundary}	{} */
+	{StringBoundary}				{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+
+}
+
+<CHAR> {
+
+	[^\n\']+						{}
+	{LineTerminator}				{ yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+/*	{CharBoundary}{CharBoundary}		{} */
+	{CharBoundary}					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+
+}
+
+<MLC> {
+
+	[^\n\*]+						{}
+	{LineTerminator}				{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}						{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.java
new file mode 100644
index 0000000..bf39a53
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.java
@@ -0,0 +1,1488 @@
+/* The following code was generated by JFlex 1.4.1 on 1/20/09 10:04 AM */
+
+/*
+ * 02/25/2005
+ *
+ * SASTokenMaker.java - Scanner for SAS files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class generates tokens representing a text stream as SAS.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated SASTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class SASTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int STRING = 2;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 6;
+  public static final int CHAR = 4;
+
+  /**
+   * 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,  1,  2,  2,  3,  3,  4, 4
+  };
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\3\1\1\25\0\1\3\1\0\1\23\2\0\1\53\1\4"+
+    "\1\24\2\22\1\6\1\5\1\0\1\5\1\0\1\7\2\2\1\52"+
+    "\1\51\1\45\5\2\1\0\1\0\1\10\1\12\1\10\2\0\1\26"+
+    "\1\42\1\27\1\32\1\13\1\33\1\16\1\30\1\21\1\2\1\44"+
+    "\1\20\1\36\1\15\1\40\1\37\1\14\1\31\1\34\1\17\1\35"+
+    "\1\46\1\47\1\43\1\41\1\50\3\0\1\10\1\25\1\0\1\26"+
+    "\1\42\1\27\1\32\1\13\1\33\1\16\1\30\1\21\1\2\1\44"+
+    "\1\20\1\36\1\15\1\40\1\37\1\14\1\31\1\34\1\17\1\35"+
+    "\1\46\1\47\1\43\1\41\1\50\1\0\1\5\1\0\1\11\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 =
+    "\5\0\1\1\1\2\1\1\1\3\1\1\3\4\3\1"+
+    "\1\5\4\1\1\6\1\7\1\10\15\1\1\5\4\1"+
+    "\1\3\1\11\1\12\1\13\1\14\1\12\1\15\1\16"+
+    "\1\12\1\17\1\12\1\20\1\21\1\4\7\1\1\5"+
+    "\5\1\1\4\3\1\1\4\15\1\1\5\66\1\1\5"+
+    "\14\1\21\0\1\22\1\5\5\1\1\5\66\1\1\23"+
+    "\50\1\1\5\15\1\1\5\1\1\1\5\4\1\1\5"+
+    "\20\1\1\5\3\1\7\0\1\24\2\0\1\24\24\0"+
+    "\21\1\1\5\6\1\1\5\44\1\1\5\1\1\1\5"+
+    "\11\1\1\5\7\1\1\5\4\1\1\23\22\1\1\5"+
+    "\5\1\12\0\1\24\16\0\10\1\1\5\3\1\1\5"+
+    "\13\1\1\5\2\1\1\5\3\1\1\5\23\1\1\5"+
+    "\10\1\1\23\2\5\6\1\16\0\42\1\13\0\17\1"+
+    "\2\0\12\1";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[639];
+    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\54\0\130\0\204\0\260\0\334\0\334\0\u0108"+
+    "\0\u0134\0\u0160\0\334\0\u018c\0\u01b8\0\u01b8\0\u01e4\0\u0210"+
+    "\0\u023c\0\u0268\0\u0294\0\u02c0\0\u02ec\0\334\0\334\0\334"+
+    "\0\u0318\0\u0344\0\u0370\0\u039c\0\u03c8\0\u03f4\0\u0420\0\u044c"+
+    "\0\u0478\0\u04a4\0\u04d0\0\u04fc\0\u0528\0\u0108\0\u0554\0\u0580"+
+    "\0\u05ac\0\u05d8\0\u0604\0\334\0\u0630\0\334\0\334\0\u065c"+
+    "\0\334\0\334\0\u0688\0\334\0\u06b4\0\u0160\0\334\0\u0108"+
+    "\0\u06e0\0\u070c\0\u0738\0\u0764\0\u0790\0\u07bc\0\u07e8\0\u0814"+
+    "\0\u0840\0\u086c\0\u0898\0\u08c4\0\u08f0\0\u091c\0\u0948\0\u0974"+
+    "\0\u09a0\0\u09cc\0\u09f8\0\u0a24\0\u0a50\0\u0a7c\0\u0aa8\0\u0ad4"+
+    "\0\u0b00\0\u0b2c\0\u0b58\0\u0b84\0\u0bb0\0\u0bdc\0\u0c08\0\u0c34"+
+    "\0\u0c60\0\u0c8c\0\u0cb8\0\u0ce4\0\u0d10\0\u0d3c\0\u0d68\0\u0d94"+
+    "\0\u0dc0\0\u0dec\0\u0e18\0\u0e44\0\u0e70\0\u0e9c\0\u0ec8\0\u0ef4"+
+    "\0\u0f20\0\u0f4c\0\u0f78\0\u0fa4\0\u0fd0\0\u0ffc\0\u1028\0\u1054"+
+    "\0\u1080\0\u10ac\0\u10d8\0\u1104\0\u1130\0\u115c\0\u1188\0\u11b4"+
+    "\0\u11e0\0\u120c\0\u1238\0\u1264\0\u1290\0\u12bc\0\u12e8\0\u1314"+
+    "\0\u1340\0\u136c\0\u1398\0\u13c4\0\u13f0\0\u141c\0\u1448\0\u1474"+
+    "\0\u14a0\0\u14cc\0\u14f8\0\u1524\0\u1550\0\u157c\0\u15a8\0\u15d4"+
+    "\0\u1600\0\u162c\0\u1658\0\u1684\0\u16b0\0\u16dc\0\u1708\0\u1734"+
+    "\0\u1760\0\u178c\0\u17b8\0\u17e4\0\u1810\0\u183c\0\u1868\0\u1894"+
+    "\0\u18c0\0\u18ec\0\u1918\0\u1944\0\u1970\0\u199c\0\u19c8\0\u19f4"+
+    "\0\u1a20\0\u1a4c\0\u1a78\0\u1aa4\0\334\0\u1ad0\0\u1afc\0\u1b28"+
+    "\0\u1b54\0\u1b80\0\u1bac\0\u1bd8\0\u1c04\0\u1c30\0\u1c5c\0\u1c88"+
+    "\0\u1cb4\0\u1ce0\0\u1d0c\0\u1d38\0\u1d64\0\u1d90\0\u1dbc\0\u1de8"+
+    "\0\u1e14\0\u1e40\0\u1e6c\0\u1e98\0\u1ec4\0\u1ef0\0\u1f1c\0\u1f48"+
+    "\0\u1f74\0\u1fa0\0\u1fcc\0\u1ff8\0\u2024\0\u2050\0\u207c\0\u20a8"+
+    "\0\u20d4\0\u2100\0\u212c\0\u2158\0\u2184\0\u21b0\0\u21dc\0\u2208"+
+    "\0\u2234\0\u2260\0\u228c\0\u22b8\0\u22e4\0\u2310\0\u233c\0\u2368"+
+    "\0\u2394\0\u23c0\0\u23ec\0\u2418\0\u2444\0\u2470\0\u249c\0\u24c8"+
+    "\0\u24f4\0\u2520\0\u0108\0\u254c\0\u2578\0\u25a4\0\u25d0\0\u25fc"+
+    "\0\u2628\0\u2654\0\u2680\0\u26ac\0\u26d8\0\u2704\0\u2730\0\u275c"+
+    "\0\u2788\0\u27b4\0\u27e0\0\u280c\0\u2838\0\u2864\0\u2890\0\u28bc"+
+    "\0\u28e8\0\u2914\0\u2940\0\u296c\0\u2998\0\u29c4\0\u29f0\0\u2a1c"+
+    "\0\u2a48\0\u2a74\0\u2aa0\0\u2acc\0\u2af8\0\u2b24\0\u2b50\0\u2b7c"+
+    "\0\u2ba8\0\u2bd4\0\u2c00\0\u2c2c\0\u2c58\0\u2c84\0\u2cb0\0\u2cdc"+
+    "\0\u2d08\0\u2d34\0\u2d60\0\u2d8c\0\u2db8\0\u2de4\0\u2e10\0\u2e3c"+
+    "\0\u2e68\0\u2e94\0\u2ec0\0\u2eec\0\u2f18\0\u2f44\0\u2f70\0\u2f9c"+
+    "\0\u2fc8\0\u2ff4\0\u3020\0\u304c\0\u3078\0\u30a4\0\u30d0\0\u30fc"+
+    "\0\u3128\0\u3154\0\u3180\0\u31ac\0\u31d8\0\u3204\0\u3230\0\u325c"+
+    "\0\u3288\0\u32b4\0\u32e0\0\u330c\0\u3338\0\u3364\0\u3390\0\u33bc"+
+    "\0\u33e8\0\u3414\0\u3440\0\u346c\0\u3498\0\u34c4\0\u34f0\0\334"+
+    "\0\u351c\0\u3548\0\u3574\0\u35a0\0\u35cc\0\u35f8\0\u3624\0\u3650"+
+    "\0\u367c\0\u36a8\0\u36d4\0\u3700\0\u372c\0\u3758\0\u3784\0\u37b0"+
+    "\0\u37dc\0\u3808\0\u3834\0\u3860\0\u388c\0\u38b8\0\u38e4\0\u3910"+
+    "\0\u393c\0\u3968\0\u3994\0\u39c0\0\u39ec\0\u3a18\0\u3a44\0\u3a70"+
+    "\0\u3a9c\0\u3ac8\0\u3af4\0\u3b20\0\u3b4c\0\u3b78\0\u3ba4\0\u3bd0"+
+    "\0\u3bfc\0\u3c28\0\u3c54\0\u3c80\0\u26ac\0\u3cac\0\u3cd8\0\u3d04"+
+    "\0\u3d30\0\u3d5c\0\u3d88\0\u3db4\0\u3de0\0\u3e0c\0\u3e38\0\u3e64"+
+    "\0\u3e90\0\u3ebc\0\u3ee8\0\u3f14\0\u3f40\0\u3f6c\0\u3f98\0\u3fc4"+
+    "\0\u3ff0\0\u401c\0\u4048\0\u4074\0\u40a0\0\u40cc\0\u40f8\0\u4124"+
+    "\0\u4150\0\u417c\0\u41a8\0\u41d4\0\u4200\0\u422c\0\u4258\0\u4284"+
+    "\0\u42b0\0\u42dc\0\u4308\0\u1ff8\0\u4334\0\u4360\0\u438c\0\u43b8"+
+    "\0\u43e4\0\u4410\0\u443c\0\u4468\0\u4494\0\u4308\0\u44c0\0\u44ec"+
+    "\0\u4518\0\u4544\0\u4570\0\u459c\0\u45c8\0\u45f4\0\u4620\0\u464c"+
+    "\0\u4678\0\u46a4\0\u46d0\0\u46fc\0\u4728\0\u4754\0\u4780\0\u47ac"+
+    "\0\u47d8\0\u4804\0\u4830\0\u485c\0\u4888\0\u48b4\0\u48e0\0\u490c"+
+    "\0\u4938\0\u4964\0\u4990\0\u49bc\0\u49e8\0\u4a14\0\u4a40\0\u4a6c"+
+    "\0\u4a98\0\u4ac4\0\u4af0\0\u4b1c\0\u4b48\0\u4b74\0\u4ba0\0\u4bcc"+
+    "\0\u4bf8\0\u4c24\0\u4c50\0\u4c7c\0\u4ca8\0\u4cd4\0\u4d00\0\u4d2c"+
+    "\0\u4d58\0\u4d84\0\u4db0\0\u4ddc\0\u4e08\0\u4e34\0\u4e60\0\u4e8c"+
+    "\0\u4eb8\0\u4ee4\0\u4f10\0\u4f3c\0\u4f68\0\u4f94\0\u4fc0\0\u4fec"+
+    "\0\u5018\0\u5044\0\u5070\0\u509c\0\u50c8\0\u50f4\0\u5120\0\u514c"+
+    "\0\u15d4\0\u5178\0\u51a4\0\u51d0\0\u51fc\0\u5228\0\u5254\0\u5280"+
+    "\0\u52ac\0\u52d8\0\u5304\0\u5330\0\u535c\0\u5388\0\u53b4\0\u53e0"+
+    "\0\u540c\0\u5438\0\u5464\0\u5490\0\u54bc\0\u54e8\0\u5514\0\u5540"+
+    "\0\u556c\0\u5598\0\u55c4\0\u55f0\0\u561c\0\u5648\0\u5674\0\u56a0"+
+    "\0\u56cc\0\u56f8\0\u5724\0\u5750\0\u577c\0\u57a8\0\u57d4\0\u5800"+
+    "\0\u582c\0\u5858\0\u5884\0\u58b0\0\u58dc\0\u5908\0\u5934\0\u5960"+
+    "\0\u598c\0\u59b8\0\u59e4\0\u5a10\0\u5a3c\0\u5a68\0\u5a94\0\u5ac0"+
+    "\0\u5aec\0\u5b18\0\u5b44\0\u5b70\0\u5b9c\0\u5bc8\0\u5bf4\0\u5c20"+
+    "\0\u5c4c\0\u5c78\0\u5ca4\0\u5cd0\0\u5cfc\0\u5d28\0\u5d54\0\u5d80"+
+    "\0\u5dac\0\u5dd8\0\u5e04\0\u5e30\0\u5e5c\0\u5e88\0\u5eb4\0\u5ee0"+
+    "\0\u5f0c\0\u5f38\0\u5f64\0\u5f90\0\u5fbc\0\u5fe8\0\u6014\0\u6040"+
+    "\0\u606c\0\u6098\0\u60c4\0\u60f0\0\u611c\0\u6148\0\u6174\0\u61a0"+
+    "\0\u61cc\0\u61f8\0\u6224\0\u6250\0\u627c\0\u62a8\0\u62d4\0\u6300"+
+    "\0\u632c\0\u6358\0\u6384\0\u63b0\0\u63dc\0\u6408\0\u6434\0\u6460"+
+    "\0\u648c\0\u64b8\0\u64e4\0\u6510\0\u653c\0\u6568\0\u6594\0\u65c0"+
+    "\0\u65ec\0\u6618\0\u6644\0\u6670\0\u669c\0\u45f4\0\u66c8\0\u66f4"+
+    "\0\u6720\0\u674c\0\u535c\0\u6778\0\u67a4\0\u67d0\0\u67fc\0\u6828"+
+    "\0\u6854\0\u6880\0\u68ac\0\u68d8\0\u6904\0\u6930\0\u695c";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[639];
+    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\6\1\7\1\10\1\11\1\12\2\13\1\14\1\15"+
+    "\1\16\1\13\1\17\1\20\1\21\1\22\1\23\1\24"+
+    "\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34"+
+    "\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44"+
+    "\1\10\1\45\1\46\1\47\1\10\1\50\1\51\3\10"+
+    "\1\52\1\6\1\7\1\10\1\53\1\12\1\13\1\54"+
+    "\1\14\1\15\1\16\1\13\1\17\1\20\1\21\1\22"+
+    "\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32"+
+    "\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42"+
+    "\1\43\1\44\1\10\1\45\1\46\1\47\1\10\1\50"+
+    "\1\51\3\10\1\52\1\55\1\56\21\55\1\57\30\55"+
+    "\1\60\1\61\22\60\1\62\27\60\1\63\1\64\4\63"+
+    "\1\65\45\63\56\0\1\10\10\0\7\10\3\0\26\10"+
+    "\4\0\1\11\52\0\1\66\10\0\7\66\3\0\26\66"+
+    "\7\0\1\67\57\0\1\13\43\0\1\10\10\0\1\10"+
+    "\1\70\1\71\2\10\1\72\1\10\3\0\4\10\1\73"+
+    "\11\10\1\74\7\10\3\0\1\10\10\0\7\10\3\0"+
+    "\10\10\1\75\15\10\3\0\1\10\10\0\1\70\6\10"+
+    "\3\0\13\10\1\76\12\10\3\0\1\10\10\0\1\70"+
+    "\3\10\1\70\2\10\3\0\4\10\1\77\6\10\1\100"+
+    "\12\10\3\0\1\10\10\0\1\101\5\10\1\102\3\0"+
+    "\1\10\1\103\1\10\1\104\1\105\6\10\1\46\12\10"+
+    "\3\0\1\10\10\0\1\106\3\10\1\70\1\10\1\107"+
+    "\3\0\1\10\1\110\11\10\1\111\12\10\3\0\1\10"+
+    "\10\0\2\10\1\112\4\10\3\0\5\10\2\46\2\10"+
+    "\1\113\14\10\3\0\1\10\10\0\2\10\1\114\1\10"+
+    "\1\115\1\116\1\117\3\0\1\10\1\120\1\121\2\10"+
+    "\1\122\4\10\1\123\13\10\3\0\1\10\10\0\2\10"+
+    "\1\124\1\10\1\125\1\126\1\10\3\0\4\10\1\127"+
+    "\2\10\1\130\2\10\1\131\2\10\1\132\1\133\7\10"+
+    "\3\0\1\10\10\0\5\10\1\134\1\135\3\0\1\10"+
+    "\1\136\1\10\1\137\1\140\5\10\1\141\1\142\12\10"+
+    "\3\0\1\10\10\0\1\143\3\10\1\144\1\10\1\145"+
+    "\3\0\1\10\1\146\13\10\1\147\10\10\3\0\1\10"+
+    "\10\0\1\150\6\10\3\0\1\10\1\151\5\10\1\152"+
+    "\1\153\15\10\3\0\1\10\10\0\1\154\5\10\1\155"+
+    "\3\0\1\10\1\156\2\10\1\157\3\10\1\160\1\46"+
+    "\1\10\1\46\12\10\3\0\1\10\10\0\5\10\1\161"+
+    "\1\162\3\0\1\10\1\163\2\10\1\164\2\10\1\165"+
+    "\3\10\1\166\12\10\3\0\1\10\10\0\1\167\1\170"+
+    "\2\10\1\171\1\10\1\172\3\0\3\10\1\173\4\10"+
+    "\1\174\2\10\1\175\1\176\2\10\1\177\5\10\1\46"+
+    "\3\0\1\10\10\0\2\10\1\200\4\10\3\0\12\10"+
+    "\1\201\13\10\3\0\1\10\10\0\1\202\5\10\1\203"+
+    "\3\0\1\10\1\204\11\10\1\205\12\10\3\0\1\10"+
+    "\10\0\5\10\1\206\1\207\3\0\1\10\1\210\1\211"+
+    "\1\10\1\212\2\10\1\46\1\213\1\214\10\10\1\215"+
+    "\3\10\3\0\1\10\10\0\4\10\1\216\1\124\1\10"+
+    "\3\0\4\10\1\217\1\220\2\10\1\221\1\10\1\222"+
+    "\6\10\1\223\4\10\3\0\1\10\10\0\1\224\4\10"+
+    "\1\225\1\10\3\0\13\10\1\226\1\46\11\10\3\0"+
+    "\1\10\10\0\1\227\6\10\3\0\26\10\3\0\1\10"+
+    "\10\0\7\10\3\0\1\10\1\230\13\10\1\147\10\10"+
+    "\3\0\1\10\10\0\1\231\5\10\1\232\3\0\3\10"+
+    "\1\233\22\10\14\0\1\234\1\235\1\236\1\237\1\240"+
+    "\1\241\1\242\4\0\1\243\1\244\2\0\1\245\1\0"+
+    "\1\246\1\247\1\250\1\251\2\0\1\252\1\0\1\253"+
+    "\2\0\1\254\7\0\1\53\2\0\1\54\45\0\1\55"+
+    "\1\0\21\55\1\0\30\55\1\60\1\0\22\60\1\0"+
+    "\27\60\1\63\1\0\4\63\1\0\45\63\7\0\1\255"+
+    "\46\0\1\10\10\0\7\10\3\0\5\10\1\256\20\10"+
+    "\3\0\1\10\10\0\7\10\3\0\7\10\1\257\16\10"+
+    "\3\0\1\10\10\0\7\10\3\0\4\10\1\260\21\10"+
+    "\3\0\1\10\10\0\7\10\3\0\2\10\1\261\7\10"+
+    "\1\262\13\10\3\0\1\10\10\0\6\10\1\213\3\0"+
+    "\26\10\3\0\1\10\10\0\1\263\3\10\1\264\1\265"+
+    "\1\266\3\0\2\10\1\267\1\270\1\10\1\271\1\272"+
+    "\1\273\2\10\1\274\13\10\3\0\1\10\10\0\6\10"+
+    "\1\124\3\0\13\10\1\275\12\10\3\0\1\10\10\0"+
+    "\4\10\1\276\2\10\3\0\12\10\1\277\13\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\300\2\10\1\213"+
+    "\1\10\1\301\14\10\3\0\1\10\10\0\4\10\1\302"+
+    "\2\10\3\0\11\10\1\303\14\10\3\0\1\10\10\0"+
+    "\7\10\3\0\12\10\1\257\2\10\1\304\10\10\3\0"+
+    "\1\10\10\0\1\153\6\10\3\0\26\10\3\0\1\10"+
+    "\10\0\1\305\6\10\3\0\1\10\1\306\6\10\1\307"+
+    "\15\10\3\0\1\10\10\0\2\10\1\310\1\311\3\10"+
+    "\3\0\26\10\3\0\1\10\10\0\2\10\1\312\4\10"+
+    "\3\0\7\10\1\313\5\10\1\314\10\10\3\0\1\10"+
+    "\10\0\7\10\3\0\15\10\1\315\10\10\3\0\1\10"+
+    "\10\0\3\10\1\46\3\10\3\0\7\10\1\316\12\10"+
+    "\1\46\3\10\3\0\1\10\10\0\2\10\1\317\1\10"+
+    "\1\320\2\10\3\0\6\10\1\321\1\322\2\10\1\323"+
+    "\13\10\3\0\1\10\10\0\7\10\3\0\12\10\1\324"+
+    "\13\10\3\0\1\10\10\0\7\10\3\0\10\10\1\325"+
+    "\15\10\3\0\1\10\10\0\1\326\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\327\24\10"+
+    "\3\0\1\10\10\0\2\10\1\330\4\10\3\0\26\10"+
+    "\3\0\1\10\10\0\5\10\1\331\1\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\3\10\1\332\22\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\333\24\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\334\24\10"+
+    "\3\0\1\10\10\0\7\10\3\0\5\10\1\46\20\10"+
+    "\3\0\1\10\10\0\4\10\1\335\2\10\3\0\26\10"+
+    "\3\0\1\10\10\0\4\10\1\317\1\46\1\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\4\10\1\336"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\2\10\1\337"+
+    "\23\10\3\0\1\10\10\0\7\10\3\0\12\10\1\340"+
+    "\13\10\3\0\1\10\10\0\1\341\6\10\3\0\13\10"+
+    "\1\342\12\10\3\0\1\10\10\0\6\10\1\220\3\0"+
+    "\26\10\3\0\1\10\10\0\1\147\6\10\3\0\1\10"+
+    "\1\343\11\10\1\72\12\10\3\0\1\10\10\0\7\10"+
+    "\3\0\11\10\1\113\14\10\3\0\1\10\10\0\2\10"+
+    "\1\344\1\10\1\345\1\346\1\10\3\0\4\10\1\347"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\1\10\1\350"+
+    "\11\10\1\351\12\10\3\0\1\10\10\0\1\352\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\11\10"+
+    "\1\353\1\10\1\350\12\10\3\0\1\10\10\0\2\10"+
+    "\1\354\4\10\3\0\4\10\1\355\4\10\1\356\1\357"+
+    "\1\360\5\10\1\46\4\10\3\0\1\10\10\0\7\10"+
+    "\3\0\1\10\1\361\24\10\3\0\1\10\10\0\7\10"+
+    "\3\0\11\10\1\362\14\10\3\0\1\10\10\0\3\10"+
+    "\1\363\3\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\16\10\1\133\2\10\1\364\4\10\3\0\1\10"+
+    "\10\0\7\10\3\0\1\10\1\365\24\10\3\0\1\10"+
+    "\10\0\2\10\1\366\1\367\1\370\2\10\3\0\7\10"+
+    "\1\371\1\10\1\372\1\373\13\10\3\0\1\10\10\0"+
+    "\2\10\1\374\4\10\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\10\10\1\375\15\10\3\0\1\10\10\0"+
+    "\2\10\1\46\4\10\3\0\26\10\3\0\1\10\10\0"+
+    "\5\10\1\376\1\10\3\0\7\10\1\377\16\10\3\0"+
+    "\1\10\10\0\7\10\3\0\7\10\1\u0100\16\10\3\0"+
+    "\1\10\10\0\4\10\1\u0101\2\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\13\10\1\u0102\12\10\3\0"+
+    "\1\10\10\0\7\10\3\0\11\10\1\u0103\14\10\3\0"+
+    "\1\10\10\0\7\10\3\0\13\10\1\u0104\12\10\3\0"+
+    "\1\10\10\0\5\10\1\u0105\1\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\2\10\1\u0106\23\10\3\0"+
+    "\1\10\10\0\1\u0107\6\10\3\0\1\10\1\u0108\11\10"+
+    "\1\u0109\12\10\3\0\1\10\10\0\5\10\1\u010a\1\10"+
+    "\3\0\26\10\3\0\1\10\10\0\2\10\1\u010b\4\10"+
+    "\3\0\4\10\1\u010c\6\10\1\u010d\12\10\3\0\1\10"+
+    "\10\0\4\10\1\46\1\u010e\1\10\3\0\26\10\3\0"+
+    "\1\10\10\0\5\10\1\353\1\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\1\10\1\u010f\2\10\1\u0110"+
+    "\1\46\5\10\1\u0111\12\10\3\0\1\10\10\0\3\10"+
+    "\1\u0112\3\10\3\0\11\10\1\46\14\10\3\0\1\10"+
+    "\10\0\7\10\3\0\1\10\1\u0113\24\10\3\0\1\10"+
+    "\10\0\7\10\3\0\11\10\1\u0114\1\u0115\13\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\u0116\3\10\1\u0117"+
+    "\15\10\3\0\1\10\10\0\7\10\3\0\11\10\1\u0118"+
+    "\14\10\3\0\1\10\10\0\6\10\1\u0102\3\0\26\10"+
+    "\3\0\1\10\10\0\4\10\1\u0119\1\10\1\u011a\3\0"+
+    "\15\10\1\u011b\10\10\3\0\1\10\10\0\7\10\3\0"+
+    "\5\10\1\352\20\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u011c\2\10\1\u011d\21\10\3\0\1\10\10\0"+
+    "\3\10\1\u011e\3\10\3\0\7\10\1\u011f\16\10\3\0"+
+    "\1\10\10\0\4\10\1\u0120\2\10\3\0\4\10\1\u0121"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\5\10\1\u0122"+
+    "\20\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u0123"+
+    "\12\10\3\0\1\10\10\0\1\u0124\6\10\3\0\2\10"+
+    "\1\u0125\23\10\3\0\1\10\10\0\3\10\1\u0126\1\u0127"+
+    "\2\10\3\0\4\10\1\u0128\1\46\20\10\3\0\1\10"+
+    "\10\0\4\10\1\u0129\2\10\3\0\26\10\3\0\1\10"+
+    "\10\0\1\u012a\3\10\1\u012b\1\10\1\u012c\3\0\13\10"+
+    "\1\u012d\12\10\3\0\1\10\10\0\4\10\1\46\2\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\u012e\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\1\u012f\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\3\10\1\u0130\22\10"+
+    "\3\0\1\10\10\0\7\10\3\0\5\10\1\u0131\20\10"+
+    "\3\0\1\10\10\0\7\10\3\0\7\10\1\46\16\10"+
+    "\3\0\1\10\10\0\4\10\1\u0132\2\10\3\0\26\10"+
+    "\3\0\1\10\10\0\4\10\1\u0133\2\10\3\0\26\10"+
+    "\3\0\1\10\10\0\1\u0134\6\10\3\0\26\10\3\0"+
+    "\1\10\10\0\5\10\1\362\1\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\1\10\1\u0135\24\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\u0136\3\10\1\u0137"+
+    "\15\10\3\0\1\10\10\0\1\u0102\6\10\3\0\14\10"+
+    "\1\u0138\11\10\3\0\1\10\10\0\5\10\1\u0139\1\10"+
+    "\3\0\4\10\1\u013a\11\10\1\133\7\10\3\0\1\10"+
+    "\10\0\6\10\1\u013b\3\0\26\10\3\0\1\10\10\0"+
+    "\2\10\1\u013c\1\10\1\363\2\10\3\0\26\10\3\0"+
+    "\1\10\10\0\1\u013d\5\10\1\302\3\0\26\10\16\0"+
+    "\1\u013e\2\0\1\u013f\25\0\1\u0140\41\0\1\u0141\1\u0142"+
+    "\47\0\1\u0143\42\0\1\u0144\17\0\1\u0145\43\0\1\u0146"+
+    "\3\0\1\u0147\3\0\1\u0148\26\0\1\u0149\24\0\1\u014a"+
+    "\30\0\1\u014b\15\0\1\u0148\62\0\1\u014c\47\0\1\u014d"+
+    "\1\0\1\u014e\34\0\1\u014f\16\0\1\u0148\32\0\1\u0150"+
+    "\7\0\1\u0151\5\0\1\u0152\3\0\1\u0153\27\0\1\u0154"+
+    "\21\0\1\u0155\27\0\1\u0156\12\0\1\u0157\62\0\1\u0158"+
+    "\32\0\1\u0159\24\0\1\u0148\25\0\1\u015a\61\0\1\u015b"+
+    "\6\0\1\u015c\25\0\1\10\10\0\7\10\3\0\4\10"+
+    "\1\u015d\2\10\1\u015e\16\10\3\0\1\10\10\0\1\46"+
+    "\6\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\13\10\1\365\12\10\3\0\1\10\10\0\1\u015f\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\5\10\1\u0160\1\10"+
+    "\3\0\1\10\1\u0161\11\10\1\350\12\10\3\0\1\10"+
+    "\10\0\7\10\3\0\16\10\1\u0162\7\10\3\0\1\10"+
+    "\10\0\1\46\5\10\1\u0163\3\0\7\10\1\u0164\16\10"+
+    "\3\0\1\10\10\0\1\u0165\6\10\3\0\26\10\3\0"+
+    "\1\10\10\0\2\10\1\u0166\4\10\3\0\26\10\3\0"+
+    "\1\10\10\0\1\224\6\10\3\0\3\10\1\u0167\22\10"+
+    "\3\0\1\10\10\0\1\143\6\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\10\10\1\u0168\15\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\366\21\10\3\0"+
+    "\1\10\10\0\7\10\3\0\3\10\1\173\22\10\3\0"+
+    "\1\10\10\0\7\10\3\0\1\10\1\124\2\10\1\u0169"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\10\10\1\u016a"+
+    "\15\10\3\0\1\10\10\0\7\10\3\0\13\10\1\46"+
+    "\12\10\3\0\1\10\10\0\4\10\1\u016b\2\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\11\10\1\u016c"+
+    "\14\10\3\0\1\10\10\0\7\10\3\0\12\10\1\u016d"+
+    "\13\10\3\0\1\10\10\0\5\10\1\257\1\10\3\0"+
+    "\26\10\3\0\1\10\10\0\1\u016e\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\5\10\1\u016f\1\10\3\0\10\10"+
+    "\1\u016d\15\10\3\0\1\10\10\0\7\10\3\0\1\10"+
+    "\1\u0170\24\10\3\0\1\10\10\0\2\10\1\u0171\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\2\10\1\u0172\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\3\10\1\u0173\3\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\341\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\1\u0174\6\10\3\0\17\10"+
+    "\1\46\6\10\3\0\1\10\10\0\4\10\1\u0175\2\10"+
+    "\3\0\26\10\3\0\1\10\10\0\2\10\1\366\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\362\4\10\1\257"+
+    "\1\10\3\0\26\10\3\0\1\10\10\0\4\10\1\u0176"+
+    "\2\10\3\0\26\10\3\0\1\10\10\0\1\365\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\u0177\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\6\10\1\302\3\0\13\10"+
+    "\1\u0178\12\10\3\0\1\10\10\0\1\342\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\10\10\1\213"+
+    "\15\10\3\0\1\10\10\0\7\10\3\0\13\10\1\350"+
+    "\12\10\3\0\1\10\10\0\5\10\1\331\1\10\3\0"+
+    "\11\10\1\u0179\14\10\3\0\1\10\10\0\7\10\3\0"+
+    "\11\10\1\u017a\14\10\3\0\1\10\10\0\7\10\3\0"+
+    "\7\10\1\u017b\16\10\3\0\1\10\10\0\7\10\3\0"+
+    "\6\10\1\u017c\17\10\3\0\1\10\10\0\5\10\1\u017d"+
+    "\1\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u017e\24\10\3\0\1\10\10\0\4\10\1\u017f"+
+    "\2\10\3\0\26\10\3\0\1\10\10\0\3\10\1\u0180"+
+    "\3\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\4\10\1\u0181\21\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u0182\24\10\3\0\1\10\10\0\1\u0183\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\u0184\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\2\10\1\124\4\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\4\10\1\213"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\7\10\1\u0185"+
+    "\16\10\3\0\1\10\10\0\7\10\3\0\2\10\1\u0186"+
+    "\23\10\3\0\1\10\10\0\7\10\3\0\1\10\1\u0187"+
+    "\24\10\3\0\1\10\10\0\1\u0188\4\10\1\46\1\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\5\10"+
+    "\1\u0189\20\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+    "\1\u0116\21\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+    "\1\276\21\10\3\0\1\10\10\0\7\10\3\0\1\10"+
+    "\1\u018a\24\10\3\0\1\10\10\0\4\10\1\u018b\2\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+    "\1\353\21\10\3\0\1\10\10\0\7\10\3\0\12\10"+
+    "\1\u018c\13\10\3\0\1\10\10\0\7\10\3\0\14\10"+
+    "\1\353\11\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+    "\1\u018d\21\10\3\0\1\10\10\0\7\10\3\0\5\10"+
+    "\1\364\20\10\3\0\1\10\10\0\5\10\1\46\1\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\3\10"+
+    "\1\46\22\10\3\0\1\10\10\0\6\10\1\u018e\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\4\10\1\46"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\1\10\1\u0108"+
+    "\24\10\3\0\1\10\10\0\6\10\1\u018f\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\u0190\6\10"+
+    "\1\u0191\15\10\3\0\1\10\10\0\1\213\6\10\3\0"+
+    "\12\10\1\u0192\13\10\3\0\1\10\10\0\7\10\3\0"+
+    "\13\10\1\u0193\12\10\3\0\1\10\10\0\5\10\1\u0194"+
+    "\1\10\3\0\13\10\1\350\12\10\3\0\1\10\10\0"+
+    "\3\10\1\257\3\10\3\0\5\10\1\u0195\11\10\1\353"+
+    "\6\10\3\0\1\10\10\0\7\10\3\0\15\10\1\u0196"+
+    "\10\10\3\0\1\10\10\0\1\u018a\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\2\10\1\u0197\23\10"+
+    "\3\0\1\10\10\0\7\10\3\0\2\10\1\u0198\7\10"+
+    "\1\u0199\4\10\1\46\6\10\3\0\1\10\10\0\7\10"+
+    "\3\0\1\10\1\u019a\24\10\3\0\1\10\10\0\7\10"+
+    "\3\0\12\10\1\46\13\10\3\0\1\10\10\0\7\10"+
+    "\3\0\11\10\1\u0182\14\10\3\0\1\10\10\0\7\10"+
+    "\3\0\22\10\1\u019b\3\10\3\0\1\10\10\0\1\u019c"+
+    "\6\10\3\0\26\10\3\0\1\10\10\0\4\10\1\u019d"+
+    "\2\10\3\0\26\10\3\0\1\10\10\0\1\10\1\46"+
+    "\5\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\11\10\1\257\14\10\3\0\1\10\10\0\7\10\3\0"+
+    "\11\10\1\46\14\10\3\0\1\10\10\0\6\10\1\u019e"+
+    "\3\0\26\10\3\0\1\10\10\0\4\10\1\u019f\2\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\11\10"+
+    "\1\u01a0\14\10\3\0\1\10\10\0\4\10\1\u01a1\2\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\u01a2\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\2\10\1\u01a3\4\10\3\0"+
+    "\4\10\1\u01a4\21\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u01a5\24\10\3\0\1\10\10\0\7\10\3\0"+
+    "\12\10\1\u01a6\13\10\3\0\1\10\10\0\2\10\1\u01a7"+
+    "\4\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\4\10\1\u01a8\21\10\3\0\1\10\10\0\7\10\3\0"+
+    "\11\10\1\u01a9\3\10\1\u0182\10\10\3\0\1\10\10\0"+
+    "\7\10\3\0\21\10\1\147\4\10\3\0\1\10\10\0"+
+    "\4\10\1\353\2\10\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\4\10\1\u01aa\21\10\3\0\1\10\10\0"+
+    "\7\10\3\0\15\10\1\u01ab\10\10\3\0\1\10\10\0"+
+    "\6\10\1\362\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\13\10\1\153\5\10\1\u01ac\4\10\3\0\1\10"+
+    "\10\0\7\10\3\0\10\10\1\u01ad\15\10\3\0\1\10"+
+    "\10\0\2\10\1\u01ae\4\10\3\0\26\10\3\0\1\10"+
+    "\10\0\3\10\1\257\3\10\3\0\26\10\3\0\1\10"+
+    "\10\0\7\10\3\0\4\10\1\u01af\21\10\3\0\1\10"+
+    "\10\0\7\10\3\0\7\10\1\u01b0\16\10\3\0\1\10"+
+    "\10\0\6\10\1\u01b1\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\17\10\1\46\6\10\3\0\1\10\10\0"+
+    "\1\362\5\10\1\u01b2\3\0\26\10\3\0\1\10\10\0"+
+    "\4\10\1\u01b3\2\10\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\24\10\1\124\1\10\3\0\1\10\10\0"+
+    "\4\10\1\u01b4\2\10\3\0\26\10\3\0\1\10\10\0"+
+    "\1\u01b5\6\10\3\0\26\10\3\0\1\10\10\0\4\10"+
+    "\1\u01b6\2\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\11\10\1\u01b7\14\10\3\0\1\10\10\0\2\10"+
+    "\1\46\4\10\3\0\7\10\1\u01b8\16\10\3\0\1\10"+
+    "\10\0\7\10\3\0\5\10\1\u01b9\1\u01ba\17\10\3\0"+
+    "\1\10\10\0\1\u01bb\6\10\3\0\5\10\1\u01bc\20\10"+
+    "\3\0\1\10\10\0\2\10\1\u01bd\4\10\3\0\26\10"+
+    "\3\0\1\10\10\0\4\10\1\u01be\2\10\3\0\2\10"+
+    "\1\46\23\10\3\0\1\10\10\0\2\10\1\u01bf\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\2\10\1\u01c0\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\u01c1\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\1\u01c2\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\1\365\6\10\3\0\12\10\1\323"+
+    "\13\10\3\0\1\10\10\0\5\10\1\u01c3\1\u01c4\3\0"+
+    "\7\10\1\u01c5\16\10\3\0\1\10\10\0\7\10\3\0"+
+    "\4\10\1\u01c6\21\10\3\0\1\10\10\0\2\10\1\u0121"+
+    "\4\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\5\10\1\317\20\10\3\0\1\10\10\0\2\10\1\u01c7"+
+    "\4\10\3\0\26\10\3\0\1\10\10\0\5\10\1\u01c8"+
+    "\1\10\3\0\26\10\3\0\1\10\10\0\6\10\1\201"+
+    "\3\0\10\10\1\257\15\10\3\0\1\10\10\0\6\10"+
+    "\1\u01c9\3\0\26\10\3\0\1\10\10\0\3\10\1\u01ca"+
+    "\3\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\5\10\1\u01cb\20\10\3\0\1\10\10\0\2\10\1\46"+
+    "\4\10\3\0\4\10\1\257\21\10\33\0\1\u0148\55\0"+
+    "\1\u01cc\45\0\1\u01cd\54\0\1\u0151\5\0\1\u01ce\3\0"+
+    "\1\u01cf\51\0\1\u0155\1\u01d0\27\0\1\u0159\17\0\1\u01d1"+
+    "\5\0\1\u01d2\51\0\1\u01d3\32\0\1\u0147\47\0\1\u01d4"+
+    "\100\0\1\u0148\30\0\1\u01d5\1\0\1\u0148\63\0\1\u0140"+
+    "\53\0\1\u01d6\2\0\1\u01d7\4\0\1\251\54\0\1\u01d8"+
+    "\47\0\1\u0148\56\0\1\u01d9\50\0\1\u01da\50\0\1\u0148"+
+    "\50\0\1\u01d4\64\0\1\u01db\2\0\1\u01dc\45\0\1\u01dd"+
+    "\33\0\1\u0159\2\0\1\u01de\63\0\1\u01df\41\0\1\u013e"+
+    "\65\0\1\u01e0\43\0\1\u0148\71\0\1\u01e1\57\0\1\u01e2"+
+    "\27\0\1\u01e3\57\0\1\u01e4\34\0\1\10\10\0\7\10"+
+    "\3\0\7\10\1\152\16\10\3\0\1\10\10\0\7\10"+
+    "\3\0\1\10\1\220\24\10\3\0\1\10\10\0\7\10"+
+    "\3\0\12\10\1\213\13\10\3\0\1\10\10\0\7\10"+
+    "\3\0\13\10\1\u01e5\12\10\3\0\1\10\10\0\2\10"+
+    "\1\u01e6\4\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\12\10\1\u01e7\13\10\3\0\1\10\10\0\4\10"+
+    "\1\u01e8\2\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\13\10\1\u01e9\12\10\3\0\1\10\10\0\3\10"+
+    "\1\311\3\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\12\10\1\323\13\10\3\0\1\10\10\0\7\10"+
+    "\3\0\1\10\1\u01ea\24\10\3\0\1\10\10\0\7\10"+
+    "\3\0\12\10\1\u01eb\13\10\3\0\1\10\10\0\6\10"+
+    "\1\u01ec\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\12\10\1\u01ed\13\10\3\0\1\10\10\0\6\10\1\u01ee"+
+    "\3\0\26\10\3\0\1\10\10\0\6\10\1\u01ef\3\0"+
+    "\26\10\3\0\1\10\10\0\5\10\1\u01af\1\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\12\10\1\u01f0"+
+    "\13\10\3\0\1\10\10\0\1\u01f1\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\4\10\1\u01f2\2\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\7\10\1\u01f3\16\10"+
+    "\3\0\1\10\10\0\7\10\3\0\2\10\1\u019b\23\10"+
+    "\3\0\1\10\10\0\4\10\1\363\2\10\3\0\26\10"+
+    "\3\0\1\10\10\0\1\10\1\220\5\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\2\10\1\u01f4\23\10"+
+    "\3\0\1\10\10\0\7\10\3\0\4\10\1\u01f5\21\10"+
+    "\3\0\1\10\10\0\7\10\3\0\4\10\1\u01f6\21\10"+
+    "\3\0\1\10\10\0\1\u01f7\6\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\12\10\1\u01f8\13\10\3\0"+
+    "\1\10\10\0\4\10\1\u017d\2\10\3\0\26\10\3\0"+
+    "\1\10\10\0\6\10\1\u01f9\3\0\26\10\3\0\1\10"+
+    "\10\0\7\10\3\0\1\46\25\10\3\0\1\10\10\0"+
+    "\7\10\3\0\4\10\1\u01fa\21\10\3\0\1\10\10\0"+
+    "\7\10\3\0\1\10\1\u017d\24\10\3\0\1\10\10\0"+
+    "\1\u017d\6\10\3\0\26\10\3\0\1\10\10\0\6\10"+
+    "\1\u01fb\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\14\10\1\46\11\10\3\0\1\10\10\0\2\10\1\361"+
+    "\4\10\3\0\26\10\3\0\1\10\10\0\2\10\1\u01fc"+
+    "\4\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\7\10\1\u01fd\16\10\3\0\1\10\10\0\1\362\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\5\10\1\u01fe\1\10"+
+    "\3\0\26\10\3\0\1\10\10\0\2\10\1\u01ff\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\7\10"+
+    "\1\u0200\16\10\3\0\1\10\10\0\4\10\1\257\2\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\u0201\6\10\3\0"+
+    "\4\10\1\u0202\21\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u0203\6\10\1\u018a\15\10\3\0\1\10\10\0"+
+    "\7\10\3\0\5\10\1\u0204\20\10\3\0\1\10\10\0"+
+    "\2\10\1\u0205\4\10\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\7\10\1\u0206\16\10\3\0\1\10\10\0"+
+    "\6\10\1\153\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\4\10\1\153\21\10\3\0\1\10\10\0\7\10"+
+    "\3\0\13\10\1\u0207\12\10\3\0\1\10\10\0\7\10"+
+    "\3\0\21\10\1\257\4\10\3\0\1\10\10\0\7\10"+
+    "\3\0\1\10\1\u0208\24\10\3\0\1\10\10\0\7\10"+
+    "\3\0\13\10\1\u0109\12\10\3\0\1\10\10\0\7\10"+
+    "\3\0\11\10\1\75\14\10\3\0\1\10\10\0\1\u0183"+
+    "\6\10\3\0\4\10\1\u0209\21\10\3\0\1\10\10\0"+
+    "\7\10\3\0\4\10\1\376\21\10\3\0\1\10\10\0"+
+    "\5\10\1\336\1\10\3\0\26\10\3\0\1\10\10\0"+
+    "\5\10\1\u020a\1\10\3\0\7\10\1\u020b\16\10\3\0"+
+    "\1\10\10\0\7\10\3\0\13\10\1\u020c\12\10\3\0"+
+    "\1\10\10\0\7\10\3\0\13\10\1\u020d\12\10\3\0"+
+    "\1\10\10\0\7\10\3\0\7\10\1\u0116\16\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\u020e\21\10\3\0"+
+    "\1\10\10\0\7\10\3\0\1\10\1\u0116\5\10\1\353"+
+    "\16\10\3\0\1\10\10\0\2\10\1\u020f\4\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\2\10\1\213"+
+    "\23\10\3\0\1\10\10\0\7\10\3\0\5\10\1\u0210"+
+    "\20\10\3\0\1\10\10\0\4\10\1\u0211\2\10\3\0"+
+    "\26\10\3\0\1\10\10\0\4\10\1\u0212\2\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u0213"+
+    "\12\10\3\0\1\10\10\0\1\u0214\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\u0215\24\10"+
+    "\3\0\1\10\10\0\7\10\3\0\2\10\1\u0216\23\10"+
+    "\3\0\1\10\10\0\7\10\3\0\13\10\1\362\12\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\u0217\24\10"+
+    "\3\0\1\10\10\0\7\10\3\0\6\10\1\u0218\17\10"+
+    "\3\0\1\10\10\0\7\10\3\0\7\10\1\353\16\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\u0219\24\10"+
+    "\3\0\1\10\10\0\6\10\1\u018e\3\0\13\10\1\u020c"+
+    "\12\10\3\0\1\10\10\0\2\10\1\u021a\4\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\6\10\1\u0182"+
+    "\17\10\3\0\1\10\10\0\4\10\1\317\2\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\10\10\1\u021b"+
+    "\15\10\3\0\1\10\10\0\7\10\3\0\7\10\1\u021c"+
+    "\5\10\1\u0182\10\10\3\0\1\10\10\0\1\u0191\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\2\10"+
+    "\1\u021d\4\10\1\46\16\10\3\0\1\10\10\0\7\10"+
+    "\3\0\10\10\1\u0109\15\10\3\0\1\10\10\0\6\10"+
+    "\1\u01a2\3\0\26\10\3\0\1\10\10\0\6\10\1\u021e"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\16\10"+
+    "\1\u021f\7\10\3\0\1\10\10\0\1\u0220\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\4\10\1\u0221\2\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\13\10\1\353"+
+    "\12\10\3\0\1\10\10\0\7\10\3\0\10\10\1\353"+
+    "\15\10\3\0\1\10\10\0\7\10\3\0\2\10\1\u0160"+
+    "\23\10\3\0\1\10\10\0\7\10\3\0\4\10\1\u0222"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\4\10\1\u0223"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u0224"+
+    "\12\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u011c"+
+    "\12\10\3\0\1\10\10\0\7\10\3\0\1\10\1\u0225"+
+    "\24\10\3\0\1\10\10\0\5\10\1\336\1\10\3\0"+
+    "\12\10\1\u0226\13\10\3\0\1\10\10\0\7\10\3\0"+
+    "\5\10\1\220\20\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u0227\24\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u0228\24\10\3\0\1\10\10\0\7\10\3\0"+
+    "\3\10\1\213\22\10\3\0\1\10\10\0\7\10\3\0"+
+    "\13\10\1\u0229\12\10\14\0\1\u0148\60\0\1\u0148\75\0"+
+    "\1\u01dc\45\0\1\u022a\36\0\1\u01cc\53\0\1\u0150\50\0"+
+    "\1\u0159\101\0\1\u0140\26\0\1\u0148\54\0\1\u022b\55\0"+
+    "\1\u022c\46\0\1\u022d\71\0\1\u0158\63\0\1\u0148\51\0"+
+    "\1\u022e\27\0\1\u022f\74\0\1\u01d1\32\0\1\u0230\2\0"+
+    "\1\u0231\10\0\1\u0232\1\0\1\u0233\1\0\1\u0234\3\0"+
+    "\1\u0235\35\0\1\u01cd\60\0\1\u013f\56\0\1\u0147\62\0"+
+    "\1\u01d0\45\0\1\u0236\53\0\1\u0237\41\0\1\u01cc\35\0"+
+    "\1\10\10\0\7\10\3\0\5\10\1\u0238\20\10\3\0"+
+    "\1\10\10\0\7\10\3\0\5\10\1\u0239\20\10\3\0"+
+    "\1\10\10\0\7\10\3\0\1\10\1\u0161\24\10\3\0"+
+    "\1\10\10\0\5\10\1\u016f\1\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\u023a\21\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\u023b\21\10\3\0"+
+    "\1\10\10\0\7\10\3\0\17\10\1\u023c\6\10\3\0"+
+    "\1\10\10\0\2\10\1\213\4\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\6\10\1\u023d\6\10\1\u0182"+
+    "\10\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u023e"+
+    "\12\10\3\0\1\10\10\0\2\10\1\u023f\4\10\3\0"+
+    "\26\10\3\0\1\10\10\0\5\10\1\u0240\1\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\11\10\1\u0241"+
+    "\14\10\3\0\1\10\10\0\7\10\3\0\6\10\1\u0242"+
+    "\3\10\1\u0243\13\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u0244\24\10\3\0\1\10\10\0\7\10\3\0"+
+    "\7\10\1\u010e\16\10\3\0\1\10\10\0\7\10\3\0"+
+    "\11\10\1\u0245\14\10\3\0\1\10\10\0\7\10\3\0"+
+    "\4\10\1\u0246\21\10\3\0\1\10\10\0\7\10\3\0"+
+    "\13\10\1\u0247\12\10\3\0\1\10\10\0\5\10\1\u0180"+
+    "\1\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u0248\24\10\3\0\1\10\10\0\7\10\3\0"+
+    "\15\10\1\46\10\10\3\0\1\10\10\0\7\10\3\0"+
+    "\5\10\1\353\20\10\3\0\1\10\10\0\1\220\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\13\10"+
+    "\1\u0249\12\10\3\0\1\10\10\0\7\10\3\0\5\10"+
+    "\1\u024a\20\10\3\0\1\10\10\0\7\10\3\0\20\10"+
+    "\1\46\5\10\3\0\1\10\10\0\2\10\1\u024b\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\1\10"+
+    "\1\u024c\24\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+    "\1\u0238\21\10\3\0\1\10\10\0\6\10\1\u024d\3\0"+
+    "\26\10\3\0\1\10\10\0\3\10\1\46\3\10\3\0"+
+    "\26\10\3\0\1\10\10\0\4\10\1\u0215\2\10\3\0"+
+    "\26\10\3\0\1\10\10\0\2\10\1\72\4\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\2\10\1\257"+
+    "\23\10\3\0\1\10\10\0\6\10\1\u024e\3\0\26\10"+
+    "\3\0\1\10\10\0\6\10\1\u024f\3\0\26\10\3\0"+
+    "\1\10\10\0\1\u024b\6\10\3\0\26\10\3\0\1\10"+
+    "\10\0\7\10\3\0\21\10\1\317\4\10\3\0\1\10"+
+    "\10\0\7\10\3\0\4\10\1\220\21\10\3\0\1\10"+
+    "\10\0\1\u0249\6\10\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\13\10\1\u018a\12\10\3\0\1\10\10\0"+
+    "\7\10\3\0\1\10\1\u0250\24\10\3\0\1\10\10\0"+
+    "\7\10\3\0\7\10\1\u015e\16\10\3\0\1\10\10\0"+
+    "\7\10\3\0\1\10\1\46\24\10\3\0\1\10\10\0"+
+    "\2\10\1\46\4\10\3\0\6\10\1\u0251\17\10\3\0"+
+    "\1\10\10\0\7\10\3\0\15\10\1\u0252\10\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\357\21\10\3\0"+
+    "\1\10\10\0\1\u0253\6\10\3\0\26\10\3\0\1\10"+
+    "\10\0\7\10\3\0\4\10\1\u0254\21\10\3\0\1\10"+
+    "\10\0\7\10\3\0\6\10\1\u0255\17\10\3\0\1\10"+
+    "\10\0\4\10\1\u0238\2\10\3\0\26\10\3\0\1\10"+
+    "\10\0\3\10\1\220\3\10\3\0\26\10\3\0\1\10"+
+    "\10\0\7\10\3\0\4\10\1\257\21\10\3\0\1\10"+
+    "\10\0\6\10\1\u0256\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\1\10\1\u0257\24\10\3\0\1\10\10\0"+
+    "\7\10\3\0\16\10\1\46\7\10\3\0\1\10\10\0"+
+    "\7\10\3\0\12\10\1\353\13\10\3\0\1\10\10\0"+
+    "\7\10\3\0\6\10\1\353\17\10\3\0\1\10\10\0"+
+    "\1\365\3\10\1\u01be\2\10\3\0\26\10\3\0\1\10"+
+    "\10\0\7\10\3\0\22\10\1\u0258\3\10\3\0\1\10"+
+    "\10\0\7\10\3\0\15\10\1\u0182\10\10\3\0\1\10"+
+    "\10\0\7\10\3\0\1\10\1\u01fc\24\10\3\0\1\10"+
+    "\10\0\7\10\3\0\21\10\1\u0238\4\10\3\0\1\10"+
+    "\10\0\7\10\3\0\4\10\1\u0169\21\10\3\0\1\10"+
+    "\10\0\7\10\3\0\15\10\1\u0186\10\10\3\0\1\10"+
+    "\10\0\7\10\3\0\15\10\1\u0259\10\10\3\0\1\10"+
+    "\10\0\7\10\3\0\22\10\1\46\3\10\34\0\1\u0234"+
+    "\37\0\1\u025a\71\0\1\u025b\61\0\1\u0148\30\0\1\u025c"+
+    "\64\0\1\u025d\65\0\1\u025e\2\0\1\u025f\20\0\1\u0158"+
+    "\66\0\1\u0260\64\0\1\251\51\0\1\u0261\47\0\1\u0262"+
+    "\35\0\1\u0263\100\0\1\u0264\15\0\1\10\10\0\1\353"+
+    "\6\10\3\0\26\10\3\0\1\10\10\0\4\10\1\u0265"+
+    "\2\10\3\0\26\10\3\0\1\10\10\0\4\10\1\u0266"+
+    "\2\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u0267\24\10\3\0\1\10\10\0\1\u0182\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\13\10"+
+    "\1\u0178\12\10\3\0\1\10\10\0\2\10\1\u01f1\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\1\10"+
+    "\1\362\24\10\3\0\1\10\10\0\7\10\3\0\13\10"+
+    "\1\u0116\12\10\3\0\1\10\10\0\1\u0268\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u0269"+
+    "\12\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u026a"+
+    "\12\10\3\0\1\10\10\0\7\10\3\0\4\10\1\124"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\1\10\1\213"+
+    "\24\10\3\0\1\10\10\0\6\10\1\u026b\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\4\10\1\u026c\21\10"+
+    "\3\0\1\10\10\0\7\10\3\0\2\10\1\u026d\23\10"+
+    "\3\0\1\10\10\0\3\10\1\353\3\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\355\24\10"+
+    "\3\0\1\10\10\0\4\10\1\u026e\2\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\7\10\1\213\16\10"+
+    "\3\0\1\10\10\0\2\10\1\u026f\4\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\15\10\1\257\10\10"+
+    "\3\0\1\10\10\0\2\10\1\u0270\4\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\4\10\1\u01fc\21\10"+
+    "\3\0\1\10\10\0\7\10\3\0\6\10\1\46\17\10"+
+    "\3\0\1\10\10\0\7\10\3\0\10\10\1\u0271\15\10"+
+    "\3\0\1\10\10\0\7\10\3\0\25\10\1\46\3\0"+
+    "\1\10\10\0\6\10\1\u01af\3\0\26\10\3\0\1\10"+
+    "\10\0\1\u0272\6\10\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\23\10\1\257\2\10\3\0\1\10\10\0"+
+    "\7\10\3\0\4\10\1\347\21\10\3\0\1\10\10\0"+
+    "\6\10\1\72\3\0\26\10\3\0\1\10\10\0\5\10"+
+    "\1\u0273\1\10\3\0\26\10\31\0\1\u0148\55\0\1\u01cc"+
+    "\47\0\1\u01d9\41\0\1\u0148\52\0\1\u0274\66\0\1\u0275"+
+    "\45\0\1\u01cd\50\0\1\u0274\76\0\1\u013e\46\0\1\u0148"+
+    "\67\0\1\u0148\6\0\1\10\10\0\7\10\3\0\1\10"+
+    "\1\u0276\24\10\3\0\1\10\10\0\1\124\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\2\10\1\u0277"+
+    "\23\10\3\0\1\10\10\0\2\10\1\u0278\4\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\4\10\1\u0109"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\7\10\1\u0238"+
+    "\16\10\3\0\1\10\10\0\7\10\3\0\2\10\1\u017d"+
+    "\23\10\3\0\1\10\10\0\7\10\3\0\1\10\1\u0279"+
+    "\24\10\3\0\1\10\10\0\4\10\1\u027a\2\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\1\10\1\u027b"+
+    "\24\10\3\0\1\10\10\0\1\u0189\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\6\10\1\u027c\17\10"+
+    "\3\0\1\10\10\0\7\10\3\0\4\10\1\u0266\21\10"+
+    "\30\0\1\u0148\44\0\1\u0263\35\0\1\10\10\0\7\10"+
+    "\3\0\15\10\1\220\10\10\3\0\1\10\10\0\4\10"+
+    "\1\u027d\2\10\3\0\26\10\3\0\1\10\10\0\4\10"+
+    "\1\220\2\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\4\10\1\u027e\21\10\3\0\1\10\10\0\1\u027f"+
+    "\6\10\3\0\26\10\3\0\1\10\10\0\4\10\1\u0273"+
+    "\2\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\6\10\1\u027d\17\10\3\0\1\10\10\0\1\u020d\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\14\10"+
+    "\1\u017d\11\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+    "\1\u017d\21\10\1\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[27016];
+    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 =
+    "\5\0\2\11\3\1\1\11\12\1\3\11\23\1\1\11"+
+    "\1\1\2\11\1\1\2\11\1\1\1\11\2\1\1\11"+
+    "\144\1\21\0\1\11\220\1\7\0\1\1\2\0\1\11"+
+    "\24\0\157\1\12\0\1\1\16\0\105\1\16\0\42\1"+
+    "\13\0\17\1\2\0\12\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[639];
+    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;
+
+  /** 
+   * 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 SASTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "*", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * 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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public SASTokenMaker(java.io.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 SASTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 180) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      if (zzMarkedPosL > zzStartRead) {
+        switch (zzBufferL[zzMarkedPosL-1]) {
+        case '\n':
+        case '\u000B':
+        case '\u000C':
+        case '\u0085':
+        case '\u2028':
+        case '\u2029':
+          zzAtBOL = true;
+          break;
+        case '\r': 
+          if (zzMarkedPosL < zzEndReadL)
+            zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
+          else if (zzAtEOF)
+            zzAtBOL = false;
+          else {
+            boolean eof = zzRefill();
+            zzMarkedPosL = zzMarkedPos;
+            zzEndReadL = zzEndRead;
+            zzBufferL = zzBuffer;
+            if (eof) 
+              zzAtBOL = false;
+            else 
+              zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
+          }
+          break;
+        default:
+          zzAtBOL = false;
+        }
+      }
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      if (zzAtBOL)
+        zzState = ZZ_LEXSTATE[zzLexicalState+1];
+      else
+        zzState = ZZ_LEXSTATE[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 13: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+          }
+        case 21: break;
+        case 2: 
+          { addNullToken(); return firstToken;
+          }
+        case 22: break;
+        case 18: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 23: break;
+        case 17: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 24: break;
+        case 3: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 25: break;
+        case 8: 
+          { start = zzMarkedPos-1; yybegin(CHAR);
+          }
+        case 26: break;
+        case 5: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 27: break;
+        case 6: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 28: break;
+        case 16: 
+          { addToken(Token.VARIABLE);
+          }
+        case 29: break;
+        case 14: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+          }
+        case 30: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 31: break;
+        case 20: 
+          { addToken(Token.FUNCTION);
+          }
+        case 32: break;
+        case 19: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 33: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 34: break;
+        case 9: 
+          { // We must do this because of how we
+									// abuse JFlex; since we return an entire
+									// list of tokens at once instead of a
+									// single token at a time, the "^" regex
+									// character doesn't really work, so we must
+									// check that we're at the beginning of a
+									// line ourselves.
+									start = zzStartRead;
+									// Might not be any whitespace.
+									if (yylength()>1) {
+										addToken(zzStartRead,zzMarkedPos-2, Token.WHITESPACE);
+										zzStartRead = zzMarkedPos-1;
+									}
+									// Remember:  zzStartRead may now be updated,
+									// so we must check against 'start'.
+									if (start==s.offset) {
+										addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL);
+										addNullToken();
+										return firstToken;
+									}
+									else {
+										addToken(zzStartRead,zzStartRead, Token.OPERATOR);
+									}
+          }
+        case 35: break;
+        case 7: 
+          { start = zzMarkedPos-1; yybegin(STRING);
+          }
+        case 36: break;
+        case 4: 
+          { addToken(Token.OPERATOR);
+          }
+        case 37: break;
+        case 12: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 38: break;
+        case 10: 
+          { 
+          }
+        case 39: break;
+        case 15: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 40: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 640: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 641: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 642: break;
+            case CHAR: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+            }
+            case 643: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.flex
new file mode 100644
index 0000000..19bed03
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.flex
@@ -0,0 +1,463 @@
+/*
+ * 02/15/2005
+ *
+ * SQLTokenMaker.java - Scanner for SQL.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class generates tokens representing a text stream as SQL.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated SQLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class SQLTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public SQLTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.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;
+	}
+
+
+%}
+
+LineTerminator		= ([\n])
+Letter			= ([A-Za-z])
+Digit			= ([0-9])
+Whitespace		= ([ \t]+)
+
+IdentifierStart	= ({Letter})
+IdentifierPart		= ({IdentifierStart}|{Digit}|[_])
+Identifier		= ({IdentifierStart}{IdentifierPart}*)
+
+Operator			= (">="|"<="|"<>"|">"|"<"|"="|"+"|"-"|"*"|"/")
+Separator			= ([\(\)])
+
+Parameter			= ([:]{Identifier})
+
+Integer			= ({Digit}+)
+Float			= (({Digit}+[.]{Digit}*)|([.]{Digit}*))
+ApproxNum			= (({Digit}+[eE][+-]?{Digit}+)|({Digit}+[.]{Digit}*[eE][+-]?[0-9]+)|([.][0-9]*[eE][+-]?[0-9]+))
+
+CommentBegin		= ("--")
+Comment			= ({CommentBegin}.*)
+MLCBegin			= "/*"
+MLCEnd			= "*/"
+
+%state STRING
+%state CHAR
+%state MLC
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"ADD" |
+	"ALL" |
+	"ALTER" |
+	"AND" |
+	"ANY" |
+	"AS" |
+	"ASC" |
+	"AUTOINCREMENT" |
+	"AVA" |
+	"BETWEEN" |
+	"BINARY" |
+	"BIT" |
+	"BOOLEAN" |
+	"BY" |
+	"BYTE" |
+	"CHAR" |
+	"CHARACTER" |
+	"COLUMN" |
+	"CONSTRAINT" |
+	"COUNT" |
+	"COUNTER" |
+	"CREATE" |
+	"CURRENCY" |
+	"DATABASE" |
+	"DATE" |
+	"DATETIME" |
+	"DELETE" |
+	"DESC" |
+	"DISALLOW" |
+	"DISTINCT" |
+	"DISTINCTROW" |
+	"DOUBLE" |
+	"DROP" |
+	"EXISTS" |
+	"FLOAT" |
+	"FLOAT4" |
+	"FLOAT8" |
+	"FOREIGN" |
+	"FROM" |
+	"GENERAL" |
+	"GROUP" |
+	"GUID" |
+	"HAVING" |
+	"INNER" |
+	"INSERT" |
+	"IGNORE" |
+	"IMP" |
+	"IN" |
+	"INDEX" |
+	"INT" |
+	"INTEGER" |
+	"INTEGER1" |
+	"INTEGER2" |
+	"INTEGER4" |
+	"INTO" |
+	"IS" |
+	"JOIN" |
+	"KEY" |
+	"LEFT" |
+	"LEVEL" |
+	"LIKE" |
+	"LOGICAL" |
+	"LONG" |
+	"LONGBINARY" |
+	"LONGTEXT" |
+	"MAX" |
+	"MEMO" |
+	"MIN" |
+	"MOD" |
+	"MONEY" |
+	"NOT" |
+	"NULL" |
+	"NUMBER" |
+	"NUMERIC" |
+	"OLEOBJECT" |
+	"ON" |
+	"OPTION" |
+	"OR" |
+	"ORDER" |
+	"OUTER" |
+	"OWNERACCESS" |
+	"PARAMETERS" |
+	"PASSWORD" |
+	"PERCENT" |
+	"PIVOT" |
+	"PRIMARY" |
+	"REAL" |
+	"REFERENCES" |
+	"RIGHT" |
+	"SELECT" |
+	"SET" |
+	"SHORT" |
+	"SINGLE" |
+	"SMALLINT" |
+	"SOME" |
+	"STDEV" |
+	"STDEVP" |
+	"STRING" |
+	"SUM" |
+	"TABLE" |
+	"TABLEID" |
+	"TEXT" |
+	"TIME" |
+	"TIMESTAMP" |
+	"TOP" |
+	"TRANSFORM" |
+	"TYPE" |
+	"UNION" |
+	"UNIQUE" |
+	"UPDATE" |
+	"USER" |
+	"VALUE" |
+	"VALUES" |
+	"VAR" |
+	"VARBINARY" |
+	"VARCHAR" |
+	"VARP" |
+	"WHERE" |
+	"WITH" |
+	"YESNO"					{ addToken(Token.RESERVED_WORD); }
+
+	/* SQL99 aggregate functions */
+	"AVG" |
+	"COUNT" |
+	"MIN" |
+	"MAX" |
+	"SUM"					{ addToken(Token.FUNCTION); }
+
+	/* SQL99 built-in scalar functions */
+	"CURRENT_DATE" |
+	"CURRENT_TIME" |
+	"CURRENT_TIMESTAMP" |
+	"CURRENT_USER" |
+	"SESSION_USER" |
+	"SYSTEM_USER"			{ addToken(Token.FUNCTION); }
+
+	/* SQL99 numeric scalar functions */
+	"BIT_LENGTH" |
+	"CHAR_LENGTH" |
+	"EXTRACT" |
+	"OCTET_LENGTH" |
+	"POSITION"				{ addToken(Token.FUNCTION); }
+
+	/* SQL99 string functions */
+	"CONCATENATE" |
+	"CONVERT" |
+	"LOWER" |
+	"SUBSTRING" |
+	"TRANSLATE" |
+	"TRIM" |
+	"UPPER"					{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	";"							{ addToken(Token.IDENTIFIER); }
+
+	{Parameter}					{ addToken(Token.IDENTIFIER); }
+
+	{Comment}						{ addToken(Token.COMMENT_EOL); }
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+
+	{Whitespace}					{ addToken(Token.WHITESPACE); }
+
+	{Operator}					{ addToken(Token.OPERATOR); }
+	{Separator}					{ addToken(Token.SEPARATOR); }
+
+	{Integer}						{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{Float}						{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ApproxNum}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+
+	"\""							{ start = zzMarkedPos-1; yybegin(STRING); }
+	"\'"							{ start = zzMarkedPos-1; yybegin(CHAR); }
+
+	"["[^\]]*"]"					{ addToken(Token.PREPROCESSOR); }
+	"["[^\]]*						{ addToken(Token.ERROR_IDENTIFIER); addNullToken(); return firstToken; }
+
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as OK; */
+	/* I don't know enough about SQL to know what's really invalid. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+<STRING> {
+
+	[^\n\"]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	"\"\""				{}
+	"\""					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+
+}
+
+<CHAR> {
+
+	[^\n\']+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+	"\'\'"				{}
+	"\'"					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+
+}
+
+<MLC> {
+
+	[^\n\*]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}				{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*					{}
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.java
new file mode 100644
index 0000000..bf2dd23
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.java
@@ -0,0 +1,1126 @@
+/* The following code was generated by JFlex 1.4.1 on 2/7/09 11:02 AM */
+
+/*
+ * 02/15/2005
+ *
+ * SQLTokenMaker.java - Scanner for SQL.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class generates tokens representing a text stream as SQL.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated SQLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class SQLTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int STRING = 1;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 3;
+  public static final int CHAR = 2;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\4\1\1\25\0\1\4\1\0\1\54\4\0\1\55\2\15"+
+    "\1\13\1\11\1\0\1\12\1\17\1\14\1\3\1\50\1\50\1\3"+
+    "\1\45\3\3\1\46\1\3\1\16\1\0\1\10\1\7\1\6\2\0"+
+    "\1\21\1\37\1\31\1\22\1\20\1\44\1\47\1\41\1\34\1\51"+
+    "\1\52\1\23\1\35\1\26\1\33\1\42\1\53\1\25\1\30\1\24"+
+    "\1\32\1\36\1\40\1\43\1\27\1\2\1\56\1\0\1\57\1\0"+
+    "\1\5\1\0\1\21\1\37\1\31\1\22\1\20\1\44\1\47\1\41"+
+    "\1\34\1\51\1\52\1\23\1\35\1\26\1\33\1\42\1\53\1\25"+
+    "\1\30\1\24\1\32\1\36\1\40\1\43\1\27\1\2\uff85\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 =
+    "\4\0\1\1\1\2\1\1\1\3\1\4\5\5\1\6"+
+    "\1\1\1\7\27\1\1\10\1\11\1\12\1\13\1\14"+
+    "\1\15\1\13\1\16\1\17\1\13\1\20\1\13\1\0"+
+    "\1\21\1\22\4\1\1\23\45\1\2\23\4\1\1\23"+
+    "\7\1\1\23\22\1\1\24\1\13\1\25\1\7\1\0"+
+    "\3\1\1\26\51\1\1\23\4\1\1\23\2\1\1\23"+
+    "\22\1\1\23\4\1\1\23\4\1\1\23\17\1\1\23"+
+    "\35\1\1\23\5\1\1\23\10\1\1\23\5\1\1\23"+
+    "\11\1\1\23\42\1\1\23\4\1\1\23\16\1\1\26"+
+    "\4\1";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[354];
+    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\60\0\140\0\220\0\300\0\300\0\360\0\u0120"+
+    "\0\u0150\0\u0180\0\300\0\u01b0\0\u01e0\0\u0210\0\300\0\u0240"+
+    "\0\u0270\0\u02a0\0\u02d0\0\u0300\0\u0330\0\u0360\0\u0390\0\u03c0"+
+    "\0\u03f0\0\u0420\0\u0450\0\u0480\0\u04b0\0\u04e0\0\u0510\0\u0540"+
+    "\0\u0570\0\u05a0\0\u05d0\0\u0600\0\u0630\0\u0660\0\u0690\0\u06c0"+
+    "\0\300\0\300\0\u06f0\0\u0720\0\300\0\u0750\0\u0780\0\300"+
+    "\0\u07b0\0\u07e0\0\300\0\u0810\0\u0840\0\u0870\0\300\0\u08a0"+
+    "\0\u08d0\0\u0900\0\u0930\0\u0960\0\u0990\0\u09c0\0\u09f0\0\u0a20"+
+    "\0\u0a50\0\u0a80\0\u0ab0\0\u0ae0\0\u0b10\0\u0b40\0\u0b70\0\u0ba0"+
+    "\0\u0bd0\0\u0c00\0\u0c30\0\u0c60\0\u0c90\0\u0cc0\0\u0cf0\0\u0d20"+
+    "\0\u0d50\0\u0d80\0\u0db0\0\u0de0\0\u0e10\0\u0e40\0\u0e70\0\u0ea0"+
+    "\0\u0ed0\0\u0f00\0\u0f30\0\u0f60\0\u0f90\0\u0fc0\0\u0ff0\0\u1020"+
+    "\0\u1050\0\u1080\0\360\0\u10b0\0\u10e0\0\u1110\0\u1140\0\u1170"+
+    "\0\u11a0\0\u11d0\0\u1200\0\u1230\0\u1260\0\u1290\0\u12c0\0\u12f0"+
+    "\0\u1320\0\u1350\0\u1380\0\u13b0\0\u13e0\0\u1410\0\u1440\0\u1470"+
+    "\0\u14a0\0\u14d0\0\u1500\0\u1530\0\u1560\0\u1590\0\u15c0\0\u15f0"+
+    "\0\u1620\0\u1650\0\300\0\300\0\300\0\u1680\0\u1680\0\u16b0"+
+    "\0\u16e0\0\u1710\0\360\0\u1740\0\u0960\0\u1770\0\u17a0\0\u17d0"+
+    "\0\u1800\0\u1830\0\u1860\0\u1890\0\u18c0\0\u18f0\0\u1920\0\u1950"+
+    "\0\u1980\0\u19b0\0\u19e0\0\u1a10\0\u1a40\0\u1a70\0\u1aa0\0\u1ad0"+
+    "\0\u1b00\0\u1b30\0\u1b60\0\u1b90\0\u1bc0\0\u1bf0\0\u1c20\0\u1c50"+
+    "\0\u1c80\0\u1cb0\0\u1ce0\0\u1d10\0\u1d40\0\u1d70\0\u1da0\0\u1dd0"+
+    "\0\u1e00\0\u1e30\0\u1e60\0\u1e90\0\u1ec0\0\u1ef0\0\u1f20\0\u1f50"+
+    "\0\u1f80\0\u1fb0\0\u1fe0\0\u2010\0\u2040\0\u2070\0\u20a0\0\u20d0"+
+    "\0\u2100\0\u2130\0\u2160\0\u2190\0\u21c0\0\u21f0\0\u2220\0\u2250"+
+    "\0\u2280\0\u22b0\0\u22e0\0\u2310\0\u2340\0\u2370\0\u12f0\0\u23a0"+
+    "\0\u23d0\0\u2400\0\u2430\0\u2460\0\u2490\0\u24c0\0\u24f0\0\u2520"+
+    "\0\u2550\0\u2580\0\u25b0\0\u25e0\0\u2610\0\u2640\0\u2670\0\u26a0"+
+    "\0\u26d0\0\u2700\0\u2730\0\u2760\0\u2790\0\u27c0\0\u27f0\0\u2820"+
+    "\0\u2850\0\u2880\0\u28b0\0\u28e0\0\u2910\0\u2940\0\u2970\0\u29a0"+
+    "\0\u29d0\0\u2a00\0\u2a30\0\u2a60\0\u2a90\0\u2ac0\0\u2af0\0\u2b20"+
+    "\0\u2b50\0\u2b80\0\u2bb0\0\u2be0\0\u2c10\0\u2c40\0\u2c70\0\u2ca0"+
+    "\0\u2cd0\0\u2d00\0\u2d30\0\u2d60\0\u2d90\0\u2dc0\0\u2df0\0\u15f0"+
+    "\0\u2e20\0\u2e50\0\u2e80\0\u2eb0\0\u2ee0\0\u0c30\0\u2f10\0\u2f40"+
+    "\0\u2f70\0\u2fa0\0\u2fd0\0\u3000\0\u3030\0\u3060\0\u0ff0\0\u3090"+
+    "\0\u30c0\0\u2040\0\u30f0\0\u3120\0\u2ca0\0\u3150\0\u3180\0\u31b0"+
+    "\0\u31e0\0\u3210\0\u3240\0\u3270\0\u32a0\0\u32d0\0\u3300\0\u3330"+
+    "\0\u3360\0\u3390\0\u33c0\0\u33f0\0\u3420\0\u3450\0\u3480\0\u34b0"+
+    "\0\u34e0\0\u3510\0\u3540\0\u3570\0\u35a0\0\u35d0\0\u3600\0\u3630"+
+    "\0\u3660\0\u3690\0\u36c0\0\u36f0\0\u3720\0\u3750\0\u3780\0\u37b0"+
+    "\0\u37e0\0\u3810\0\u3840\0\u3870\0\u38a0\0\u38d0\0\u3900\0\u3930"+
+    "\0\u3960\0\u3990\0\u39c0\0\u39f0\0\u3a20\0\u3a50\0\u3a80\0\u3ab0"+
+    "\0\u3ae0\0\u3b10\0\u3b40\0\u3b70\0\u3ba0\0\u3bd0\0\u3c00\0\u3c30"+
+    "\0\u3c60\0\u3c90\0\u3cc0\0\u3cf0\0\u3d20\0\u3d50\0\u3d80\0\u3db0"+
+    "\0\u3de0\0\u3e10";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[354];
+    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\5\1\6\1\7\1\10\1\11\1\5\1\12\1\13"+
+    "\1\14\1\13\1\15\1\13\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\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41"+
+    "\1\42\1\43\1\44\1\7\1\45\2\10\1\46\1\10"+
+    "\1\47\1\50\1\7\1\51\1\52\1\53\1\5\1\54"+
+    "\1\55\52\54\1\56\3\54\1\57\1\60\53\57\1\61"+
+    "\2\57\1\62\1\63\11\62\1\64\44\62\62\0\2\7"+
+    "\1\0\1\7\12\0\34\7\7\0\1\10\13\0\1\21"+
+    "\1\65\24\0\2\10\1\0\1\10\13\0\1\11\62\0"+
+    "\1\13\56\0\2\13\62\0\1\66\60\0\1\67\46\0"+
+    "\1\7\15\0\25\7\2\0\1\7\1\0\3\7\7\0"+
+    "\1\21\14\0\1\65\24\0\2\21\1\0\1\21\11\0"+
+    "\2\7\1\0\1\7\12\0\23\7\1\70\10\7\6\0"+
+    "\2\7\1\0\1\7\12\0\2\7\1\71\1\72\2\7"+
+    "\1\73\1\7\1\74\1\7\1\75\3\7\1\76\15\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\77\1\100\3\7"+
+    "\1\101\5\7\1\102\1\103\17\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\104\12\7\1\105\1\106\17\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\107\1\110\3\7\1\111"+
+    "\1\7\1\112\3\7\1\113\1\114\17\7\6\0\2\7"+
+    "\1\0\1\7\12\0\1\115\13\7\1\116\17\7\6\0"+
+    "\2\7\1\0\1\7\12\0\12\7\1\117\1\120\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\121\33\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\122\3\7\1\123\2\7"+
+    "\1\124\2\7\1\125\1\126\1\127\1\130\3\7\1\131"+
+    "\12\7\6\0\2\7\1\0\1\7\12\0\5\7\1\132"+
+    "\4\7\1\133\1\134\5\7\1\135\12\7\6\0\2\7"+
+    "\1\0\1\7\12\0\6\7\1\136\1\7\1\137\11\7"+
+    "\1\140\11\7\6\0\2\7\1\0\1\7\12\0\3\7"+
+    "\1\141\1\7\1\142\1\143\2\7\1\144\1\145\5\7"+
+    "\1\146\1\7\1\147\11\7\6\0\2\7\1\0\1\7"+
+    "\12\0\6\7\1\150\1\7\1\143\4\7\1\113\11\7"+
+    "\1\151\4\7\6\0\2\7\1\0\1\7\12\0\1\152"+
+    "\1\153\11\7\1\154\1\155\17\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\7\1\156\32\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\157\6\7\1\160\3\7\1\161\1\162"+
+    "\17\7\6\0\2\7\1\0\1\7\12\0\14\7\1\163"+
+    "\4\7\1\164\12\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\7\1\165\32\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\166\1\167\3\7\1\170\5\7\1\171\1\172\17\7"+
+    "\6\0\2\7\1\0\1\7\12\0\3\7\1\173\1\7"+
+    "\1\174\5\7\1\175\20\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\176\4\7\1\177\4\7\1\200\21\7\6\0"+
+    "\2\7\1\0\1\7\12\0\13\7\1\201\20\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\202\33\7\4\0\57\53"+
+    "\1\203\1\54\1\0\52\54\1\0\3\54\54\0\1\204"+
+    "\3\0\1\57\1\0\53\57\1\0\2\57\55\0\1\204"+
+    "\2\0\1\62\1\0\11\62\1\0\44\62\14\0\1\205"+
+    "\46\0\1\206\5\0\2\207\32\0\2\206\1\0\1\206"+
+    "\7\0\1\66\1\0\56\66\2\0\2\7\1\0\1\7"+
+    "\12\0\4\7\1\210\7\7\1\211\17\7\6\0\2\7"+
+    "\1\0\1\7\12\0\2\7\1\143\31\7\6\0\2\7"+
+    "\1\0\1\7\12\0\3\7\1\143\1\137\27\7\6\0"+
+    "\2\7\1\0\1\7\12\0\2\7\1\143\4\7\1\143"+
+    "\24\7\6\0\2\7\1\0\1\7\12\0\11\7\1\143"+
+    "\22\7\6\0\2\7\1\0\1\7\12\0\4\7\1\212"+
+    "\27\7\6\0\2\7\1\0\1\7\12\0\1\7\1\143"+
+    "\25\7\1\213\4\7\6\0\2\7\1\0\1\7\12\0"+
+    "\3\7\1\214\4\7\1\215\23\7\6\0\2\7\1\0"+
+    "\1\7\12\0\4\7\1\216\27\7\6\0\2\7\1\0"+
+    "\1\7\12\0\13\7\1\113\20\7\6\0\2\7\1\0"+
+    "\1\7\12\0\12\7\1\217\21\7\6\0\2\7\1\0"+
+    "\1\7\12\0\10\7\1\220\23\7\6\0\2\7\1\0"+
+    "\1\7\12\0\16\7\1\221\5\7\1\120\7\7\6\0"+
+    "\2\7\1\0\1\7\12\0\6\7\1\222\11\7\1\223"+
+    "\6\7\1\224\4\7\6\0\2\7\1\0\1\7\12\0"+
+    "\32\7\1\225\1\7\6\0\2\7\1\0\1\7\12\0"+
+    "\23\7\1\120\10\7\6\0\2\7\1\0\1\7\12\0"+
+    "\17\7\1\226\14\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\7\1\227\12\7\1\230\17\7\6\0\2\7\1\0"+
+    "\1\7\12\0\22\7\1\225\11\7\6\0\2\7\1\0"+
+    "\1\7\12\0\22\7\1\143\11\7\6\0\2\7\1\0"+
+    "\1\7\12\0\15\7\1\231\16\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\7\1\232\22\7\1\233\7\7\6\0"+
+    "\2\7\1\0\1\7\12\0\27\7\1\234\4\7\6\0"+
+    "\2\7\1\0\1\7\12\0\3\7\1\232\11\7\1\235"+
+    "\16\7\6\0\2\7\1\0\1\7\12\0\4\7\1\143"+
+    "\27\7\6\0\2\7\1\0\1\7\12\0\10\7\1\236"+
+    "\23\7\6\0\2\7\1\0\1\7\12\0\3\7\1\237"+
+    "\1\143\3\7\1\240\23\7\6\0\2\7\1\0\1\7"+
+    "\12\0\2\7\1\241\2\7\1\242\26\7\6\0\2\7"+
+    "\1\0\1\7\12\0\10\7\1\243\23\7\6\0\2\7"+
+    "\1\0\1\7\12\0\15\7\1\143\1\7\1\244\14\7"+
+    "\6\0\2\7\1\0\1\7\12\0\15\7\1\225\16\7"+
+    "\6\0\2\7\1\0\1\7\12\0\6\7\1\245\25\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\7\1\246\32\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\247\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\250\33\7\6\0"+
+    "\2\7\1\0\1\7\12\0\5\7\1\251\26\7\6\0"+
+    "\2\7\1\0\1\7\12\0\3\7\1\252\2\7\1\253"+
+    "\3\7\1\254\21\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\7\1\255\32\7\6\0\2\7\1\0\1\7\12\0"+
+    "\14\7\1\256\17\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\257\33\7\6\0\2\7\1\0\1\7\12\0\2\7"+
+    "\1\250\17\7\1\223\11\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\260\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\2\7\1\137\31\7\6\0\2\7\1\0\1\7\12\0"+
+    "\4\7\1\261\27\7\6\0\2\7\1\0\1\7\12\0"+
+    "\4\7\1\137\27\7\6\0\2\7\1\0\1\7\12\0"+
+    "\6\7\1\262\25\7\6\0\2\7\1\0\1\7\12\0"+
+    "\4\7\1\263\27\7\6\0\2\7\1\0\1\7\12\0"+
+    "\2\7\1\264\1\7\1\265\1\7\1\137\1\7\1\266"+
+    "\23\7\6\0\2\7\1\0\1\7\12\0\6\7\1\267"+
+    "\25\7\6\0\2\7\1\0\1\7\12\0\15\7\1\270"+
+    "\16\7\6\0\2\7\1\0\1\7\12\0\23\7\1\143"+
+    "\10\7\6\0\2\7\1\0\1\7\12\0\2\7\1\143"+
+    "\3\7\1\50\25\7\6\0\2\7\1\0\1\7\12\0"+
+    "\6\7\1\143\25\7\6\0\2\7\1\0\1\7\12\0"+
+    "\3\7\1\271\1\7\1\272\26\7\6\0\2\7\1\0"+
+    "\1\7\12\0\4\7\1\273\27\7\6\0\2\7\1\0"+
+    "\1\7\12\0\4\7\1\225\27\7\6\0\2\7\1\0"+
+    "\1\7\12\0\13\7\1\274\20\7\6\0\2\7\1\0"+
+    "\1\7\12\0\4\7\1\275\1\7\1\276\25\7\6\0"+
+    "\2\7\1\0\1\7\12\0\4\7\1\277\27\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\300\33\7\6\0\2\7"+
+    "\1\0\1\7\12\0\16\7\1\242\15\7\6\0\2\7"+
+    "\1\0\1\7\12\0\5\7\1\301\26\7\6\0\2\7"+
+    "\1\0\1\7\12\0\5\7\1\302\2\7\1\303\23\7"+
+    "\6\0\2\7\1\0\1\7\12\0\14\7\1\304\17\7"+
+    "\6\0\2\7\1\0\1\7\12\0\10\7\1\305\23\7"+
+    "\6\0\2\7\1\0\1\7\12\0\16\7\1\306\15\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\307\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\310\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\5\7\1\311\26\7"+
+    "\6\0\2\7\1\0\1\7\12\0\6\7\1\312\25\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\313\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\14\7\1\71\17\7"+
+    "\6\0\2\7\1\0\1\7\12\0\14\7\1\155\17\7"+
+    "\6\0\2\7\1\0\1\7\12\0\7\7\1\143\24\7"+
+    "\7\0\1\206\41\0\2\206\1\0\1\206\11\0\2\7"+
+    "\1\0\1\7\12\0\5\7\1\314\26\7\6\0\2\7"+
+    "\1\0\1\7\12\0\10\7\1\315\23\7\6\0\2\7"+
+    "\1\0\1\7\12\0\13\7\1\316\20\7\6\0\2\7"+
+    "\1\0\1\7\12\0\1\317\33\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\320\1\321\32\7\6\0\2\7\1\0"+
+    "\1\7\12\0\17\7\1\322\14\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\7\1\323\2\7\1\324\27\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\232\33\7\6\0\2\7"+
+    "\1\0\1\7\12\0\27\7\1\325\4\7\6\0\2\7"+
+    "\1\0\1\7\12\0\1\326\33\7\6\0\2\7\1\0"+
+    "\1\7\12\0\14\7\1\327\17\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\143\33\7\6\0\2\7\1\0\1\7"+
+    "\12\0\3\7\1\330\30\7\6\0\2\7\1\0\1\7"+
+    "\12\0\6\7\1\331\25\7\6\0\2\7\1\0\1\7"+
+    "\12\0\15\7\1\213\16\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\332\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\3\7\1\143\30\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\333\33\7\6\0\2\7\1\0\1\7\12\0\21\7"+
+    "\1\120\12\7\6\0\2\7\1\0\1\7\12\0\1\334"+
+    "\16\7\1\137\14\7\6\0\2\7\1\0\1\7\12\0"+
+    "\6\7\1\270\25\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\335\33\7\6\0\2\7\1\0\1\7\12\0\10\7"+
+    "\1\336\23\7\6\0\2\7\1\0\1\7\12\0\1\337"+
+    "\33\7\6\0\2\7\1\0\1\7\12\0\14\7\1\340"+
+    "\17\7\6\0\2\7\1\0\1\7\12\0\4\7\1\341"+
+    "\27\7\6\0\2\7\1\0\1\7\12\0\10\7\1\342"+
+    "\23\7\6\0\2\7\1\0\1\7\12\0\27\7\1\322"+
+    "\4\7\6\0\2\7\1\0\1\7\12\0\3\7\1\343"+
+    "\30\7\6\0\2\7\1\0\1\7\12\0\5\7\1\120"+
+    "\26\7\6\0\2\7\1\0\1\7\12\0\1\7\1\317"+
+    "\32\7\6\0\2\7\1\0\1\7\12\0\5\7\1\344"+
+    "\26\7\6\0\2\7\1\0\1\7\12\0\12\7\1\345"+
+    "\21\7\6\0\2\7\1\0\1\7\12\0\10\7\1\346"+
+    "\1\347\4\7\1\350\15\7\6\0\2\7\1\0\1\7"+
+    "\12\0\6\7\1\351\25\7\6\0\2\7\1\0\1\7"+
+    "\12\0\5\7\1\352\26\7\6\0\2\7\1\0\1\7"+
+    "\12\0\13\7\1\155\17\7\1\353\6\0\2\7\1\0"+
+    "\1\7\12\0\5\7\1\143\26\7\6\0\2\7\1\0"+
+    "\1\7\12\0\13\7\1\354\20\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\355\33\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\356\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\14\7\1\357\17\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\153\33\7\6\0\2\7\1\0\1\7\12\0\1\360"+
+    "\12\7\1\143\20\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\247\33\7\6\0\2\7\1\0\1\7\12\0\13\7"+
+    "\1\300\20\7\6\0\2\7\1\0\1\7\12\0\13\7"+
+    "\1\143\20\7\6\0\2\7\1\0\1\7\12\0\12\7"+
+    "\1\361\21\7\6\0\2\7\1\0\1\7\12\0\11\7"+
+    "\1\362\5\7\1\363\2\7\1\143\11\7\6\0\2\7"+
+    "\1\0\1\7\12\0\20\7\1\364\13\7\6\0\2\7"+
+    "\1\0\1\7\12\0\3\7\1\365\30\7\6\0\2\7"+
+    "\1\0\1\366\12\0\34\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\7\1\367\32\7\6\0\2\7\1\0\1\7"+
+    "\12\0\21\7\1\143\12\7\6\0\2\7\1\0\1\7"+
+    "\12\0\5\7\1\225\26\7\6\0\2\7\1\0\1\7"+
+    "\12\0\11\7\1\370\22\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\7\1\371\32\7\6\0\2\7\1\0\1\7"+
+    "\12\0\10\7\1\372\23\7\6\0\2\7\1\0\1\7"+
+    "\12\0\15\7\1\276\16\7\6\0\2\7\1\0\1\7"+
+    "\12\0\14\7\1\373\17\7\6\0\2\7\1\0\1\7"+
+    "\12\0\13\7\1\120\20\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\7\1\374\32\7\6\0\2\7\1\0\1\7"+
+    "\12\0\15\7\1\143\16\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\375\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\376\33\7\6\0\2\7\1\0\1\7\12\0\12\7"+
+    "\1\113\21\7\6\0\2\7\1\0\1\7\12\0\1\7"+
+    "\1\377\32\7\6\0\2\7\1\0\1\7\12\0\4\7"+
+    "\1\u0100\27\7\6\0\2\7\1\0\1\7\12\0\14\7"+
+    "\1\u0101\17\7\6\0\2\7\1\0\1\7\12\0\4\7"+
+    "\1\u0102\27\7\6\0\2\7\1\0\1\7\12\0\17\7"+
+    "\1\u0103\14\7\6\0\2\7\1\0\1\7\12\0\3\7"+
+    "\1\225\30\7\6\0\2\7\1\0\1\7\12\0\3\7"+
+    "\1\u0104\30\7\6\0\2\7\1\0\1\7\12\0\14\7"+
+    "\1\u0105\17\7\6\0\2\7\1\0\1\7\12\0\4\7"+
+    "\1\u0106\12\7\1\363\14\7\6\0\2\7\1\0\1\7"+
+    "\12\0\5\7\1\213\26\7\6\0\2\7\1\0\1\7"+
+    "\12\0\11\7\1\u0107\22\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\u0108\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\10\7\1\u0109\23\7\6\0\2\7\1\0\1\7\12\0"+
+    "\10\7\1\u010a\23\7\6\0\2\7\1\0\1\7\12\0"+
+    "\5\7\1\u010b\26\7\6\0\2\7\1\0\1\7\12\0"+
+    "\5\7\1\u010c\26\7\6\0\2\7\1\0\1\7\12\0"+
+    "\11\7\1\120\22\7\6\0\2\7\1\0\1\7\12\0"+
+    "\14\7\1\u010d\17\7\6\0\2\7\1\0\1\7\12\0"+
+    "\16\7\1\u010e\15\7\6\0\2\7\1\0\1\7\12\0"+
+    "\6\7\1\u010f\25\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\u0110\33\7\6\0\2\7\1\0\1\7\12\0\4\7"+
+    "\1\u0111\27\7\6\0\2\7\1\0\1\7\12\0\3\7"+
+    "\1\u0112\30\7\6\0\2\7\1\0\1\7\12\0\1\u0113"+
+    "\33\7\6\0\2\7\1\0\1\7\12\0\15\7\1\155"+
+    "\16\7\6\0\2\7\1\0\1\7\12\0\4\7\1\u0114"+
+    "\27\7\6\0\2\7\1\0\1\7\12\0\1\7\1\u0115"+
+    "\32\7\6\0\2\7\1\0\1\7\12\0\1\u0116\33\7"+
+    "\6\0\2\7\1\0\1\7\12\0\4\7\1\u0117\27\7"+
+    "\6\0\2\7\1\0\1\366\12\0\1\7\1\u0118\32\7"+
+    "\6\0\2\7\1\0\1\7\12\0\12\7\1\225\21\7"+
+    "\6\0\2\7\1\0\1\7\12\0\17\7\1\u0119\14\7"+
+    "\6\0\2\7\1\0\1\7\12\0\4\7\1\u011a\27\7"+
+    "\6\0\2\7\1\0\1\7\12\0\5\7\1\u011b\26\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\155\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\27\7\1\u011c\4\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\u011d\33\7\6\0"+
+    "\2\7\1\0\1\7\12\0\21\7\1\u011e\12\7\6\0"+
+    "\2\7\1\0\1\7\12\0\14\7\1\u011f\17\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\u0120\33\7\6\0\2\7"+
+    "\1\0\1\7\12\0\1\u0121\33\7\6\0\2\7\1\0"+
+    "\1\7\12\0\3\7\1\u0122\30\7\6\0\2\7\1\0"+
+    "\1\7\12\0\5\7\1\202\26\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\u0123\33\7\6\0\2\7\1\0\1\7"+
+    "\12\0\15\7\1\u0124\16\7\6\0\2\7\1\0\1\7"+
+    "\12\0\20\7\1\u0125\13\7\6\0\2\7\1\0\1\7"+
+    "\12\0\4\7\1\u0126\27\7\6\0\2\7\1\0\1\7"+
+    "\12\0\4\7\1\u0127\27\7\6\0\2\7\1\0\1\7"+
+    "\12\0\14\7\1\u0128\17\7\6\0\2\7\1\0\1\7"+
+    "\12\0\5\7\1\u0107\26\7\6\0\2\7\1\0\1\7"+
+    "\12\0\11\7\1\u0129\22\7\6\0\2\7\1\0\1\7"+
+    "\12\0\10\7\1\143\23\7\6\0\2\7\1\0\1\7"+
+    "\12\0\6\7\1\u012a\25\7\6\0\2\7\1\0\1\7"+
+    "\12\0\14\7\1\126\17\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\7\1\u012b\32\7\6\0\2\7\1\0\1\7"+
+    "\12\0\3\7\1\u012c\30\7\6\0\2\7\1\0\1\7"+
+    "\12\0\6\7\1\u012d\25\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\107\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\7\1\232\32\7\6\0\2\7\1\0\1\7\12\0"+
+    "\3\7\1\u012e\20\7\1\u012f\7\7\6\0\2\7\1\0"+
+    "\1\7\12\0\4\7\1\u0130\27\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\u0131\33\7\6\0\2\7\1\0\1\7"+
+    "\12\0\14\7\1\215\17\7\6\0\2\7\1\0\1\7"+
+    "\12\0\13\7\1\u0132\20\7\6\0\2\7\1\0\1\7"+
+    "\12\0\27\7\1\143\4\7\6\0\2\7\1\0\1\7"+
+    "\12\0\15\7\1\u0133\16\7\6\0\2\7\1\0\1\7"+
+    "\12\0\5\7\1\u0134\26\7\6\0\2\7\1\0\1\7"+
+    "\12\0\14\7\1\u0123\17\7\6\0\2\7\1\0\1\7"+
+    "\12\0\6\7\1\u0135\25\7\6\0\2\7\1\0\1\7"+
+    "\12\0\5\7\1\u0136\26\7\6\0\2\7\1\0\1\7"+
+    "\12\0\4\7\1\u0137\27\7\6\0\2\7\1\0\1\7"+
+    "\12\0\5\7\1\u0129\26\7\6\0\2\7\1\0\1\7"+
+    "\12\0\11\7\1\145\22\7\6\0\2\7\1\0\1\7"+
+    "\12\0\31\7\1\237\2\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\7\1\u0138\32\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\u0139\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\7\1\257\32\7\6\0\2\7\1\0\1\7\12\0"+
+    "\6\7\1\276\25\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\155\33\7\6\0\2\7\1\0\1\7\12\0\1\7"+
+    "\1\155\32\7\6\0\2\7\1\0\1\7\12\0\1\u013a"+
+    "\33\7\6\0\2\7\1\0\1\7\12\0\6\7\1\120"+
+    "\25\7\6\0\2\7\1\0\1\7\12\0\1\u013b\33\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\u013c\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\14\7\1\u013d\17\7"+
+    "\6\0\2\7\1\0\1\7\12\0\25\7\2\143\5\7"+
+    "\6\0\2\7\1\0\1\7\12\0\27\7\1\155\4\7"+
+    "\6\0\2\7\1\0\1\7\12\0\4\7\1\213\27\7"+
+    "\6\0\2\7\1\0\1\7\12\0\11\7\1\u013e\22\7"+
+    "\6\0\2\7\1\0\1\7\12\0\10\7\1\225\23\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\u013f\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\11\7\1\u0140\22\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\7\1\u0141\32\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\u0142\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\7\1\u0143\32\7"+
+    "\6\0\2\7\1\0\1\7\12\0\6\7\1\u0144\25\7"+
+    "\6\0\2\7\1\0\1\7\12\0\6\7\1\u0133\25\7"+
+    "\6\0\2\7\1\0\1\u0145\12\0\34\7\6\0\2\7"+
+    "\1\0\1\7\12\0\14\7\1\u0146\17\7\6\0\2\7"+
+    "\1\0\1\7\12\0\4\7\1\u0147\4\7\1\202\22\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\7\1\u0112\32\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\u0148\33\7\6\0"+
+    "\2\7\1\0\1\7\12\0\11\7\1\u0149\22\7\6\0"+
+    "\2\7\1\0\1\7\12\0\5\7\1\u014a\26\7\6\0"+
+    "\2\7\1\0\1\7\12\0\6\7\1\u014b\25\7\6\0"+
+    "\2\7\1\0\1\7\12\0\4\7\1\u014c\27\7\6\0"+
+    "\2\7\1\0\1\7\12\0\5\7\1\71\26\7\6\0"+
+    "\2\7\1\0\1\7\12\0\13\7\1\u014d\20\7\6\0"+
+    "\2\7\1\0\1\7\12\0\5\7\1\u014e\26\7\6\0"+
+    "\2\7\1\0\1\7\12\0\20\7\1\143\13\7\6\0"+
+    "\2\7\1\0\1\7\12\0\4\7\1\u014f\27\7\6\0"+
+    "\2\7\1\0\1\7\12\0\4\7\1\u0150\27\7\6\0"+
+    "\2\7\1\0\1\7\12\0\5\7\1\310\26\7\6\0"+
+    "\2\7\1\0\1\7\12\0\15\7\1\113\16\7\6\0"+
+    "\2\7\1\0\1\7\12\0\11\7\1\u0151\22\7\6\0"+
+    "\2\7\1\0\1\7\12\0\12\7\1\u0152\21\7\6\0"+
+    "\2\7\1\0\1\7\12\0\6\7\1\u0153\25\7\6\0"+
+    "\2\7\1\0\1\u0154\12\0\34\7\6\0\2\7\1\0"+
+    "\1\7\12\0\6\7\1\u012e\25\7\6\0\2\7\1\0"+
+    "\1\7\12\0\11\7\1\u0155\22\7\6\0\2\7\1\0"+
+    "\1\7\12\0\25\7\1\143\2\7\1\143\3\7\6\0"+
+    "\2\7\1\0\1\7\12\0\27\7\1\u0156\4\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\u0157\33\7\6\0\2\7"+
+    "\1\0\1\7\12\0\6\7\1\213\25\7\6\0\2\7"+
+    "\1\0\1\7\12\0\1\u0158\33\7\6\0\2\7\1\0"+
+    "\1\7\12\0\5\7\1\u012c\26\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\213\33\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\u0100\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\10\7\1\223\23\7\6\0\2\7\1\0\1\7\12\0"+
+    "\27\7\1\213\4\7\6\0\2\7\1\0\1\7\12\0"+
+    "\2\7\1\u012e\1\7\1\u0159\5\7\1\u0152\21\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\u015a\33\7\6\0\2\7"+
+    "\1\0\1\7\12\0\4\7\1\u015b\27\7\6\0\2\7"+
+    "\1\0\1\7\12\0\5\7\1\u0100\26\7\6\0\2\7"+
+    "\1\0\1\7\12\0\15\7\1\370\16\7\6\0\2\7"+
+    "\1\0\1\7\12\0\14\7\1\u015c\17\7\6\0\2\7"+
+    "\1\0\1\7\12\0\10\7\1\u0100\23\7\6\0\2\7"+
+    "\1\0\1\7\12\0\21\7\1\213\12\7\6\0\2\7"+
+    "\1\0\1\7\12\0\15\7\1\u015d\16\7\6\0\2\7"+
+    "\1\0\1\7\12\0\1\u015e\33\7\6\0\2\7\1\0"+
+    "\1\7\12\0\10\7\1\u015f\23\7\6\0\2\7\1\0"+
+    "\1\7\12\0\4\7\1\u0160\27\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\7\1\u0161\32\7\6\0\2\7\1\0"+
+    "\1\7\12\0\15\7\1\u0162\16\7\6\0\2\7\1\0"+
+    "\1\7\12\0\22\7\1\213\11\7\4\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[15936];
+    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 =
+    "\4\0\2\11\4\1\1\11\3\1\1\11\31\1\2\11"+
+    "\2\1\1\11\2\1\1\11\2\1\1\11\1\1\1\0"+
+    "\1\1\1\11\113\1\3\11\1\1\1\0\333\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[354];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public SQLTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 SQLTokenMaker(java.io.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 SQLTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 178) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 20: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 23: break;
+        case 2: 
+          { addNullToken(); return firstToken;
+          }
+        case 24: break;
+        case 21: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 25: break;
+        case 18: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 26: break;
+        case 4: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 27: break;
+        case 14: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+          }
+        case 28: break;
+        case 9: 
+          { start = zzMarkedPos-1; yybegin(CHAR);
+          }
+        case 29: break;
+        case 7: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 30: break;
+        case 19: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 31: break;
+        case 6: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 32: break;
+        case 15: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+          }
+        case 33: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 34: break;
+        case 22: 
+          { addToken(Token.FUNCTION);
+          }
+        case 35: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 36: break;
+        case 17: 
+          { addToken(Token.COMMENT_EOL);
+          }
+        case 37: break;
+        case 8: 
+          { start = zzMarkedPos-1; yybegin(STRING);
+          }
+        case 38: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 39: break;
+        case 5: 
+          { addToken(Token.OPERATOR);
+          }
+        case 40: break;
+        case 13: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 41: break;
+        case 10: 
+          { addToken(Token.ERROR_IDENTIFIER); addNullToken(); return firstToken;
+          }
+        case 42: break;
+        case 11: 
+          { 
+          }
+        case 43: break;
+        case 16: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 44: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 355: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 356: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 357: break;
+            case CHAR: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+            }
+            case 358: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.flex
new file mode 100644
index 0000000..eaddc41
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.flex
@@ -0,0 +1,386 @@
+/*
+ * 8/19/2009
+ *
+ * ScalaTokenMaker.java - Scanner for the Scala programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Scala programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated ScalaTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class ScalaTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public ScalaTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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 = YYINITIAL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = MULTILINE_STRING_DOUBLE;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				break;
+			default:
+				state = YYINITIAL;
+		}
+
+		s = text;
+		start = text.offset;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws IOException {
+		// '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;
+	}
+
+
+%}
+
+
+/***** BEGIN SCALA-SPECIFIC CHANGES *********/
+Upper						= ([A-Z\$\_]) /* Plus Unicode category Lu */
+Lower						= ([a-z])     /* Plus Unicode category Ll */
+Letter						= ({Upper}|{Lower}) /*Plus Unicode categories Lo, Lt, Nl */
+Digit						= ([0-9])
+OpChar						= ([^A-Z\$\_a-z0-9\(\[\]\)\. \t\f])
+Op							= ({OpChar}+)
+IdRest						= (({Letter}|{Digit})*([\_]{Op})?)
+VarId						= ({Lower}{IdRest})
+PlainId						= ({Upper}{IdRest}|{VarId}) /*|{Op})*/
+Id							= ({PlainId}) /*({PlainId}|[\']{StringLit}[\'])*/
+
+IntegerLiteral				= ({Digit}+[Ll]?)
+HexDigit					= ({Digit}|[A-Fa-f])
+HexLiteral					= ("0x"{HexDigit}+)
+
+ExponentPart				= ([Ee][+\-]?{Digit}+)
+FloatType					= ([FfDd])
+FloatingPointLiteral		= ({Digit}+[\.]{Digit}*{ExponentPart}?{FloatType}? |
+							  [\.]{Digit}+{ExponentPart}?{FloatType}? |
+							  {Digit}+{ExponentPart}{FloatType}? |
+							  {Digit}+{ExponentPart}?{FloatType})
+
+UnclosedCharLiteral			= ([\']([\\].|[^\\\'])*[^\']?)
+CharLiteral					= ({UnclosedCharLiteral}[\'])
+UnclosedStringLiteral		= ([\"]([\\].|[^\\\"])*[^\"]?)
+StringLiteral				= ({UnclosedStringLiteral}[\"])
+UnclosedBacktickLiteral		= ([\`][^\`]+)
+BacktickLiteral				= ({UnclosedBacktickLiteral}[\`])
+/* TODO: Multiline strings */
+
+MLCBegin					= ("/*")
+MLCEnd						= ("*/")
+LineCommentBegin			= ("//")
+
+/***** END SCALA-SPECIFIC CHANGES *********/
+
+Whitespace				= ([ \t\f]+)
+LineTerminator			= ([\n])
+Separator				= ([\(\)\{\}\[\]])
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({Letter}|[\_]|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state MULTILINE_STRING_DOUBLE
+%state MLC
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"abstract" |
+	"case" |
+	"catch" |
+	"class" |
+	"def" |
+	"do" |
+	"else" |
+	"extends" |
+	"false" |
+	"final" |
+	"finally" |
+	"for" |
+	"forSome" |
+	"if" |
+	"implicit" |
+	"import" |
+	"lazy" |
+	"match" |
+	"new" |
+	"null" |
+	"object" |
+	"override" |
+	"package" |
+	"private" |
+	"protected" |
+	"requires" |
+	"return" |
+	"sealed" |
+	"super" |
+	"this" |
+	"throw" |
+	"trait" |
+	"try" |
+	"true" |
+	"type" |
+	"val" |
+	"var" |
+	"while" |
+	"with" |
+	"yield" 			{ addToken(Token.RESERVED_WORD); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Id}						{ addToken(Token.IDENTIFIER); }
+
+	{Whitespace}					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	\"\"\"						{ start = zzMarkedPos-3; yybegin(MULTILINE_STRING_DOUBLE); }
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{CharLiteral}				{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedBacktickLiteral}		{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{BacktickLiteral}				{ addToken(Token.LITERAL_BACKQUOTE); }
+
+	/* Comment literals. */
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+	{LineCommentBegin}				{ start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+	{Separator}					{ addToken(Token.SEPARATOR); }
+
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatingPointLiteral}			{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+<MULTILINE_STRING_DOUBLE> {
+	[^\"\\\n]*				{}
+	\\.?						{ /* Skip escaped chars, handles case: '\"""'. */ }
+	\"\"\"					{ addToken(start,zzStartRead+2, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(YYINITIAL); }
+	\"						{}
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+<MLC> {
+	[^hwf\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+}
+
+<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 |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.java
new file mode 100644
index 0000000..ac8e986
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.java
@@ -0,0 +1,995 @@
+/* The following code was generated by JFlex 1.4.1 on 11/10/12 10:31 PM */
+
+/*
+ * 8/19/2009
+ *
+ * ScalaTokenMaker.java - Scanner for the Scala programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Scala programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated ScalaTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class ScalaTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int EOL_COMMENT = 3;
+  public static final int MULTILINE_STRING_DOUBLE = 1;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 2;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\31\1\24\1\0\1\31\23\0\1\31\1\33\1\25\1\33"+
+    "\1\1\1\33\1\33\1\22\2\4\1\30\1\16\1\33\1\16\1\21"+
+    "\1\27\1\12\11\3\1\42\1\33\1\0\1\33\1\0\2\33\3\10"+
+    "\1\17\1\14\1\17\5\1\1\6\6\1\1\52\7\1\1\4\1\23"+
+    "\1\4\1\0\1\5\1\26\1\44\1\45\1\11\1\20\1\15\1\40"+
+    "\1\61\1\34\1\41\1\56\1\60\1\7\1\53\1\50\1\47\1\36"+
+    "\1\2\1\46\1\37\1\35\1\55\1\57\1\43\1\13\1\51\1\54"+
+    "\1\32\1\0\1\32\1\33\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 =
+    "\1\0\1\1\2\0\2\2\1\3\1\4\2\2\1\3"+
+    "\3\2\1\5\1\6\1\7\2\2\1\10\15\2\1\1"+
+    "\1\11\1\12\2\1\1\13\5\1\1\14\3\1\1\2"+
+    "\1\3\1\0\2\15\3\2\1\0\3\2\1\16\1\17"+
+    "\1\5\2\7\1\20\1\7\1\21\1\22\26\2\1\11"+
+    "\1\0\1\23\10\0\1\2\1\15\1\0\4\2\1\24"+
+    "\1\2\1\20\1\25\1\26\11\2\1\16\12\2\1\27"+
+    "\10\0\21\2\2\0\1\30\2\0\1\31\4\2\1\16"+
+    "\6\2\4\0\3\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[184];
+    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\62\0\144\0\226\0\310\0\372\0\u012c\0\310"+
+    "\0\u015e\0\u0190\0\u01c2\0\u01f4\0\u0226\0\u0258\0\u028a\0\310"+
+    "\0\u02bc\0\u02ee\0\u0320\0\u0352\0\u0384\0\u03b6\0\u03e8\0\u041a"+
+    "\0\u044c\0\u047e\0\u04b0\0\u04e2\0\u0514\0\u0546\0\u0578\0\u05aa"+
+    "\0\u05dc\0\u060e\0\u0640\0\310\0\u0672\0\u06a4\0\310\0\u06d6"+
+    "\0\u0708\0\u073a\0\u076c\0\u079e\0\310\0\u07d0\0\u0802\0\u0834"+
+    "\0\u0866\0\310\0\u0898\0\310\0\u08ca\0\u08fc\0\u092e\0\u0960"+
+    "\0\u0992\0\u09c4\0\u09f6\0\u0a28\0\372\0\310\0\u0a5a\0\u0a8c"+
+    "\0\u0abe\0\u0af0\0\u0b22\0\310\0\310\0\u0b54\0\u0b86\0\u0bb8"+
+    "\0\u0bea\0\u0c1c\0\u0c4e\0\u0c80\0\u0cb2\0\u0ce4\0\u0d16\0\u0d48"+
+    "\0\u0d7a\0\u0dac\0\u0dde\0\u0e10\0\u0e42\0\u0e74\0\u0ea6\0\u0ed8"+
+    "\0\u0f0a\0\u0f3c\0\u0f6e\0\310\0\u0fa0\0\310\0\u0fd2\0\u1004"+
+    "\0\u1036\0\u1068\0\u109a\0\u10cc\0\u10fe\0\u1130\0\u1162\0\u1194"+
+    "\0\u11c6\0\u11f8\0\u122a\0\u125c\0\u128e\0\u0992\0\u12c0\0\310"+
+    "\0\310\0\310\0\u12f2\0\u1324\0\u1356\0\u1388\0\u13ba\0\u13ec"+
+    "\0\u141e\0\u1450\0\u1482\0\u14b4\0\u14e6\0\u1518\0\u154a\0\u157c"+
+    "\0\u15ae\0\u15e0\0\u1612\0\u1644\0\u1676\0\u16a8\0\310\0\u16da"+
+    "\0\u170c\0\u173e\0\u1770\0\u17a2\0\u17d4\0\u1806\0\u1838\0\u186a"+
+    "\0\u189c\0\u18ce\0\u1900\0\u1932\0\u1964\0\u1996\0\u19c8\0\u19fa"+
+    "\0\u1a2c\0\u1a5e\0\u1a90\0\u1ac2\0\u1af4\0\u1b26\0\u1b58\0\u1b8a"+
+    "\0\u1bbc\0\u1bee\0\u1c20\0\u1c52\0\u1c84\0\u1cb6\0\u1ce8\0\u1d1a"+
+    "\0\u1d4c\0\u1d7e\0\u1db0\0\u1de2\0\u1e14\0\u1e46\0\u1e78\0\u1eaa"+
+    "\0\u1edc\0\u1f0e\0\u1c20\0\u1f40\0\u1cb6\0\u1f72\0\u1fa4\0\u1fd6";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[184];
+    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\5\2\6\1\7\1\10\2\6\1\11\1\6\1\12"+
+    "\1\13\2\6\1\14\1\5\1\6\1\15\1\16\1\17"+
+    "\1\5\1\20\1\21\1\22\1\23\1\5\1\24\1\10"+
+    "\1\5\1\6\1\25\1\26\1\27\1\30\1\31\1\5"+
+    "\1\32\1\33\1\6\1\34\1\35\1\36\1\37\1\6"+
+    "\1\40\3\6\1\41\2\6\23\42\1\43\1\44\1\45"+
+    "\34\42\24\46\1\47\3\46\1\50\3\46\1\51\3\46"+
+    "\1\52\2\46\1\53\16\46\24\54\1\55\7\54\1\56"+
+    "\3\54\1\57\2\54\1\60\16\54\63\0\3\6\1\0"+
+    "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\17\6"+
+    "\3\0\1\7\2\0\2\62\2\0\1\7\1\0\2\63"+
+    "\1\0\2\64\1\65\16\0\1\64\22\0\3\6\1\0"+
+    "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\1\6"+
+    "\1\66\15\6\1\0\3\6\1\0\1\61\1\6\1\67"+
+    "\6\6\1\0\2\6\13\0\6\6\1\0\1\6\1\70"+
+    "\15\6\3\0\1\7\2\0\2\62\2\0\1\7\1\71"+
+    "\2\63\1\0\2\64\1\65\16\0\1\64\22\0\3\6"+
+    "\1\0\1\61\1\6\1\72\3\6\1\73\2\6\1\0"+
+    "\2\6\13\0\6\6\1\0\17\6\1\0\3\6\1\0"+
+    "\1\61\7\6\1\74\1\0\2\6\13\0\6\6\1\0"+
+    "\4\6\1\75\12\6\3\0\1\65\6\0\1\65\47\0"+
+    "\22\17\1\76\1\77\36\17\23\100\1\101\1\100\1\102"+
+    "\34\100\26\103\1\0\33\103\27\0\1\104\1\105\62\0"+
+    "\1\24\31\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+    "\13\0\1\106\5\6\1\0\3\6\1\107\2\6\1\110"+
+    "\10\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+    "\13\0\6\6\1\0\1\6\1\111\1\6\1\112\13\6"+
+    "\1\0\3\6\1\0\1\61\7\6\1\113\1\0\2\6"+
+    "\13\0\6\6\1\0\12\6\1\114\4\6\1\0\3\6"+
+    "\1\0\1\61\10\6\1\0\2\6\13\0\5\6\1\115"+
+    "\1\0\1\6\1\116\2\6\1\117\12\6\1\0\3\6"+
+    "\1\0\1\61\10\6\1\0\2\6\13\0\4\6\1\75"+
+    "\1\6\1\0\10\6\1\120\6\6\1\0\3\6\1\0"+
+    "\1\61\10\6\1\0\2\6\13\0\1\121\4\6\1\122"+
+    "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+    "\2\6\13\0\6\6\1\0\2\6\1\123\14\6\1\0"+
+    "\3\6\1\0\1\61\7\6\1\124\1\0\2\6\13\0"+
+    "\6\6\1\0\17\6\1\0\3\6\1\0\1\61\10\6"+
+    "\1\0\2\6\13\0\6\6\1\0\2\6\1\125\11\6"+
+    "\1\126\2\6\1\0\3\6\1\0\1\61\7\6\1\127"+
+    "\1\0\2\6\13\0\6\6\1\0\12\6\1\130\4\6"+
+    "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+    "\5\6\1\131\1\0\17\6\1\0\3\6\1\0\1\61"+
+    "\10\6\1\0\2\6\13\0\6\6\1\0\1\6\1\132"+
+    "\15\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+    "\13\0\6\6\1\0\1\6\1\133\15\6\23\42\3\0"+
+    "\34\42\24\134\1\0\35\134\25\0\1\135\34\0\24\46"+
+    "\1\0\3\46\1\0\3\46\1\0\3\46\1\0\2\46"+
+    "\1\0\16\46\27\0\1\136\67\0\1\137\61\0\1\140"+
+    "\3\0\1\141\63\0\1\142\16\0\24\54\1\0\7\54"+
+    "\1\0\3\54\1\0\2\54\1\0\16\54\35\0\1\143"+
+    "\61\0\1\144\3\0\1\145\63\0\1\146\16\0\1\147"+
+    "\3\6\1\0\1\61\10\6\1\147\2\6\1\0\7\147"+
+    "\1\0\2\147\6\6\1\147\17\6\3\0\1\150\6\0"+
+    "\1\150\3\0\1\151\46\0\1\65\6\0\1\65\1\0"+
+    "\2\63\1\0\2\64\17\0\1\64\22\0\3\6\1\0"+
+    "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\11\6"+
+    "\1\152\5\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+    "\2\6\13\0\6\6\1\0\1\6\1\153\15\6\1\0"+
+    "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\1\6"+
+    "\1\154\1\6\1\155\2\6\1\0\17\6\3\0\1\156"+
+    "\4\0\3\156\1\0\2\156\1\0\2\156\17\0\1\156"+
+    "\3\0\2\156\15\0\3\6\1\0\1\61\10\6\1\0"+
+    "\2\6\13\0\3\6\1\155\2\6\1\0\17\6\1\0"+
+    "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\1\6"+
+    "\1\157\4\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+    "\10\6\1\0\2\6\13\0\4\6\1\75\1\6\1\0"+
+    "\17\6\24\17\1\0\35\17\23\100\1\101\1\100\1\160"+
+    "\60\100\1\0\35\100\25\0\1\161\34\0\26\103\1\162"+
+    "\33\103\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+    "\13\0\5\6\1\163\1\0\3\6\1\164\13\6\1\0"+
+    "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\6\6"+
+    "\1\0\1\6\1\165\4\6\1\75\3\6\1\155\4\6"+
+    "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+    "\2\6\1\155\3\6\1\0\17\6\1\0\3\6\1\0"+
+    "\1\61\3\6\1\166\4\6\1\0\2\6\13\0\6\6"+
+    "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+    "\2\6\13\0\5\6\1\167\1\0\4\6\1\170\12\6"+
+    "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+    "\6\6\1\0\1\6\1\171\15\6\1\0\3\6\1\0"+
+    "\1\61\10\6\1\0\2\6\13\0\2\6\1\172\3\6"+
+    "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+    "\2\6\13\0\6\6\1\0\5\6\1\173\11\6\1\0"+
+    "\3\6\1\0\1\61\1\6\1\72\6\6\1\0\2\6"+
+    "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+    "\10\6\1\0\2\6\13\0\6\6\1\0\3\6\1\174"+
+    "\13\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+    "\13\0\2\6\1\175\3\6\1\0\17\6\1\0\3\6"+
+    "\1\0\1\61\10\6\1\0\2\6\13\0\5\6\1\176"+
+    "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+    "\2\6\13\0\1\6\1\177\4\6\1\0\17\6\1\0"+
+    "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\3\6"+
+    "\1\200\2\6\1\0\17\6\1\0\1\6\1\201\1\6"+
+    "\1\0\1\61\10\6\1\0\2\6\13\0\1\6\1\202"+
+    "\4\6\1\0\17\6\1\0\3\6\1\0\1\61\10\6"+
+    "\1\0\2\6\13\0\6\6\1\0\13\6\1\203\3\6"+
+    "\1\0\3\6\1\0\1\61\7\6\1\204\1\0\2\6"+
+    "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+    "\10\6\1\0\2\6\13\0\6\6\1\0\1\75\16\6"+
+    "\1\0\3\6\1\0\1\61\1\6\1\205\6\6\1\0"+
+    "\2\6\13\0\6\6\1\0\17\6\1\0\3\6\1\0"+
+    "\1\61\7\6\1\206\1\0\2\6\13\0\6\6\1\0"+
+    "\17\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+    "\13\0\1\6\1\154\4\6\1\0\17\6\1\0\3\6"+
+    "\1\0\1\61\1\6\1\75\6\6\1\0\2\6\13\0"+
+    "\6\6\1\0\3\6\1\75\13\6\25\0\1\207\71\0"+
+    "\1\210\62\0\1\211\32\0\1\212\115\0\1\213\53\0"+
+    "\1\214\62\0\1\215\32\0\1\216\115\0\1\217\16\0"+
+    "\1\147\15\0\1\147\3\0\7\147\1\0\2\147\6\0"+
+    "\1\147\22\0\1\150\6\0\1\150\4\0\2\64\17\0"+
+    "\1\64\24\0\1\150\6\0\1\150\50\0\3\6\1\0"+
+    "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\6\6"+
+    "\1\75\10\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+    "\2\6\13\0\3\6\1\163\2\6\1\0\17\6\1\0"+
+    "\3\6\1\0\1\61\3\6\1\177\4\6\1\0\2\6"+
+    "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+    "\7\6\1\75\1\0\2\6\13\0\6\6\1\0\17\6"+
+    "\1\0\3\6\1\0\1\61\7\6\1\220\1\0\2\6"+
+    "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+    "\10\6\1\0\2\6\13\0\3\6\1\75\2\6\1\0"+
+    "\17\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+    "\13\0\6\6\1\0\4\6\1\127\12\6\1\0\3\6"+
+    "\1\0\1\61\10\6\1\0\2\6\13\0\5\6\1\221"+
+    "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+    "\2\6\13\0\6\6\1\0\15\6\1\222\1\6\1\0"+
+    "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\6\6"+
+    "\1\0\14\6\1\223\2\6\1\0\3\6\1\0\1\61"+
+    "\10\6\1\0\2\6\13\0\1\6\1\224\4\6\1\0"+
+    "\17\6\1\0\3\6\1\0\1\61\1\6\1\225\6\6"+
+    "\1\0\2\6\13\0\6\6\1\0\17\6\1\0\3\6"+
+    "\1\0\1\61\7\6\1\226\1\0\2\6\13\0\6\6"+
+    "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+    "\2\6\13\0\6\6\1\0\1\6\1\227\15\6\1\0"+
+    "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\6\6"+
+    "\1\0\7\6\1\230\7\6\1\0\3\6\1\0\1\61"+
+    "\1\6\1\231\6\6\1\0\2\6\13\0\6\6\1\0"+
+    "\4\6\1\232\12\6\1\0\3\6\1\0\1\61\1\6"+
+    "\1\155\6\6\1\0\2\6\13\0\6\6\1\0\17\6"+
+    "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+    "\1\75\5\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+    "\10\6\1\0\2\6\13\0\1\6\1\233\4\6\1\0"+
+    "\17\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+    "\13\0\6\6\1\0\12\6\1\234\4\6\1\0\3\6"+
+    "\1\0\1\61\10\6\1\0\2\6\13\0\6\6\1\0"+
+    "\12\6\1\235\4\6\1\0\3\6\1\0\1\61\7\6"+
+    "\1\236\1\0\2\6\13\0\6\6\1\0\17\6\1\0"+
+    "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\6\6"+
+    "\1\0\3\6\1\237\13\6\1\0\3\6\1\0\1\61"+
+    "\1\6\1\75\6\6\1\0\2\6\13\0\6\6\1\0"+
+    "\17\6\1\0\3\6\1\0\1\61\1\6\1\240\6\6"+
+    "\1\0\2\6\13\0\6\6\1\0\17\6\36\0\1\241"+
+    "\65\0\1\242\34\0\1\211\65\0\1\243\76\0\1\244"+
+    "\65\0\1\245\34\0\1\215\65\0\1\246\41\0\3\6"+
+    "\1\0\1\61\10\6\1\0\2\6\13\0\6\6\1\0"+
+    "\5\6\1\247\11\6\1\0\3\6\1\0\1\61\10\6"+
+    "\1\0\2\6\13\0\1\6\1\75\4\6\1\0\17\6"+
+    "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+    "\6\6\1\0\1\6\1\250\15\6\1\0\3\6\1\0"+
+    "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\1\6"+
+    "\1\251\15\6\1\0\3\6\1\0\1\61\7\6\1\252"+
+    "\1\0\2\6\13\0\6\6\1\0\17\6\1\0\3\6"+
+    "\1\0\1\61\7\6\1\240\1\0\2\6\13\0\6\6"+
+    "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+    "\2\6\13\0\6\6\1\0\3\6\1\75\13\6\1\0"+
+    "\3\6\1\0\1\61\1\6\1\253\6\6\1\0\2\6"+
+    "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+    "\10\6\1\0\2\6\13\0\6\6\1\0\4\6\1\254"+
+    "\12\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+    "\13\0\5\6\1\255\1\0\17\6\1\0\3\6\1\0"+
+    "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\3\6"+
+    "\1\221\13\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+    "\2\6\13\0\6\6\1\0\3\6\1\256\13\6\1\0"+
+    "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\5\6"+
+    "\1\257\1\0\17\6\1\0\3\6\1\0\1\61\10\6"+
+    "\1\0\2\6\13\0\6\6\1\0\3\6\1\260\13\6"+
+    "\1\0\3\6\1\0\1\61\3\6\1\221\4\6\1\0"+
+    "\2\6\13\0\6\6\1\0\17\6\1\0\3\6\1\0"+
+    "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\3\6"+
+    "\1\261\13\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+    "\1\6\1\75\13\0\6\6\1\0\17\6\37\0\1\211"+
+    "\2\0\1\242\46\0\1\262\33\0\3\243\1\263\11\243"+
+    "\1\263\2\243\2\263\4\0\1\243\1\263\2\0\1\263"+
+    "\6\243\1\263\17\243\37\0\1\215\2\0\1\245\46\0"+
+    "\1\264\33\0\3\246\1\265\11\246\1\265\2\246\2\265"+
+    "\4\0\1\246\1\265\2\0\1\265\6\246\1\265\17\246"+
+    "\1\0\3\6\1\0\1\61\10\6\1\0\1\6\1\163"+
+    "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+    "\10\6\1\0\2\6\13\0\6\6\1\0\16\6\1\155"+
+    "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+    "\1\6\1\155\4\6\1\0\17\6\1\0\3\6\1\0"+
+    "\1\61\3\6\1\266\4\6\1\0\2\6\13\0\6\6"+
+    "\1\0\17\6\1\0\3\6\1\0\1\61\1\6\1\152"+
+    "\6\6\1\0\2\6\13\0\6\6\1\0\17\6\1\0"+
+    "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\6\6"+
+    "\1\0\10\6\1\155\6\6\1\0\3\6\1\0\1\61"+
+    "\3\6\1\165\4\6\1\0\2\6\13\0\6\6\1\0"+
+    "\17\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+    "\13\0\6\6\1\0\1\6\1\236\15\6\1\0\3\6"+
+    "\1\0\1\61\10\6\1\0\2\6\13\0\6\6\1\0"+
+    "\3\6\1\267\13\6\1\0\3\6\1\0\1\61\10\6"+
+    "\1\0\2\6\13\0\6\6\1\0\5\6\1\75\11\6"+
+    "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+    "\5\6\1\270\1\0\17\6\27\0\1\243\61\0\1\246"+
+    "\33\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+    "\1\6\1\225\4\6\1\0\17\6\1\0\3\6\1\0"+
+    "\1\61\7\6\1\163\1\0\2\6\13\0\6\6\1\0"+
+    "\17\6\1\0\3\6\1\0\1\61\10\6\1\0\1\6"+
+    "\1\155\13\0\6\6\1\0\17\6";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[8200];
+    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 =
+    "\1\0\1\1\2\0\1\11\2\1\1\11\7\1\1\11"+
+    "\23\1\1\11\2\1\1\11\5\1\1\11\4\1\1\11"+
+    "\1\0\1\11\4\1\1\0\4\1\1\11\5\1\2\11"+
+    "\26\1\1\11\1\0\1\11\10\0\2\1\1\0\6\1"+
+    "\3\11\24\1\1\11\10\0\21\1\2\0\1\1\2\0"+
+    "\14\1\4\0\3\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[184];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public ScalaTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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 = YYINITIAL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = MULTILINE_STRING_DOUBLE;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				break;
+			default:
+				state = YYINITIAL;
+		}
+
+		s = text;
+		start = text.offset;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws IOException {
+		// '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;
+		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 ScalaTokenMaker(java.io.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 ScalaTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 150) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 6: 
+          { addNullToken(); return firstToken;
+          }
+        case 26: break;
+        case 15: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 27: break;
+        case 21: 
+          { start = zzMarkedPos-3; yybegin(MULTILINE_STRING_DOUBLE);
+          }
+        case 28: break;
+        case 19: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 29: break;
+        case 18: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 30: break;
+        case 8: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 31: break;
+        case 20: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 32: break;
+        case 13: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 33: break;
+        case 14: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 34: break;
+        case 4: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 35: break;
+        case 22: 
+          { addToken(Token.LITERAL_BACKQUOTE);
+          }
+        case 36: break;
+        case 9: 
+          { /* Skip escaped chars, handles case: '\"""'. */
+          }
+        case 37: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 38: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 39: break;
+        case 17: 
+          { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+          }
+        case 40: break;
+        case 23: 
+          { addToken(start,zzStartRead+2, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(YYINITIAL);
+          }
+        case 41: break;
+        case 5: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 42: break;
+        case 7: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 43: break;
+        case 16: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 44: break;
+        case 10: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 45: break;
+        case 25: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 46: break;
+        case 24: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 47: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 48: break;
+        case 1: 
+          { 
+          }
+        case 49: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 50: 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 185: break;
+            case MULTILINE_STRING_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 186: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 187: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 188: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.flex
new file mode 100644
index 0000000..811a857
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.flex
@@ -0,0 +1,404 @@
+/*
+ * 10/03/2007
+ *
+ * TclTokenMaker.java - Scanner for the Tcl programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Tcl programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated TclTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class TclTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public TclTokenMaker() {
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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]
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({Letter}|"_"|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+UnclosedStringLiteral		= ([\"]([\\].|[^\\\"])*[^\"]?)
+StringLiteral				= ({UnclosedStringLiteral}[\"])
+
+LineCommentBegin			= "#"
+
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral				= ({IntegerHelper1}[lL]?)
+HexLiteral				= ({IntegerHelper2}[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}+)
+
+Separator					= ([\(\)\{\}\[\]])
+Separator2				= ([\;,.])
+
+Operator					= ("="|"!"|"+"|"-"|"*"|"/"|">"=?|"<"=?|"%"|"&"|"|"|"^"|"~")
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier			= ({NonSeparator}+)
+
+
+%%
+
+/* Keywords */
+<YYINITIAL> "append"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "array"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "auto_mkindex"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "concat"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "console"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "eval"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "expr"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "format"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "global"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "set"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "trace"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "unset"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "upvar"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "join"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lappend"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lindex"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "linsert"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "list"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "llength"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lrange"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lreplace"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lsearch"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lsort"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "split"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "scan"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "string"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "regexp"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "regsub"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "if"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "else"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "elseif"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "switch"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "for"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "foreach"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "while"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "break"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "continue"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "proc"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "return"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "source"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "unkown"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "uplevel"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "cd"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "close"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "eof"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "file"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "flush"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "gets"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "glob"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "open"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "read"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "puts"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "pwd"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "seek"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tell"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "catch"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "error"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "exec"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "pid"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "after"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "time"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "exit"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "history"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "rename"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "info"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ceil"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "floor"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "round"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "incr"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "hypot"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "abs"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "acos"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "cos"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "cosh"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "asin"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "sin"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "sinh"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "atan"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "atan2"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tan"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tanh"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "log"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "log10"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "fmod"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "pow"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "hypot"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "sqrt"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "double"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "int"				{ addToken(Token.RESERVED_WORD); }
+
+<YYINITIAL> "bind"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "button"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "canvas"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "checkbutton"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "destroy"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "entry"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "focus"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "frame"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "grab"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "image"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "label"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "listbox"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lower"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "menu"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "menubutton"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "message"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "option"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "pack"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "placer"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "radiobutton"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "raise"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "scale"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "scrollbar"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "selection"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "send"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "text"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tk"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tkerror"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tkwait"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "toplevel"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "update"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "winfo"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "wm"				{ addToken(Token.RESERVED_WORD); }
+
+
+<YYINITIAL> {
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+
+	/* Comment literals. */
+	{LineCommentBegin}.*			{ addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+	/* Separators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{Operator}					{ 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); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.java
new file mode 100644
index 0000000..7053bc2
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.java
@@ -0,0 +1,1075 @@
+/* The following code was generated by JFlex 1.4.1 on 10/10/10 10:56 PM */
+
+/*
+ * 10/03/2007
+ *
+ * TclTokenMaker.java - Scanner for the Tcl programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Tcl programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated TclTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class TclTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int YYINITIAL = 0;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\14\1\13\1\0\1\14\1\7\22\0\1\14\1\27\1\15"+
+    "\1\10\1\1\1\27\1\27\1\7\2\24\1\27\1\22\1\25\1\22"+
+    "\1\23\1\27\1\3\1\61\1\60\5\5\2\2\1\7\1\25\1\30"+
+    "\1\26\1\30\1\7\1\0\3\4\1\20\1\21\1\20\5\1\1\17"+
+    "\13\1\1\16\2\1\1\24\1\11\1\24\1\27\1\12\1\0\1\31"+
+    "\1\54\1\46\1\35\1\33\1\52\1\53\1\56\1\44\1\55\1\43"+
+    "\1\50\1\42\1\34\1\41\1\32\1\62\1\36\1\47\1\40\1\6"+
+    "\1\51\1\57\1\45\1\37\1\1\1\24\1\27\1\24\1\27\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 =
+    "\1\0\1\1\1\2\2\3\1\2\1\1\1\4\1\5"+
+    "\1\6\1\7\1\10\1\2\1\11\1\2\1\10\22\2"+
+    "\1\1\1\12\1\3\1\13\1\12\1\13\1\12\1\14"+
+    "\1\12\2\2\1\7\1\15\35\2\1\16\5\2\1\16"+
+    "\40\2\1\1\1\13\1\0\2\14\5\2\1\15\25\2"+
+    "\1\16\30\2\1\16\4\2\1\16\11\2\1\1\5\2"+
+    "\2\16\6\2\1\16\15\2\1\16\3\2\1\16\1\2"+
+    "\1\1\14\2\1\1\6\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[241];
+    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\63\0\146\0\231\0\314\0\377\0\u0132\0\u0165"+
+    "\0\u0132\0\u0198\0\u01cb\0\u0132\0\u01fe\0\u0132\0\u0132\0\u0231"+
+    "\0\u0264\0\u0297\0\u02ca\0\u02fd\0\u0330\0\u0363\0\u0396\0\u03c9"+
+    "\0\u03fc\0\u042f\0\u0462\0\u0495\0\u04c8\0\u04fb\0\u052e\0\u0561"+
+    "\0\u0594\0\u05c7\0\u05fa\0\u062d\0\u062d\0\u062d\0\u0660\0\u0693"+
+    "\0\u06c6\0\u06f9\0\u072c\0\u075f\0\u0792\0\u07c5\0\u0132\0\u07f8"+
+    "\0\u082b\0\u085e\0\u0891\0\u08c4\0\u08f7\0\u092a\0\u095d\0\u0990"+
+    "\0\u09c3\0\u09f6\0\u0a29\0\u0a5c\0\u0a8f\0\u0ac2\0\u0af5\0\u0b28"+
+    "\0\u0b5b\0\u0b8e\0\u0bc1\0\u0bf4\0\u0c27\0\u0c5a\0\u0c8d\0\u0cc0"+
+    "\0\u0cf3\0\u0d26\0\u0d59\0\u0d8c\0\u0dbf\0\u0df2\0\u0e25\0\u0e58"+
+    "\0\u0e8b\0\u0ebe\0\146\0\u0ef1\0\u0f24\0\u0f57\0\u0f8a\0\u0fbd"+
+    "\0\u0ff0\0\u1023\0\u1056\0\u1089\0\u10bc\0\u10ef\0\u1122\0\u1155"+
+    "\0\u1188\0\u11bb\0\u11ee\0\u1221\0\u1254\0\u1287\0\u12ba\0\u12ed"+
+    "\0\u1320\0\u1353\0\u1386\0\u13b9\0\u13ec\0\u141f\0\u1452\0\u1485"+
+    "\0\u14b8\0\u14eb\0\u151e\0\u1551\0\u1584\0\u15b7\0\u062d\0\u15ea"+
+    "\0\u161d\0\u1650\0\u1683\0\u16b6\0\u16e9\0\u01cb\0\u171c\0\u174f"+
+    "\0\u1782\0\u17b5\0\u17e8\0\u181b\0\u184e\0\u1881\0\u18b4\0\u18e7"+
+    "\0\u191a\0\u194d\0\u1980\0\u19b3\0\u19e6\0\u1a19\0\u1a4c\0\u1a7f"+
+    "\0\u1ab2\0\u1ae5\0\u1b18\0\u1b4b\0\u1b7e\0\u1bb1\0\u1be4\0\u1c17"+
+    "\0\u1c4a\0\u1c7d\0\u1cb0\0\u1ce3\0\u1d16\0\u1d49\0\u1d7c\0\u1daf"+
+    "\0\u1de2\0\u1e15\0\u1e48\0\u1e7b\0\u1eae\0\u1ee1\0\u1f14\0\u1f47"+
+    "\0\u1f7a\0\u1fad\0\u1fe0\0\u2013\0\u2046\0\u2079\0\u20ac\0\u20df"+
+    "\0\u2112\0\u2145\0\u2178\0\u21ab\0\u21de\0\u2211\0\u2244\0\u2277"+
+    "\0\u22aa\0\u22dd\0\u2310\0\u2343\0\u2376\0\u23a9\0\u23dc\0\u240f"+
+    "\0\u2442\0\u2475\0\u24a8\0\u24db\0\u250e\0\u2541\0\u2574\0\u25a7"+
+    "\0\u25da\0\u260d\0\u2640\0\u1b4b\0\u2673\0\u26a6\0\u26d9\0\u270c"+
+    "\0\u273f\0\u2772\0\u27a5\0\u27d8\0\u280b\0\u283e\0\u2871\0\u28a4"+
+    "\0\u28d7\0\u290a\0\u293d\0\u0bc1\0\u2970\0\u29a3\0\u29d6\0\u2a09"+
+    "\0\u260d\0\u2a3c\0\u2a6f\0\u2aa2\0\u2ad5\0\u2b08\0\u2b3b\0\u2b6e"+
+    "\0\u2ba1\0\u2bd4\0\u2c07\0\u2c3a\0\u2c6d\0\u2ca0\0\u2cd3\0\u2d06"+
+    "\0\u2d39";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[241];
+    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\2\1\3\1\4\1\5\1\3\1\4\1\6\1\7"+
+    "\1\10\1\2\1\3\1\11\1\12\1\13\4\3\1\14"+
+    "\1\15\1\16\1\17\2\14\1\20\1\21\1\22\1\23"+
+    "\1\3\1\24\1\25\1\3\1\26\1\27\1\30\1\3"+
+    "\1\31\1\3\1\32\1\33\1\34\1\3\1\35\1\36"+
+    "\1\37\1\40\1\41\1\42\2\4\1\3\7\2\1\0"+
+    "\3\2\3\0\4\2\7\0\33\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\32\3\2\44\2\4"+
+    "\1\44\1\4\1\44\1\0\3\44\3\0\1\44\1\45"+
+    "\1\46\1\47\1\0\1\50\5\0\2\44\1\47\1\44"+
+    "\1\46\12\44\1\45\1\44\1\46\5\44\2\4\3\44"+
+    "\1\51\1\52\1\44\1\52\1\44\1\0\3\44\3\0"+
+    "\1\53\1\45\1\46\1\47\1\0\1\50\5\0\2\44"+
+    "\1\47\1\44\1\46\7\44\1\53\2\44\1\45\1\44"+
+    "\1\46\5\44\2\52\1\44\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\1\3\1\54\1\3"+
+    "\1\55\26\3\63\0\13\10\1\0\47\10\14\0\1\12"+
+    "\46\0\11\13\1\56\3\13\1\57\45\13\2\0\2\50"+
+    "\1\0\1\50\52\0\2\50\27\0\1\14\34\0\1\2"+
+    "\5\3\1\60\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\1\3\1\61\3\3\1\62\1\3\1\63\5\3"+
+    "\1\64\1\65\2\3\1\66\1\3\1\67\6\3\1\2"+
+    "\5\3\1\70\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\1\71\4\3\1\72\2\3\1\73\2\3\1\74"+
+    "\3\3\1\75\6\3\1\74\3\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\3\3\1\76"+
+    "\1\3\1\77\2\3\1\100\3\3\1\101\2\3\1\102"+
+    "\1\103\11\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\2\3\1\104\5\3\1\105\21\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\1\106\1\3\1\107\5\3\1\110\21\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\1\111\1\3\1\112\2\3\1\113\2\3\1\114\1\3"+
+    "\1\115\1\116\16\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\1\3\1\117\30\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\2\3\1\120\27\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\3\3\1\121\5\3\1\122"+
+    "\7\3\1\123\10\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\1\124\1\3\1\125\1\3"+
+    "\1\123\3\3\1\126\6\3\1\127\5\3\1\130\4\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\1\3\1\131\1\132\4\3\1\133\1\134\2\3"+
+    "\1\111\1\3\1\135\10\3\1\136\2\3\1\137\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\1\140\4\3\1\141\2\3\1\142\2\3\1\143\2\3"+
+    "\1\144\1\145\12\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\5\3\1\146\2\3\1\147"+
+    "\1\150\1\3\1\151\3\3\1\152\12\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\2\3"+
+    "\1\70\2\3\1\153\11\3\1\154\12\3\1\2\5\3"+
+    "\1\155\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\5\3\1\156\5\3\1\157\16\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\10\3\1\65"+
+    "\21\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\6\3\1\160\4\3\1\161\16\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\11\3\1\123\1\3\1\162\11\3\1\163\4\3\6\2"+
+    "\1\164\1\0\3\2\3\0\4\2\7\0\32\2\7\44"+
+    "\1\0\3\44\3\0\4\44\7\0\34\44\2\165\1\44"+
+    "\1\165\1\44\1\0\3\44\3\0\4\44\1\166\6\0"+
+    "\27\44\2\165\3\44\2\50\1\44\1\50\1\44\1\0"+
+    "\3\44\3\0\2\44\1\46\1\47\7\0\2\44\1\47"+
+    "\1\44\1\46\14\44\1\46\5\44\2\50\3\44\2\51"+
+    "\1\44\1\51\1\44\1\0\3\44\3\0\2\44\1\46"+
+    "\1\47\1\0\1\50\5\0\2\44\1\47\1\44\1\46"+
+    "\14\44\1\46\5\44\2\51\3\44\1\51\1\52\1\44"+
+    "\1\52\1\44\1\0\3\44\3\0\1\44\1\167\1\46"+
+    "\1\47\1\0\1\50\5\0\2\44\1\47\1\44\1\46"+
+    "\12\44\1\167\1\44\1\46\5\44\2\52\3\44\4\170"+
+    "\1\44\1\0\3\44\3\0\2\44\2\170\7\0\1\170"+
+    "\1\44\1\170\1\44\1\170\10\44\1\170\3\44\1\170"+
+    "\1\44\1\170\3\44\2\170\1\44\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\4\3\1\171"+
+    "\12\3\1\172\1\173\11\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\12\3\1\174\3\3"+
+    "\1\175\13\3\13\13\1\0\1\13\1\176\45\13\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\7\3\1\177\22\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\1\3\1\200\30\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\5\3\1\201\24\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\1\202\31\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\10\3"+
+    "\1\67\21\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\13\3\1\203\16\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\7\3"+
+    "\1\204\22\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\16\3\1\123\13\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\7\3"+
+    "\1\67\22\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\15\3\1\205\14\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\10\3"+
+    "\1\206\21\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\26\3\1\123\3\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\4\3"+
+    "\1\123\25\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\1\207\31\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\7\3\1\210"+
+    "\22\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\5\3\1\211\24\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\21\3\1\123"+
+    "\10\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\1\3\1\212\1\206\10\3\1\213\16\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\16\3\1\214\13\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\1\215\31\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\16\3\1\216\13\3\1\2\5\3\1\217\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\32\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\4\3"+
+    "\1\220\6\3\1\221\16\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\1\74\2\3\1\146"+
+    "\3\3\1\222\12\3\1\223\7\3\1\2\5\3\1\157"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\32\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\3\3\1\224\26\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\14\3\1\213\2\3"+
+    "\1\215\12\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\1\225\31\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\1\3\1\226"+
+    "\30\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\2\3\1\227\23\3\1\230\3\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\11\3\1\231\20\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\2\3\1\203\4\3\1\232"+
+    "\22\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\3\3\1\233\12\3\1\234\13\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\7\3\1\123\5\3\1\212\3\3\1\235\10\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\1\236\31\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\3\3\1\237\3\3\1\240\22\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\13\3\1\215\16\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\3\3\1\241\12\3"+
+    "\1\224\13\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\10\3\1\221\21\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\2\3"+
+    "\1\242\27\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\17\3\1\243\12\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\2\3"+
+    "\1\205\1\74\3\3\1\123\7\3\1\244\12\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\5\3\1\245\24\3\1\2\5\3\1\246\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\32\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\1\247"+
+    "\4\3\1\250\24\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\13\3\1\251\16\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\5\3\1\213\24\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\1\3\1\61\21\3\1\252"+
+    "\6\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\1\253\1\3\1\254\27\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\22\3"+
+    "\1\255\3\3\1\204\3\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\3\3\1\256\12\3"+
+    "\1\257\13\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\2\3\1\260\5\3\1\137\21\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\2\3\1\261\27\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\1\116\31\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\5\3\1\262\7\3\1\263\14\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\10\3\1\74"+
+    "\21\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\17\3\1\231\12\3\1\2\5\3\1\264"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\10\3"+
+    "\1\211\21\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\1\265\31\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\10\3\1\266"+
+    "\21\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\7\3\1\267\22\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\2\3\1\270"+
+    "\27\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\3\3\1\74\26\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\1\3\1\271"+
+    "\30\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\16\3\1\272\13\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\3\3\1\273"+
+    "\26\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\13\3\1\151\16\3\2\2\4\274\1\2"+
+    "\1\0\3\2\3\0\2\2\2\274\7\0\1\274\1\2"+
+    "\1\274\1\2\1\274\10\2\1\274\3\2\1\274\1\2"+
+    "\1\274\3\2\2\274\1\2\2\44\2\165\1\44\1\165"+
+    "\1\44\1\0\3\44\3\0\2\44\1\46\1\44\7\0"+
+    "\4\44\1\46\14\44\1\46\5\44\2\165\1\44\2\0"+
+    "\2\165\1\0\1\165\52\0\2\165\1\0\2\44\4\170"+
+    "\1\44\1\0\3\44\3\0\1\44\1\167\2\170\7\0"+
+    "\1\170\1\44\1\170\1\44\1\170\10\44\1\170\1\44"+
+    "\1\167\1\44\1\170\1\44\1\170\3\44\2\170\1\44"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\1\275\31\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\2\3\1\276\27\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\1\212\31\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\10\3\1\277\21\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\2\3"+
+    "\1\213\27\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\10\3\1\300\21\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\2\3"+
+    "\1\157\27\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\1\301\31\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\3\3\1\302"+
+    "\26\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\3\3\1\123\26\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\2\3\1\212"+
+    "\27\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\12\3\1\123\17\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\15\3\1\123"+
+    "\14\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\15\3\1\204\14\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\5\3\1\301"+
+    "\24\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\10\3\1\212\21\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\5\3\1\123"+
+    "\24\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\7\3\1\123\22\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\2\3\1\303"+
+    "\27\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\17\3\1\123\12\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\7\3\1\304"+
+    "\22\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\23\3\1\151\6\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\13\3\1\305"+
+    "\16\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\16\3\1\231\13\3\1\2\5\3\1\306"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\32\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\2\3\1\307\13\3\1\310\13\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\25\3"+
+    "\1\123\4\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\15\3\1\231\14\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\17\3"+
+    "\1\172\12\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\5\3\1\77\24\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\1\243"+
+    "\31\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\2\3\1\123\27\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\13\3\1\311"+
+    "\16\3\1\2\5\3\1\312\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\32\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\16\3\1\122\13\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\10\3\1\123\21\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\22\3\1\231\7\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\20\3\1\313\11\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\15\3\1\314\14\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\7\3\1\315\5\3\1\316\1\317\13\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\15\3\1\320\14\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\13\3\1\213\16\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\2\3\1\321\27\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\13\3\1\322\16\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\5\3\1\225\24\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\3\3\1\123\13\3\1\231"+
+    "\12\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\10\3\1\323\21\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\7\3\1\240"+
+    "\22\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\2\3\1\215\27\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\3\3\1\236"+
+    "\26\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\1\3\1\324\30\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\30\3\1\325"+
+    "\1\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\4\3\1\326\11\3\1\327\13\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\7\3\1\330\22\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\1\331\31\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\3\3"+
+    "\1\332\26\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\2\3\1\333\6\3\1\316\20\3"+
+    "\1\2\5\3\1\67\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\32\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\16\3\1\314\13\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\23\3\1\123\6\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\23\3\1\334\6\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\7\3\1\311\22\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\1\205\31\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\10\3"+
+    "\1\213\21\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\7\3\1\335\22\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\21\3"+
+    "\1\235\10\3\2\2\4\336\1\2\1\0\3\2\3\0"+
+    "\2\2\2\336\7\0\1\336\1\2\1\336\1\2\1\336"+
+    "\10\2\1\336\3\2\1\336\1\2\1\336\3\2\2\336"+
+    "\2\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\7\3\1\231\22\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\20\3\1\252\11\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\26\3\1\203\3\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\337\3\0\4\3\7\0\32\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\6\3"+
+    "\1\123\23\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\27\3\1\123\2\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\13\3"+
+    "\1\100\16\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\5\3\1\340\24\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\10\3"+
+    "\1\341\21\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\5\3\1\203\24\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\14\3"+
+    "\1\342\15\3\1\2\5\3\1\265\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\32\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\10\3\1\203"+
+    "\21\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\23\3\1\343\6\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\1\67\31\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\13\3\1\344\16\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\1\213\31\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\10\3\1\151\21\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\12\3\1\341\17\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\15\3\1\345\14\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\3\3\1\346\26\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\17\3\1\347\12\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\17\3\1\113\12\3\1\2"+
+    "\2\3\1\123\3\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\32\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\2\3\1\350\27\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\2\3\1\137\27\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\23\3\1\351\6\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\5\3\1\240\24\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\22\3\1\352\7\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\1\240\31\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\10\3\1\210\21\3\2\2\4\353"+
+    "\1\2\1\0\3\2\3\0\2\2\2\353\7\0\1\353"+
+    "\1\2\1\353\1\2\1\353\10\2\1\353\3\2\1\353"+
+    "\1\2\1\353\3\2\2\353\2\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\11\3\1\354\20\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\10\3\1\301\21\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\1\3\1\123\30\3"+
+    "\1\2\5\3\1\155\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\32\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\3\3\1\355\26\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\7\3\1\232\22\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\22\3\1\123\7\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\17\3\1\356\12\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\14\3\1\123\15\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\10\3\1\350\21\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\7\3\1\314\22\3\2\2"+
+    "\4\3\1\2\1\0\3\2\3\0\2\2\2\3\7\0"+
+    "\1\3\1\2\1\3\1\2\1\3\10\2\1\3\3\2"+
+    "\1\3\1\2\1\3\3\2\2\3\2\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\12\3\1\357"+
+    "\17\3\1\2\5\3\1\231\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\32\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\23\3\1\173\6\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\13\3\1\360\16\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\3\3\1\361\26\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\4\3\1\326\25\3";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[11628];
+    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 =
+    "\1\0\5\1\1\11\1\1\1\11\2\1\1\11\1\1"+
+    "\2\11\37\1\1\11\106\1\1\0\173\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[241];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public TclTokenMaker() {
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		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(java.io.Reader reader) throws java.io.IOException {
+		// '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;
+		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 TclTokenMaker(java.io.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 TclTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 160) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 14: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 15: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 16: break;
+        case 13: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 17: break;
+        case 11: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 18: break;
+        case 4: 
+          { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 19: break;
+        case 6: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 20: break;
+        case 10: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 21: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 22: break;
+        case 12: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 23: break;
+        case 8: 
+          { addToken(Token.OPERATOR);
+          }
+        case 24: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 25: break;
+        case 7: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 26: break;
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 27: break;
+        case 9: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 28: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 242: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/UnixShellTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/UnixShellTokenMaker.java
new file mode 100644
index 0000000..f226530
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/UnixShellTokenMaker.java
@@ -0,0 +1,1113 @@
+/*
+ * 03/16/2004
+ *
+ * UnixShellTokenMaker.java - Scanner for UNIX shell scripts.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A token maker that turns text into a linked list of <code>Token</code>s
+ * for syntax highlighting UNIX shell scripts.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class UnixShellTokenMaker extends AbstractTokenMaker {
+
+	protected final String operators = "=|><&";
+	protected final String separators = "()[]";
+	protected final String separators2 = ".,;";			// Characters you don't want syntax highlighted but separate identifiers.
+	protected final String shellVariables = "#-?$!*@_";	// Characters that are part of "$<char>" shell variables; e.g., "$_".
+
+
+	private int currentTokenStart;
+	private int currentTokenType;
+
+
+	/**
+	 * Constructor.
+	 */
+	public UnixShellTokenMaker() {
+		super();	// Initializes tokensToHighlight.
+	}
+
+
+	/**
+	 * Checks the token to give it the exact ID it deserves before
+	 * being passed up to the super method.
+	 *
+	 * @param segment <code>Segment</code> to get text from.
+	 * @param start Start offset in <code>segment</code> of token.
+	 * @param end End offset in <code>segment</code> of token.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which the token occurs.
+	 */
+	public void addToken(Segment segment, int start, int end, int tokenType, int startOffset) {
+
+		switch (tokenType) {
+			// Since reserved words, functions, and data types are all passed into here
+			// as "identifiers," we have to see what the token really is...
+			case Token.IDENTIFIER:
+				int value = wordsToHighlight.get(segment, start,end);
+				if (value!=-1)
+					tokenType = value;
+				break;
+			case Token.WHITESPACE:
+			case Token.SEPARATOR:
+			case Token.OPERATOR:
+			case Token.LITERAL_NUMBER_DECIMAL_INT:
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+			case Token.LITERAL_CHAR:
+			case Token.LITERAL_BACKQUOTE:
+			case Token.COMMENT_EOL:
+			case Token.PREPROCESSOR:
+			case Token.VARIABLE:
+				break;
+
+			default:
+				new Exception("Unknown tokenType: '" + tokenType + "'").
+													printStackTrace();
+				tokenType = Token.IDENTIFIER;
+				break;
+
+		}
+
+		super.addToken(segment, start, end, tokenType, startOffset);
+
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * Returns the words to highlight for UNIX shell scripts.
+	 *
+	 * @return A <code>TokenMap</code> containing the words to highlight for
+	 *         UNIX shell scripts.
+	 * @see org.fife.ui.rsyntaxtextarea.AbstractTokenMaker#getWordsToHighlight
+	 */
+	public TokenMap getWordsToHighlight() {
+
+		TokenMap tokenMap = new TokenMap();
+
+		int reservedWord = Token.RESERVED_WORD;
+		tokenMap.put("case",				reservedWord);
+		tokenMap.put("do",				reservedWord);
+		tokenMap.put("done",				reservedWord);
+		tokenMap.put("elif",				reservedWord);
+		tokenMap.put("else",				reservedWord);
+		tokenMap.put("esac",				reservedWord);
+		tokenMap.put("fi",				reservedWord);
+		tokenMap.put("for",				reservedWord);
+		tokenMap.put("if",				reservedWord);
+		tokenMap.put("in",				reservedWord);
+		tokenMap.put("select",			reservedWord);
+		tokenMap.put("then",				reservedWord);
+		tokenMap.put("until",			reservedWord);
+		tokenMap.put("while",			reservedWord);
+
+		int function = Token.FUNCTION;
+		tokenMap.put("addbib",			function);
+		tokenMap.put("admin",			function);
+		tokenMap.put("alias",			function);
+		tokenMap.put("apropos",			function);
+		tokenMap.put("ar",			function);
+		tokenMap.put("at",				function);
+		tokenMap.put("awk",			function);
+		tokenMap.put("banner",			function);
+		tokenMap.put("basename",			function);
+		tokenMap.put("batch",			function);
+		tokenMap.put("bg",			function);
+		tokenMap.put("biff",			function);
+		tokenMap.put("bin-mail",			function);
+		tokenMap.put("binmail",			function);
+		tokenMap.put("break",			function);
+		tokenMap.put("cal",			function);
+		tokenMap.put("calendar",			function);
+		tokenMap.put("cancel",			function);
+		tokenMap.put("cat",			function);
+		tokenMap.put("cb",			function);
+		tokenMap.put("cc",			function);
+		tokenMap.put("cd",			function);
+		tokenMap.put("cdc",			function);
+		tokenMap.put("chdir",			function);
+		tokenMap.put("checkeq",		function);
+		tokenMap.put("checknr",			function);
+		tokenMap.put("chfn",			function);
+		tokenMap.put("chgrp",			function);
+		tokenMap.put("chmod",			function);
+		tokenMap.put("chown",			function);
+		tokenMap.put("chsh",			function);
+		tokenMap.put("clear",			function);
+		tokenMap.put("cmp",			function);
+		tokenMap.put("colcrt",			function);
+		tokenMap.put("comb",			function);
+		tokenMap.put("comm",			function);
+		tokenMap.put("command",			function);
+		tokenMap.put("compress",			function);
+		tokenMap.put("continue",			function);
+		tokenMap.put("cp",			function);
+		tokenMap.put("cpio",			function);
+		tokenMap.put("cpp",			function);
+		tokenMap.put("crontab",			function);
+		tokenMap.put("csh",			function);
+		tokenMap.put("ctags",			function);
+		tokenMap.put("cut", 		function);
+		tokenMap.put("cvs",			function);
+		tokenMap.put("date",			function);
+		tokenMap.put("dbx",			function);
+		tokenMap.put("delta",			function);
+		tokenMap.put("deroff",			function);
+		tokenMap.put("df",			function);
+		tokenMap.put("diff",			function);
+		tokenMap.put("dtree",			function);
+		tokenMap.put("du",			function);
+		tokenMap.put("e",			function);
+		tokenMap.put("echo",			function);
+		tokenMap.put("ed",			function);
+		tokenMap.put("edit",			function);
+		tokenMap.put("enscript",		function);
+		tokenMap.put("eqn",			function);
+		tokenMap.put("error",		function);
+		tokenMap.put("eval",		function);
+		tokenMap.put("ex",			function);
+		tokenMap.put("exec",			function);
+		tokenMap.put("exit",			function);
+		tokenMap.put("expand",		function);
+		tokenMap.put("export",		function);
+		tokenMap.put("expr",			function);
+		tokenMap.put("false",			function);
+		tokenMap.put("fc",			function);
+		tokenMap.put("fg",			function);
+		tokenMap.put("file",			function);
+		tokenMap.put("find",			function);
+		tokenMap.put("finger",			function);
+		tokenMap.put("fmt",			function);
+		tokenMap.put("fmt_mail",			function);
+		tokenMap.put("fold",			function);
+		tokenMap.put("ftp",			function);
+		tokenMap.put("function",		function);
+		tokenMap.put("gcore",			function);
+		tokenMap.put("get",			function);
+		tokenMap.put("getopts",			function);
+		tokenMap.put("gprof",			function);
+		tokenMap.put("grep",			function);
+		tokenMap.put("groups",			function);
+		tokenMap.put("gunzip",			function);
+		tokenMap.put("gzip",			function);
+		tokenMap.put("hashcheck",			function);
+		tokenMap.put("hashmake",			function);
+		tokenMap.put("head",			function);
+		tokenMap.put("help",			function);
+		tokenMap.put("history",			function);
+		tokenMap.put("imake",			function);
+		tokenMap.put("indent",			function);
+		tokenMap.put("install",			function);
+		tokenMap.put("jobs",			function);
+		tokenMap.put("join",			function);
+		tokenMap.put("kill",			function);
+		tokenMap.put("last",			function);
+		tokenMap.put("ld",			function);
+		tokenMap.put("leave",			function);
+		tokenMap.put("less",			function);
+		tokenMap.put("let",			function);
+		tokenMap.put("lex",			function);
+		tokenMap.put("lint",			function);
+		tokenMap.put("ln",			function);
+		tokenMap.put("login",			function);
+		tokenMap.put("look",			function);
+		tokenMap.put("lookbib",			function);
+		tokenMap.put("lorder",			function);
+		tokenMap.put("lp",			function);
+		tokenMap.put("lpq",			function);
+		tokenMap.put("lpr",			function);
+		tokenMap.put("lprm",			function);
+		tokenMap.put("ls",			function);
+		tokenMap.put("mail",			function);
+		tokenMap.put("Mail",			function);
+		tokenMap.put("make",			function);
+		tokenMap.put("man",			function);
+		tokenMap.put("md",			function);
+		tokenMap.put("mesg",			function);
+		tokenMap.put("mkdir",		function);
+		tokenMap.put("mkstr",			function);
+		tokenMap.put("more",			function);
+		tokenMap.put("mount",			function);
+		tokenMap.put("mv",			function);
+		tokenMap.put("nawk",			function);
+		tokenMap.put("neqn",			function);
+		tokenMap.put("nice",			function);
+		tokenMap.put("nm",			function);
+		tokenMap.put("nroff",			function);
+		tokenMap.put("od",			function);
+		tokenMap.put("page",			function);
+		tokenMap.put("passwd",			function);
+		tokenMap.put("paste",			function);
+		tokenMap.put("pr",			function);
+		tokenMap.put("print",		function);
+		tokenMap.put("printf",		function);
+		tokenMap.put("printenv",			function);
+		tokenMap.put("prof",			function);
+		tokenMap.put("prs",			function);
+		tokenMap.put("prt",			function);
+		tokenMap.put("ps",			function);
+		tokenMap.put("ptx",			function);
+		tokenMap.put("pwd",			function);
+		tokenMap.put("quota",			function);
+		tokenMap.put("ranlib",			function);
+		tokenMap.put("rcp",			function);
+		tokenMap.put("rcs",			function);
+		tokenMap.put("rcsdiff",			function);
+		tokenMap.put("read",			function);
+		tokenMap.put("readonly",			function);
+		tokenMap.put("red",			function);
+		tokenMap.put("return",		function);
+		tokenMap.put("rev",			function);
+		tokenMap.put("rlogin",			function);
+		tokenMap.put("rm",			function);
+		tokenMap.put("rmdel",			function);
+		tokenMap.put("rmdir",			function);
+		tokenMap.put("roffbib",			function);
+		tokenMap.put("rsh",			function);
+		tokenMap.put("rup",			function);
+		tokenMap.put("ruptime",			function);
+		tokenMap.put("rusers",			function);
+		tokenMap.put("rwall",			function);
+		tokenMap.put("rwho",			function);
+		tokenMap.put("sact",			function);
+		tokenMap.put("sccs",			function);
+		tokenMap.put("sccsdiff",			function);
+		tokenMap.put("script",			function);
+		tokenMap.put("sed",			function);
+		tokenMap.put("set",			function);
+		tokenMap.put("setgroups",			function);
+		tokenMap.put("setsenv",			function);
+		tokenMap.put("sh",			function);
+		tokenMap.put("shift",		function);
+		tokenMap.put("size",			function);
+		tokenMap.put("sleep",			function);
+		tokenMap.put("sort",			function);
+		tokenMap.put("sortbib",			function);
+		tokenMap.put("spell",		function);
+		tokenMap.put("split",			function);
+		tokenMap.put("ssh",				function);
+		tokenMap.put("strings",			function);
+		tokenMap.put("strip",			function);
+		tokenMap.put("stty",			function);
+		tokenMap.put("su",			function);
+		tokenMap.put("sudo",			function);
+		tokenMap.put("symorder",			function);
+		tokenMap.put("tabs",			function);
+		tokenMap.put("tail",			function);
+		tokenMap.put("talk",			function);
+		tokenMap.put("tar",			function);
+		tokenMap.put("tbl",			function);
+		tokenMap.put("tee",			function);
+		tokenMap.put("telnet",			function);
+		tokenMap.put("test",			function);
+		tokenMap.put("tftp",			function);
+		tokenMap.put("time",			function);
+		tokenMap.put("times",			function);
+		tokenMap.put("touch",			function);
+		tokenMap.put("trap",			function);
+		tokenMap.put("troff",			function);
+		tokenMap.put("true",			function);
+		tokenMap.put("tsort",			function);
+		tokenMap.put("tty",			function);
+		tokenMap.put("type",			function);
+		tokenMap.put("typeset",		function);
+		tokenMap.put("ue",			function);
+		tokenMap.put("ul",			function);
+		tokenMap.put("ulimit",			function);
+		tokenMap.put("umask",		function);
+		tokenMap.put("unalias",			function);
+		tokenMap.put("uncompress",			function);
+		tokenMap.put("unexpand",		function);
+		tokenMap.put("unget",			function);
+		tokenMap.put("unifdef",			function);
+		tokenMap.put("uniq",			function);
+		tokenMap.put("units",			function);
+		tokenMap.put("unset",			function);
+		tokenMap.put("uptime",			function);
+		tokenMap.put("users",			function);
+		tokenMap.put("uucp",			function);
+		tokenMap.put("uudecode",			function);
+		tokenMap.put("uuencode",			function);
+		tokenMap.put("uulog",			function);
+		tokenMap.put("uuname",			function);
+		tokenMap.put("uusend",			function);
+		tokenMap.put("uux",			function);
+		tokenMap.put("vacation",			function);
+		tokenMap.put("val",			function);
+		tokenMap.put("vedit",			function);
+		tokenMap.put("vgrind",			function);
+		tokenMap.put("vi",			function);
+		tokenMap.put("view",			function);
+		tokenMap.put("vtroff",			function);
+		tokenMap.put("w",			function);
+		tokenMap.put("wait",			function);
+		tokenMap.put("wall",			function);
+		tokenMap.put("wc",			function);
+		tokenMap.put("wait",			function);
+		tokenMap.put("what",			function);
+		tokenMap.put("whatis",			function);
+		tokenMap.put("whence",			function);
+		tokenMap.put("whereis",			function);
+		tokenMap.put("which",			function);
+		tokenMap.put("who",			function);
+		tokenMap.put("whoami",			function);
+		tokenMap.put("write",			function);
+		tokenMap.put("xargs",			function);
+		tokenMap.put("xstr",			function);
+		tokenMap.put("yacc",			function);
+		tokenMap.put("yes",			function);
+		tokenMap.put("zcat",			function);
+
+		return tokenMap;
+
+	}
+
+
+	/**
+	 * Returns a list of tokens representing the given text.
+	 *
+	 * @param text The text to break into tokens.
+	 * @param startTokenType The token with which to start tokenizing.
+	 * @param startOffset The offset at which the line of tokens begins.
+	 * @return A linked list of tokens representing <code>text</code>.
+	 */
+	public Token getTokenList(Segment text, int startTokenType, final int startOffset) {
+
+		resetTokenList();
+
+		char[] array = text.array;
+		int offset = text.offset;
+		int count = text.count;
+		int end = offset + count;
+
+		// See, when we find a token, its starting position is always of the form:
+		// 'startOffset + (currentTokenStart-offset)'; but since startOffset and
+		// offset are constant, tokens' starting positions become:
+		// 'newStartOffset+currentTokenStart' for one less subraction operation.
+		int newStartOffset = startOffset - offset;
+
+		currentTokenStart = offset;
+		currentTokenType  = startTokenType;
+		boolean backslash = false;
+
+//beginning:
+		for (int i=offset; i<end; i++) {
+
+			char c = array[i];
+
+			switch (currentTokenType) {
+
+				case Token.NULL:
+
+					currentTokenStart = i;	// Starting a new token here.
+
+					switch (c) {
+
+						case ' ':
+						case '\t':
+							currentTokenType = Token.WHITESPACE;
+							break;
+
+						case '`':
+							if (backslash) { // Escaped back quote => call '`' an identifier..
+								addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								backslash = false;
+							}
+							else {
+								currentTokenType = Token.LITERAL_BACKQUOTE;
+							}
+							break;
+
+						case '"':
+							if (backslash) { // Escaped double quote => call '"' an identifier..
+								addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								backslash = false;
+							}
+							else {
+								currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+							}
+							break;
+
+						case '\'':
+							if (backslash) { // Escaped single quote => call '\'' an identifier.
+								addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								backslash = false;
+							}
+							else {
+								currentTokenType = Token.LITERAL_CHAR;
+							}
+							break;
+
+						case '\\':
+							addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenType = Token.NULL;
+							backslash = !backslash;
+							break;
+
+						case '$':
+							if (backslash) { // Escaped dollar sign => call '$' an identifier..
+								addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								backslash = false;
+							}
+							else {
+								currentTokenType = Token.VARIABLE;
+							}
+							break;
+
+						case '#':
+							backslash = false;
+							currentTokenType = Token.COMMENT_EOL;
+							break;
+
+						default:
+							if (RSyntaxUtilities.isDigit(c)) {
+								currentTokenType = Token.LITERAL_NUMBER_DECIMAL_INT;
+								break;
+							}
+							else if (RSyntaxUtilities.isLetter(c) || c=='/' || c=='_') {
+								currentTokenType = Token.IDENTIFIER;
+								break;
+							}
+							int indexOf = operators.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i, Token.OPERATOR, newStartOffset+currentTokenStart);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i, Token.SEPARATOR, newStartOffset+currentTokenStart);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators2.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							else {
+								currentTokenType = Token.IDENTIFIER;
+								break;
+							}
+
+					} // End of switch (c).
+
+					break;
+
+				case Token.WHITESPACE:
+
+					switch (c) {
+
+						case ' ':
+						case '\t':
+							break;	// Still whitespace.
+
+						case '\\':
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							backslash = true; // Previous char whitespace => this must be first backslash.
+							break;
+
+						case '`': // Don't need to worry about backslashes as previous char is space.
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_BACKQUOTE;
+							backslash = false;
+							break;
+
+						case '"': // Don't need to worry about backslashes as previous char is space.
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+							backslash = false;
+							break;
+
+						case '\'': // Don't need to worry about backslashes as previous char is space.
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_CHAR;
+							backslash = false;
+							break;
+						
+						case '$': // Don't need to worry about backslashes as previous char is space.
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.VARIABLE;
+							backslash = false;
+							break;
+
+						case '#':
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.COMMENT_EOL;
+							break;
+
+						default:	// Add the whitespace token and start anew.
+
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+
+							if (RSyntaxUtilities.isDigit(c)) {
+								currentTokenType = Token.LITERAL_NUMBER_DECIMAL_INT;
+								break;
+							}
+							else if (RSyntaxUtilities.isLetter(c) || c=='/' || c=='_') {
+								currentTokenType = Token.IDENTIFIER;
+								break;
+							}
+							int indexOf = operators.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, i,i, Token.OPERATOR, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, i,i, Token.SEPARATOR, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators2.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							else {
+								currentTokenType = Token.IDENTIFIER;
+							}
+
+					} // End of switch (c).
+
+					break;
+
+				default: // Should never happen
+				case Token.IDENTIFIER:
+
+					switch (c) {
+
+						case ' ':
+						case '\t':
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.WHITESPACE;
+							break;
+
+						case '/': // Special-case to colorize commands like "echo" in "/bin/echo"
+							addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i+1;
+							currentTokenType = Token.NULL;
+							break;
+
+						case '`': // Don't need to worry about backslashes as previous char is space.
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_BACKQUOTE;
+							backslash = false;
+							break;
+
+						case '"': // Don't need to worry about backslashes as previous char is non-backslash.
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+							backslash = false;
+							break;
+
+						case '\'': // Don't need to worry about backslashes as previous char is non-backslash.
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_CHAR;
+							backslash = false;
+							break;
+
+						case '\\':
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							backslash = true;
+							break;
+
+						case '$': // Don't need to worry about backslashes as previous char is non-backslash.
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.VARIABLE;
+							backslash = false;
+							break;
+						
+						case '=': // Special case here; when you have "identifier=<value>" in shell, "identifier" is a variable.
+							addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.OPERATOR, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							break;
+
+						default:
+							if (RSyntaxUtilities.isLetterOrDigit(c) || c=='/' || c=='_') {
+								break;	// Still an identifier of some type.
+							}
+							int indexOf = operators.indexOf(c);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								addToken(text, i,i, Token.OPERATOR, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								addToken(text, i,i, Token.SEPARATOR, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators2.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							// Otherwise, we're still an identifier (?).
+
+					} // End of switch (c).
+
+					break;
+
+				case Token.LITERAL_NUMBER_DECIMAL_INT:
+
+					switch (c) {
+
+						case ' ':
+						case '\t':
+							addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.WHITESPACE;
+							break;
+
+						case '`': // Don't need to worry about backslashes as previous char is space.
+							addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_BACKQUOTE;
+							backslash = false;
+							break;
+
+						case '"': // Don't need to worry about backslashes as previous char is non-backslash.
+							addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+							backslash = false;
+							break;
+
+						case '\'': // Don't need to worry about backslashes as previous char is non-backslash.
+							addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_CHAR;
+							backslash = false;
+							break;
+
+						case '$': // Don't need to worry about backslashes as previous char is non-backslash.
+							addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.VARIABLE;
+							backslash = false;
+							break;
+
+						case '\\':
+							addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							backslash = true;
+							break;
+
+						default:
+
+							if (RSyntaxUtilities.isDigit(c)) {
+								break;	// Still a literal number.
+							}
+							int indexOf = operators.indexOf(c);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+								addToken(text, i,i, Token.OPERATOR, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators.indexOf(c);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+								addToken(text, i,i, Token.SEPARATOR, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators2.indexOf(c);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+								addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+
+							// Otherwise, remember this was a number and start over.
+							addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+							i--;
+							currentTokenType = Token.NULL;
+
+					} // End of switch (c).
+
+					break;
+				
+				case Token.VARIABLE:
+
+					// Note that we first arrive here AFTER the '$' character.
+					// First check if the variable name is enclosed in '{' and '}' characters.
+					if (c=='{') {
+						while (++i<end) {
+							if (array[i]=='}') {
+								addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+								currentTokenType = Token.NULL;
+								break;
+							}
+						} // End of while (++i<end).
+						if (i==end) { // Happens when '}' wasn't found...
+							addToken(text, currentTokenStart,end-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+							currentTokenType = Token.NULL;
+						}
+						break;
+					} // End of if (i<end-1 && array[i+1]=='{').
+
+					// If we didn't find the '{' character, find the end of the variable...
+					while (i<end) {
+						c = array[i];	// Not needed the first iteration, but can't think of a better way to do it...
+						if (!RSyntaxUtilities.isLetterOrDigit(c) && shellVariables.indexOf(c)==-1 && c!='_') {
+							addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+							i--;
+							currentTokenType = Token.NULL;
+							break;
+						}
+						i++;
+					}
+								
+					// This only happens if we never found the end of the variable in the loop above.
+					if (i==end) {
+						addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+						currentTokenType = Token.NULL;
+					}
+								
+					break;
+
+				case Token.COMMENT_EOL:
+					// If we got here, then the line != "#" only, so check for "#!".
+					if (c=='!')
+						currentTokenType = Token.PREPROCESSOR;
+					i = end - 1;
+					addToken(text, currentTokenStart,i, currentTokenType, newStartOffset+currentTokenStart);
+					// We need to set token type to null so at the bottom we don't add one more token.
+					currentTokenType = Token.NULL;
+					
+					break;
+
+				case Token.LITERAL_CHAR:
+
+						if (c=='\\') {
+							backslash = !backslash; // Okay because if we got in here, backslash was initially false.
+						}
+						else {
+							if (c=='\'' && !backslash) {
+								addToken(text, currentTokenStart,i, Token.LITERAL_CHAR, newStartOffset+currentTokenStart);
+								currentTokenStart = i + 1;
+								currentTokenType = Token.NULL;
+								// backslash is definitely false when we leave.
+							}
+
+							backslash = false; // Need to set backslash to false here as a character was typed.
+
+						}
+						// Otherwise, we're still an unclosed char literal...
+
+						break;
+
+				case Token.LITERAL_BACKQUOTE:
+
+						switch (c) {
+								
+							case '\\':
+								backslash = !backslash;
+								break;
+								
+							case '`':
+								if (!backslash) {
+									addToken(text, currentTokenStart,i, Token.LITERAL_BACKQUOTE, newStartOffset+currentTokenStart);
+									currentTokenType = Token.NULL;
+									// backslash is definitely false when we leave.
+									break;
+								}
+								backslash = false;
+								break;
+							
+							// Variable in the backquote string...
+							case '$':
+
+								if (backslash==true) {
+									backslash = false;
+									break;
+								}
+							
+								// Add the string up-to the variable.
+								addToken(text, currentTokenStart,i-1, Token.LITERAL_BACKQUOTE, newStartOffset+currentTokenStart);
+								currentTokenType = Token.VARIABLE;
+								currentTokenStart = i;
+								
+								// First check if the variable name is enclosed in '{' and '}' characters.
+								if (i<end-1 && array[i+1]=='{') {
+									i++; // Now we're on the '{' char.
+									while (++i<end) {
+										if (array[i]=='}') {
+											addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+											i++;
+											if (i<end) {
+												c = array[i];
+												if (c=='`') { // The only rub - back quote right after variable.
+													addToken(text, i,i, Token.LITERAL_BACKQUOTE, newStartOffset+i);
+													currentTokenType = Token.NULL;
+													break;
+												}
+												else { // Continue on with the string.
+													currentTokenStart = i;
+													currentTokenType = Token.LITERAL_BACKQUOTE;
+													i--;
+													break;
+												}
+											}
+											else { // i==end = "trick" this method so that the string is continued to the next line.
+												currentTokenStart = i;
+												currentTokenType = Token.LITERAL_BACKQUOTE;
+												break; // So we don't hit the condition below.
+											}
+										} // End of if (array[i]=='}').
+									} // End of while (++i<end).
+									if (i==end) { // Happens when '}' wasn't found...
+										addToken(text, currentTokenStart,end-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+										currentTokenStart = end; // ???
+										currentTokenType = Token.LITERAL_BACKQUOTE;
+										break;
+									}
+								} // End of if (i<end-1 && array[i+1]=='{').
+								
+								// If we reached the end of the variable, get out.
+								if (currentTokenType==Token.NULL || currentTokenType==Token.LITERAL_BACKQUOTE)
+									break;
+
+								// If we didn't find the '{' character, find the end of the variable...
+								// Increment first to skip the '$'.
+								while (++i<end) {
+									c = array[i];
+									if (!RSyntaxUtilities.isLetterOrDigit(c) && shellVariables.indexOf(c)==-1 && c!='_') {
+										addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+										if (c=='`') { // The only rub.
+											addToken(text, i,i, Token.LITERAL_BACKQUOTE, newStartOffset+i);
+											currentTokenType = Token.NULL;
+											break;
+										}
+										else {
+											currentTokenStart = i;
+											currentTokenType = Token.LITERAL_BACKQUOTE;
+											i--;
+											break;
+										}
+									}
+								}
+								
+								// This only happens if we never found the end of the variable in the loop above.
+								// We "trick" this method so that the backquote string token is at the end.
+								if (i==end) {
+									addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+									currentTokenStart = i;
+									currentTokenType = Token.LITERAL_BACKQUOTE;
+								}
+								
+								break;
+								
+							// Otherwise, we're still in an unclosed string...
+							default:
+								backslash = false; // Need to set backslash to false here as a character was typed.
+
+						} // End of switch (c).
+				
+						break;
+
+				case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				
+						switch (c) {
+								
+							case '\\':
+								backslash = !backslash;
+								break;
+								
+							case '"':
+								if (!backslash) {
+									addToken(text, currentTokenStart,i, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+currentTokenStart);
+									currentTokenType = Token.NULL;
+									// backslash is definitely false when we leave.
+									break;
+								}
+								backslash = false;
+								break;
+							
+							// Variable in the double-quoted string...
+							case '$':
+							
+								if (backslash==true) {
+									backslash = false;
+									break;
+								}
+							
+								// Add the string up-to the variable.
+								addToken(text, currentTokenStart,i-1, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+currentTokenStart);
+								currentTokenType = Token.VARIABLE;
+								currentTokenStart = i;
+								
+								// First check if the variable name is enclosed in '{' and '}' characters.
+								if (i<end-1 && array[i+1]=='{') {
+									i++; // Now we're on the '{' char.
+									while (++i<end) {
+										if (array[i]=='}') {
+											addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+											i++;
+											if (i<end) {
+												c = array[i];
+												if (c=='"') { // The only rub - double-quote right after variable.
+													addToken(text, i,i, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+i);
+													currentTokenType = Token.NULL;
+													break;
+												}
+												else { // Continue on with the string.
+													currentTokenStart = i;
+													currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+													i--;
+													break;
+												}
+											}
+											else { // i==end = "trick" this method so that the string is continued to the next line.
+												currentTokenStart = i;
+												currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+												break; // So we don't hit the condition below.
+											}
+										} // End of if (array[i]=='}').
+									} // End of while (++i<end).
+									if (i==end) { // Happens when '}' wasn't found...
+										addToken(text, currentTokenStart,end-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+										currentTokenStart = end; // ???
+										currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+										break;
+									}
+								} // End of if (i<end-1 && array[i+1]=='{').
+								
+								// If we reached the end of the variable, get out.
+								if (currentTokenType==Token.NULL || currentTokenType==Token.LITERAL_STRING_DOUBLE_QUOTE)
+									break;
+
+								// If we didn't find the '{' character, find the end of the variable...
+								// Increment first to skip the '$'.
+								while (++i<end) {
+									c = array[i];
+									if (!RSyntaxUtilities.isLetterOrDigit(c) && shellVariables.indexOf(c)==-1 && c!='_') {
+										addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+										if (c=='"') { // The only rub.
+											addToken(text, i,i, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+i);
+											currentTokenType = Token.NULL;
+											break;
+										}
+										else {
+											currentTokenStart = i;
+											currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+											i--;
+											break;
+										}
+									}
+								}
+								
+								// This only happens if we never found the end of the variable in the loop above.
+								// We "trick" this method so that the double-quote string token is at the end.
+								if (i==end) {
+									addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+									currentTokenStart = i;
+									currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+								}
+								
+								break;
+								
+							// Otherwise, we're still in an unclosed string...
+							default:
+								backslash = false; // Need to set backslash to false here as a character was typed.
+
+						} // End of switch (c).
+				
+						break;
+
+			} // End of switch (currentTokenType).
+
+		} // End of for (int i=offset; i<end; i++).
+
+		switch (currentTokenType) {
+
+			// Remember what token type to begin the next line with.
+			case Token.LITERAL_BACKQUOTE:
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+			case Token.LITERAL_CHAR:
+						addToken(text, currentTokenStart,end-1, currentTokenType, newStartOffset+currentTokenStart);
+						break;
+
+			// Do nothing if everything was okay.
+			case Token.NULL:
+						addNullToken();
+						break;
+
+			// All other token types don't continue to the next line...
+			default:
+						addToken(text, currentTokenStart,end-1, currentTokenType, newStartOffset+currentTokenStart);
+						addNullToken();
+
+		}
+
+		// Return the first token in our linked list.
+		return firstToken;
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.flex
new file mode 100644
index 0000000..77bcb60
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.flex
@@ -0,0 +1,462 @@
+/*
+ * 03/24/2013
+ *
+ * VisualBasicTokenMaker.java - Scanner for Visual Basic
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Visual Basic.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated VisualBasicTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+%%
+
+%public
+%class VisualBasicTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public VisualBasicTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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 = YYINITIAL;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.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])
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({LetterOrUnderscore}|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit})
+
+LineTerminator			= (\n)
+WhiteSpace				= ([ \t\f])
+
+UnclosedStringLiteral	= ([\"][^\"]*)
+StringLiteral			= ({UnclosedStringLiteral}[\"])
+
+LineCommentBegin		= "'"
+
+NumTypeSuffix			= (([DRI\&SF]|"UI"|"UL"|"US")?)
+IntegerLiteral			= ({Digit}+{NumTypeSuffix})
+HexLiteral				= ("&h"{HexDigit}+{NumTypeSuffix})
+FloatHelper				= ([eE][+-]?{Digit}+{NumTypeSuffix})
+FloatLiteral1			= ({Digit}+"."({NumTypeSuffix}|{FloatHelper}|{Digit}+({NumTypeSuffix}|{FloatHelper})))
+FloatLiteral2			= ("."{Digit}+({NumTypeSuffix}|{FloatHelper}))
+FloatLiteral3			= ({Digit}+({NumTypeSuffix}|{FloatHelper}))
+FloatLiteral			= ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3})
+ErrorNumberFormat		= (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+BooleanLiteral			= ("true"|"false")
+
+Separator				= ([\(\)])
+Separator2				= ([\;,.])
+
+Operator				= ("&"|"&="|"*"|"*="|"+"|"+="|"="|"-"|"-="|"<<"|"<<="|">>"|">>="|"/"|"/="|"\\"|"\\="|"^"|"^=")
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier			= ({NonSeparator}+)
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"AddHandler" |
+	"AddressOf" |
+	"Alias" |
+	"And" |
+	"AndAlso" |
+	"As" |
+	"ByRef" |
+	"ByVal" |
+	"Call" |
+	"Case" |
+	"Catch" |
+	"CBool" |
+	"CByte" |
+	"CChar" |
+	"CDate" |
+	"CDbl" |
+	"CDec" |
+	"CInt" |
+	"Class" |
+	"CLng" |
+	"CObj" |
+	"Const" |
+	"Continue" |
+	"CSByte" |
+	"CShort" |
+	"CSng" |
+	"CStr" |
+	"CType" |
+	"CUInt" |
+	"CULng" |
+	"CUShort" |
+	"Declare" |
+	"Default" |
+	"Delegate" |
+	"Dim" |
+	"DirectCast" |
+	"Do" |
+	"Each" |
+	"Else" |
+	"ElseIf" |
+	"End" |
+	"EndIf" |
+	"Enum" |
+	"Erase" |
+	"Error" |
+	"Event" |
+	"Exit" |
+	"Finally" |
+	"For" |
+	"Friend" |
+	"Function" |
+	"Get" |
+	"GetType" |
+	"GetXMLNamespace" |
+	"Global" |
+	"GoSub" |
+	"GoTo" |
+	"Handles" |
+	"If" |
+	"If" |
+	"Implements" |
+	"Imports" |
+	"In" |
+	"Inherits" |
+	"Interface" |
+	"Is" |
+	"IsNot" |
+	"Let" |
+	"Lib" |
+	"Like" |
+	"Loop" |
+	"Me" |
+	"Mod" |
+	"Module" |
+	"Module Statement" |
+	"MustInherit" |
+	"MustOverride" |
+	"MyBase" |
+	"MyClass" |
+	"Namespace" |
+	"Narrowing" |
+	"New" |
+	"New" |
+	"Next" |
+	"Not" |
+	"Nothing" |
+	"NotInheritable" |
+	"NotOverridable" |
+	"Of" |
+	"On" |
+	"Operator" |
+	"Option" |
+	"Optional" |
+	"Or" |
+	"OrElse" |
+	"Out" |
+	"Overloads" |
+	"Overridable" |
+	"Overrides" |
+	"ParamArray" |
+	"Partial" |
+	"Private" |
+	"Property" |
+	"Protected" |
+	"Public" |
+	"RaiseEvent" |
+	"ReadOnly" |
+	"ReDim" |
+	"REM" |
+	"RemoveHandler" |
+	"Resume" |
+	"Select" |
+	"Set" |
+	"Shadows" |
+	"Shared" |
+	"Static" |
+	"Step" |
+	"Stop" |
+	"Structure" |
+	"Sub" |
+	"SyncLock" |
+	"Then" |
+	"Throw" |
+	"To" |
+	"Try" |
+	"TryCast" |
+	"TypeOf" |
+	"Using" |
+	"Variant" |
+	"Wend" |
+	"When" |
+	"While" |
+	"Widening" |
+	"With" |
+	"WithEvents" |
+	"WriteOnly" |
+	"Xor"						{ addToken(Token.RESERVED_WORD); }
+	"Return"					{ addToken(Token.RESERVED_WORD_2); }
+
+	/* Data types. */
+	"Boolean" |
+	"Byte" |
+	"Char" |
+	"Date" |
+	"Decimal" |
+	"Double" |
+	"Integer" |
+	"Long" |
+	"Object" |
+	"SByte" |
+	"Short" |
+	"Single" |
+	"String" |
+	"UInteger" |
+	"ULong" |
+	"UShort"					{ addToken(Token.DATA_TYPE); }
+
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+	{LineTerminator}			{ addNullToken(); return firstToken; }
+
+	{Identifier}				{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+				{ addToken(Token.WHITESPACE); }
+
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}		{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+
+	{LineCommentBegin}			{ start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
+
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}				{ addToken(Token.IDENTIFIER); }
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	{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); }
+
+	{ErrorIdentifier}			{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+
+<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; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.java
new file mode 100644
index 0000000..ab78314
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.java
@@ -0,0 +1,1619 @@
+/* The following code was generated by JFlex 1.4.1 on 3/24/13 12:59 AM */
+
+/*
+ * 03/24/2013
+ *
+ * VisualBasicTokenMaker.java - Scanner for Visual Basic
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Visual Basic.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated VisualBasicTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+
+public class VisualBasicTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** 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\11\1\10\1\0\1\11\1\5\22\0\1\64\1\37\1\12"+
+    "\1\6\1\1\1\37\1\16\1\13\2\36\1\41\1\27\1\37\1\27"+
+    "\1\30\1\44\1\3\11\3\1\47\1\37\1\42\1\40\1\43\1\37"+
+    "\1\6\1\35\1\54\1\4\1\15\1\26\1\34\1\57\1\25\1\21"+
+    "\1\60\1\63\1\22\1\61\1\52\1\53\1\46\1\1\1\14\1\24"+
+    "\1\31\1\17\1\56\1\50\1\62\1\55\1\1\1\37\1\7\1\37"+
+    "\1\45\1\2\1\0\1\35\1\54\1\4\1\51\1\26\1\33\1\57"+
+    "\1\65\1\20\1\60\1\63\1\22\1\61\1\52\1\53\1\46\1\1"+
+    "\1\32\1\23\1\31\1\17\1\56\1\66\1\62\1\55\1\1\3\5"+
+    "\1\37\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\1\1\1\2\1\3\2\2\1\4\1\5\1\6"+
+    "\1\7\1\10\2\2\1\4\6\2\1\4\4\2\1\11"+
+    "\1\4\13\2\1\12\1\13\6\12\1\14\1\3\2\14"+
+    "\1\15\13\2\1\16\5\2\1\17\1\0\3\2\3\17"+
+    "\47\2\1\17\14\2\1\12\2\0\3\12\2\0\1\15"+
+    "\1\0\1\15\1\14\24\2\1\17\7\2\1\20\24\2"+
+    "\1\17\2\2\1\17\11\2\1\17\13\2\1\17\12\2"+
+    "\1\17\3\2\1\17\2\2\1\12\2\0\3\12\2\0"+
+    "\2\2\1\21\14\2\1\20\1\14\16\2\1\22\17\2"+
+    "\1\17\17\2\1\12\1\0\2\12\1\23\1\0\52\2"+
+    "\1\0\1\12\1\0\1\2\1\24\21\2\1\17\6\2"+
+    "\1\17\14\2\1\0\10\2\1\0\3\2\1\0\2\2"+
+    "\6\0\1\17";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[417];
+    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\67\0\156\0\245\0\334\0\u0113\0\u014a\0\u0181"+
+    "\0\u014a\0\u01b8\0\u01ef\0\u014a\0\u0226\0\u025d\0\u0294\0\u02cb"+
+    "\0\u0302\0\u0339\0\u0370\0\u03a7\0\u03de\0\u0415\0\u044c\0\u0483"+
+    "\0\u04ba\0\u04f1\0\u014a\0\u014a\0\u0528\0\u055f\0\u0596\0\u05cd"+
+    "\0\u0604\0\u063b\0\u0672\0\u06a9\0\u06e0\0\u0717\0\u074e\0\u0785"+
+    "\0\u014a\0\u07bc\0\u07f3\0\u082a\0\u0861\0\u0898\0\u08cf\0\u0906"+
+    "\0\u0906\0\u093d\0\u0974\0\u09ab\0\u09e2\0\u0a19\0\u0a50\0\u0a87"+
+    "\0\u0abe\0\u0af5\0\u0b2c\0\u0b63\0\u0b9a\0\u0bd1\0\u0c08\0\u014a"+
+    "\0\u0c3f\0\u0c76\0\u0cad\0\u0ce4\0\u0d1b\0\u0d52\0\u0d89\0\u0dc0"+
+    "\0\u0df7\0\u0e2e\0\u0e65\0\245\0\u0e9c\0\u0ed3\0\u0f0a\0\u0f41"+
+    "\0\u0f78\0\u0faf\0\u0fe6\0\u101d\0\u1054\0\u108b\0\u10c2\0\u10f9"+
+    "\0\u1130\0\u1167\0\u119e\0\u11d5\0\u120c\0\u1243\0\u127a\0\u12b1"+
+    "\0\u12e8\0\u131f\0\u1356\0\u138d\0\u13c4\0\u13fb\0\u1432\0\u1469"+
+    "\0\u14a0\0\u14d7\0\u150e\0\u1545\0\u157c\0\u15b3\0\u15ea\0\u1621"+
+    "\0\u1658\0\u168f\0\u16c6\0\u16fd\0\u1734\0\u176b\0\u17a2\0\u17d9"+
+    "\0\u1810\0\u1847\0\u187e\0\u18b5\0\u18ec\0\u1923\0\u195a\0\u1991"+
+    "\0\u19c8\0\u19ff\0\u1a36\0\u1a6d\0\u1aa4\0\u1adb\0\u1b12\0\u1b49"+
+    "\0\u1b80\0\u1bb7\0\u1bee\0\u0906\0\u1c25\0\u1c5c\0\u1c93\0\u1cca"+
+    "\0\u1d01\0\u1d38\0\u1d6f\0\u1da6\0\u1ddd\0\u1e14\0\u1e4b\0\u1e82"+
+    "\0\u1eb9\0\u1ef0\0\u1f27\0\u1f5e\0\u1f95\0\u1fcc\0\u2003\0\u203a"+
+    "\0\u2071\0\u20a8\0\u20df\0\u2116\0\u214d\0\u2184\0\u21bb\0\u21f2"+
+    "\0\u2229\0\u2260\0\u2297\0\u22ce\0\u2305\0\u233c\0\u2373\0\u23aa"+
+    "\0\u23e1\0\u2418\0\u244f\0\u2486\0\u24bd\0\u24f4\0\u252b\0\u2562"+
+    "\0\u2599\0\u25d0\0\u2607\0\u263e\0\u2675\0\u26ac\0\u26e3\0\u271a"+
+    "\0\u2751\0\u2788\0\u27bf\0\u27f6\0\u282d\0\u2864\0\u289b\0\u28d2"+
+    "\0\u2909\0\u2940\0\u2977\0\u29ae\0\u29e5\0\u2a1c\0\u2a53\0\u2a8a"+
+    "\0\u2ac1\0\u2af8\0\u2b2f\0\u2b66\0\u2b9d\0\u2bd4\0\u2c0b\0\u2c42"+
+    "\0\u2c79\0\u2cb0\0\u2ce7\0\u2d1e\0\u2d55\0\u2d8c\0\u2dc3\0\u2dfa"+
+    "\0\u2e31\0\u2e68\0\u2e9f\0\u2ed6\0\u2f0d\0\u2f44\0\u2f7b\0\u2fb2"+
+    "\0\u2fe9\0\u3020\0\u3057\0\u308e\0\u30c5\0\u30fc\0\u3133\0\u316a"+
+    "\0\u31a1\0\u31d8\0\u320f\0\245\0\u3246\0\u327d\0\u32b4\0\u32eb"+
+    "\0\u3322\0\u3359\0\u3390\0\u33c7\0\u33fe\0\u3435\0\u346c\0\u34a3"+
+    "\0\u0906\0\u34da\0\u3511\0\u3548\0\u357f\0\u35b6\0\u35ed\0\u3624"+
+    "\0\u365b\0\u3692\0\u36c9\0\u3700\0\u3737\0\u376e\0\u37a5\0\u37dc"+
+    "\0\245\0\u3813\0\u384a\0\u3881\0\u38b8\0\u38ef\0\u3926\0\u395d"+
+    "\0\u3994\0\u39cb\0\u3a02\0\u3a39\0\u3a70\0\u3aa7\0\u3ade\0\u3b15"+
+    "\0\u3b4c\0\u3b83\0\u3bba\0\u3bf1\0\u3c28\0\u3c5f\0\u3c96\0\u3ccd"+
+    "\0\u3d04\0\u3d3b\0\u3d72\0\u3da9\0\u3de0\0\u3e17\0\u3e4e\0\u3e85"+
+    "\0\u3ebc\0\u3ef3\0\u3f2a\0\u3f61\0\u3f98\0\u3fcf\0\u4006\0\u403d"+
+    "\0\u4074\0\u40ab\0\u40e2\0\u4119\0\u4150\0\u4187\0\u41be\0\u41f5"+
+    "\0\u422c\0\u4263\0\u429a\0\u42d1\0\u4308\0\u433f\0\u4376\0\u43ad"+
+    "\0\u43e4\0\u441b\0\u4452\0\u4489\0\u44c0\0\u44f7\0\u452e\0\u4565"+
+    "\0\u459c\0\u45d3\0\u460a\0\u4641\0\u4678\0\u46af\0\u46e6\0\u471d"+
+    "\0\u4754\0\u478b\0\u47c2\0\u47f9\0\u4830\0\u4867\0\u489e\0\u48d5"+
+    "\0\u490c\0\u4943\0\u3f98\0\u497a\0\245\0\u49b1\0\u49e8\0\u2788"+
+    "\0\u4a1f\0\u4a56\0\u4a8d\0\u4ac4\0\u4afb\0\u4b32\0\u4b69\0\u4ba0"+
+    "\0\u4bd7\0\u4c0e\0\u4c45\0\u4c7c\0\u4cb3\0\u4cea\0\u2dfa\0\u4d21"+
+    "\0\u4d58\0\u4d8f\0\u4dc6\0\u4dfd\0\u4e34\0\u4e6b\0\u4ea2\0\u4ed9"+
+    "\0\u4f10\0\u4f47\0\u4f7e\0\u4fb5\0\u4fec\0\u5023\0\u505a\0\u5091"+
+    "\0\u50c8\0\u50ff\0\u5136\0\u516d\0\u51a4\0\u51db\0\u5212\0\u5249"+
+    "\0\u5280\0\u52b7\0\u52ee\0\u5325\0\u535c\0\u5393\0\u53ca\0\u5401"+
+    "\0\u5438\0\u546f\0\u54a6\0\u54dd\0\u5514\0\u554b\0\u5582\0\u55b9"+
+    "\0\u014a";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[417];
+    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\7\1\3\1\10\1\11"+
+    "\1\12\1\13\1\14\1\15\1\16\1\17\1\20\2\21"+
+    "\1\22\2\23\1\24\1\25\1\26\1\27\1\30\1\15"+
+    "\2\31\1\32\1\33\1\7\1\34\1\26\1\35\1\36"+
+    "\2\26\1\37\1\7\1\40\1\16\1\41\1\42\1\43"+
+    "\1\4\1\44\1\45\1\4\1\46\1\47\1\4\1\12"+
+    "\1\24\1\40\10\50\1\51\14\50\1\52\5\50\1\53"+
+    "\1\54\13\50\1\55\14\50\1\56\1\57\5\3\1\0"+
+    "\2\3\4\0\2\3\1\0\10\3\2\0\5\3\10\0"+
+    "\1\3\1\0\14\3\1\0\3\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\3\60\1\5\1\60\1\0"+
+    "\2\60\4\0\3\61\1\62\1\60\1\61\2\60\1\61"+
+    "\1\60\1\63\1\0\1\64\3\60\1\61\1\60\10\0"+
+    "\1\60\1\0\14\60\1\0\2\60\1\3\3\4\1\65"+
+    "\1\0\2\3\4\0\1\4\1\66\1\0\1\67\2\70"+
+    "\1\71\2\72\1\73\1\4\2\0\1\74\3\4\1\75"+
+    "\10\0\1\4\1\0\1\4\1\66\1\4\1\76\1\77"+
+    "\7\4\1\0\1\73\1\4\67\0\5\3\1\0\2\3"+
+    "\4\0\2\3\1\0\10\3\2\0\5\3\2\0\1\34"+
+    "\5\0\1\3\1\0\14\3\1\0\2\3\11\0\1\12"+
+    "\52\0\1\12\2\0\12\13\1\100\54\13\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\7\4\1\101\2\0"+
+    "\4\4\1\102\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\1\4"+
+    "\2\103\4\4\1\104\2\0\4\4\1\105\10\0\1\4"+
+    "\1\0\3\4\1\106\10\4\1\0\2\4\25\0\1\107"+
+    "\12\0\1\34\24\0\1\107\1\0\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\1\4\2\110\1\111\2\112"+
+    "\2\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\4\4\2\113\2\4\2\0\2\4\2\114\1\4\10\0"+
+    "\1\4\1\0\2\4\1\115\6\4\1\116\2\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\1\4\2\117\4\4\1\120\2\0\5\4\10\0\1\4"+
+    "\1\0\3\4\1\121\10\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\1\122\2\123\3\4"+
+    "\1\124\1\125\2\0\1\126\4\4\10\0\1\4\1\0"+
+    "\4\4\1\127\1\130\6\4\1\0\1\124\1\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\4\4\1\131\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\1\132\1\4\1\0"+
+    "\3\4\1\133\4\4\2\0\1\4\1\132\2\4\1\134"+
+    "\10\0\1\4\1\0\2\4\1\135\3\4\1\136\3\4"+
+    "\1\137\1\4\1\0\2\4\40\0\1\34\31\0\1\64"+
+    "\63\0\1\3\4\4\1\0\2\3\4\0\1\140\1\4"+
+    "\1\0\6\4\1\141\1\4\2\0\1\4\1\140\3\4"+
+    "\10\0\1\4\1\0\3\4\1\114\1\4\1\142\6\4"+
+    "\1\0\1\141\1\4\1\3\4\4\1\0\2\3\4\0"+
+    "\1\143\1\4\1\0\1\144\2\145\5\4\2\0\1\4"+
+    "\1\143\2\4\1\146\10\0\1\4\1\0\3\4\1\147"+
+    "\10\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\1\4\1\150\1\0\3\4\1\151\2\114\2\4\2\0"+
+    "\5\4\10\0\1\4\1\0\1\4\1\150\1\152\11\4"+
+    "\1\0\2\4\42\0\1\26\67\0\1\26\23\0\1\3"+
+    "\4\4\1\0\2\3\4\0\1\153\1\4\1\0\1\154"+
+    "\7\4\2\0\1\4\1\153\2\4\1\155\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\1\156\1\4\1\0\1\4\2\157\3\4\1\160"+
+    "\1\161\2\0\1\4\1\156\3\4\10\0\1\4\1\0"+
+    "\14\4\1\0\1\160\1\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\7\4\1\162\2\0\4\4\1\163"+
+    "\10\0\1\4\1\0\3\4\1\164\10\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\1\165\1\4\1\0"+
+    "\1\120\7\4\2\0\1\4\1\165\2\114\1\4\10\0"+
+    "\1\166\1\0\2\4\1\114\1\4\1\167\1\4\1\170"+
+    "\5\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+    "\3\4\1\171\1\4\1\172\6\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\4\4\1\173\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\3\4"+
+    "\1\174\3\4\1\175\2\0\5\4\10\0\1\4\1\0"+
+    "\3\4\1\176\10\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\1\177\6\4\1\114\2\0"+
+    "\5\4\10\0\1\4\1\0\3\4\1\200\1\4\1\201"+
+    "\6\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+    "\3\4\1\147\10\4\1\0\2\4\10\50\1\0\22\50"+
+    "\1\0\31\50\2\0\10\50\1\0\20\50\1\202\1\50"+
+    "\1\0\31\50\22\0\2\203\7\0\1\204\35\0\10\50"+
+    "\1\0\7\50\2\205\7\50\1\206\1\50\1\0\31\50"+
+    "\2\0\10\50\1\0\22\50\1\0\14\50\1\207\14\50"+
+    "\1\0\1\210\31\0\1\211\105\0\1\210\15\0\1\210"+
+    "\5\60\1\0\2\60\4\0\2\60\1\0\10\60\2\0"+
+    "\5\60\10\0\1\60\1\0\14\60\1\0\7\60\1\0"+
+    "\2\60\4\0\2\60\1\0\1\60\5\61\2\60\2\0"+
+    "\5\60\10\0\1\60\1\0\14\60\1\0\5\60\1\212"+
+    "\1\60\1\0\2\60\4\0\2\60\1\0\10\60\1\213"+
+    "\1\0\5\60\10\0\1\60\1\0\14\60\1\0\5\60"+
+    "\1\64\1\60\1\0\2\60\4\0\3\214\1\215\1\60"+
+    "\1\214\2\60\1\214\1\60\1\63\2\0\3\60\1\214"+
+    "\1\60\10\0\1\60\1\0\14\60\1\0\2\60\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\6\4\1\216"+
+    "\1\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\1\216\1\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\7\4\1\217\2\0\4\4\1\220\10\0\1\4"+
+    "\1\0\4\4\1\221\7\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\1\4\2\70\1\222"+
+    "\2\223\2\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\2\4"+
+    "\1\120\11\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\4\4\1\224\10\0"+
+    "\1\4\1\0\2\4\1\225\11\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\6\4\1\226"+
+    "\1\4\2\0\1\147\4\4\10\0\1\4\1\0\2\4"+
+    "\1\225\1\4\1\227\7\4\1\0\1\226\1\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\4\4\1\230\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\5\4\1\231\6\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\3\4\1\221\2\232\2\4\2\0\1\134\4\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\2\4\1\233\1\4\1\234\7\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\3\4"+
+    "\1\235\1\4\1\220\6\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\1\4\1\236\1\0\4\4\2\237"+
+    "\2\4\2\0\1\240\3\4\1\241\10\0\1\4\1\0"+
+    "\1\4\1\236\7\4\1\242\2\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\1\4\2\243"+
+    "\5\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\1\244\1\4"+
+    "\1\0\10\4\2\0\1\4\1\244\3\4\10\0\1\4"+
+    "\1\0\11\4\1\114\2\4\1\0\2\4\1\3\3\4"+
+    "\1\245\1\0\2\3\4\0\2\4\1\0\3\4\1\246"+
+    "\4\4\2\0\2\4\2\247\1\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\1\250\4\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\1\251\7\4\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\3\0\2\252\10\0"+
+    "\1\252\10\0\1\252\4\0\3\252\13\0\1\252\2\0"+
+    "\1\252\12\0\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\2\4"+
+    "\1\253\11\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+    "\1\0\3\4\1\254\10\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\1\4\2\222\3\4"+
+    "\1\255\1\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\1\255\1\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+    "\2\4\1\256\11\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\6\4\1\257\1\4\2\0"+
+    "\1\260\4\4\10\0\1\4\1\0\14\4\1\0\1\257"+
+    "\1\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\5\4\10\0\1\261\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\5\4\10\0\1\4\1\0\4\4\1\114"+
+    "\6\4\1\232\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\1\114\4\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+    "\1\4\1\0\2\4\1\262\1\263\10\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\4\4\1\114\7\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\2\4"+
+    "\1\264\11\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\4\4\1\265\10\0"+
+    "\1\4\1\0\3\4\1\266\10\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\3\4\1\267"+
+    "\4\4\2\0\1\114\4\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\1\270"+
+    "\1\4\1\0\7\4\1\263\2\0\1\4\1\270\2\4"+
+    "\1\271\10\0\1\4\1\0\3\4\1\263\10\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\5\4\10\0\1\4\1\0\5\4\1\105"+
+    "\6\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+    "\2\4\1\272\11\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+    "\1\4\1\0\2\4\1\273\11\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\1\47\1\4\1\0\10\4"+
+    "\2\0\1\4\1\47\2\4\1\274\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\4\4\2\275\2\4\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\3\4\1\276"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\1\4\1\277\1\0\1\300\7\4"+
+    "\2\0\5\4\10\0\1\4\1\0\1\4\1\277\12\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\7\4\1\70\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\1\4\2\120\5\4\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\1\301\7\4\2\0\5\4"+
+    "\10\0\1\4\1\0\5\4\1\302\6\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\1\303\1\4\1\0"+
+    "\7\4\1\304\2\0\1\4\1\303\3\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\305"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\1\4\2\306\5\4\2\0\5\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\2\4\1\307\11\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\2\4\1\310\11\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\3\4\1\311\4\4\2\0\5\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\1\114\1\4\1\0\10\4\2\0\1\4\1\114"+
+    "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\1\4\1\312\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\1\4\1\312\12\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\1\4\2\313\5\4\2\0\5\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\1\4\1\314\1\0\10\4\2\0\5\4\10\0"+
+    "\1\4\1\0\1\4\1\314\12\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\1\4\2\315"+
+    "\5\4\2\0\5\4\10\0\1\4\1\0\3\4\1\316"+
+    "\10\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+    "\4\4\1\317\7\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\1\320\1\4\1\0\10\4\2\0\1\4"+
+    "\1\320\3\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\1\4"+
+    "\2\321\5\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\1\4"+
+    "\1\322\1\0\10\4\2\0\1\323\4\4\10\0\1\4"+
+    "\1\0\1\4\1\322\12\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\1\4\2\324\4\4"+
+    "\1\304\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\5\4\10\0\1\4\1\0\2\4\1\325"+
+    "\11\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+    "\1\114\11\4\1\120\1\4\1\0\1\4\1\114\1\3"+
+    "\4\4\1\0\2\3\4\0\1\326\1\4\1\0\10\4"+
+    "\2\0\1\4\1\326\3\4\10\0\1\4\1\0\11\4"+
+    "\1\327\2\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\1\330\4\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\7\4\1\331\2\0\5\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\7\4\1\332\2\0"+
+    "\1\333\4\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\10\4\1\334\3\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\7\4\1\335\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+    "\3\4\1\336\10\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\1\337\1\4\1\0\10\4\2\0\1\250"+
+    "\1\337\3\4\10\0\1\4\1\0\6\4\1\340\5\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\1\341"+
+    "\1\4\1\0\10\4\2\0\1\4\1\341\3\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+    "\1\4\1\0\3\4\1\342\10\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\1\343\4\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\4\4"+
+    "\2\344\2\4\2\0\1\345\4\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\4\4\2\346\2\4\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\1\4\1\347\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\1\4\1\347\12\4\1\0\2\4"+
+    "\1\3\3\4\1\350\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\5\4\10\0\1\4\1\0\4\4\1\351"+
+    "\7\4\1\0\2\4\10\50\1\0\20\50\1\352\1\50"+
+    "\1\0\31\50\24\0\1\353\112\0\1\354\20\0\10\50"+
+    "\1\0\11\50\1\355\10\50\1\0\31\50\2\0\10\50"+
+    "\1\0\22\50\1\0\12\50\1\356\16\50\2\0\10\50"+
+    "\1\0\22\50\1\0\14\50\1\357\14\50\1\0\1\360"+
+    "\50\0\1\360\15\0\1\360\31\0\1\361\35\0\3\60"+
+    "\1\212\1\60\1\0\2\60\4\0\3\214\1\215\1\60"+
+    "\1\214\2\60\1\214\2\60\2\0\3\60\1\214\1\60"+
+    "\10\0\1\60\1\0\14\60\1\0\2\60\3\0\1\212"+
+    "\63\0\5\60\1\0\2\60\4\0\2\60\1\0\1\60"+
+    "\5\214\2\60\2\0\5\60\10\0\1\60\1\0\14\60"+
+    "\1\0\2\60\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\4\4\1\147\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\3\4\1\114\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\1\232\4\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\3\4\1\114\4\4\2\0"+
+    "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\5\4\10\0\1\4\1\0\2\4\1\225\11\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\6\4\1\226\1\4\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\1\226\1\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\4\4\2\362\2\4\2\0\5\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\7\4\1\114\4\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\3\4\1\363\10\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\5\4"+
+    "\1\220\6\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\1\364\1\4\1\0\10\4\2\0\1\4\1\364"+
+    "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\5\4\10\0\1\232\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\7\4\1\114"+
+    "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\4\4"+
+    "\2\120\2\4\2\0\1\365\4\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+    "\10\4\1\114\3\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+    "\1\4\1\0\3\4\1\221\10\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\1\4\2\300"+
+    "\5\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\1\366\7\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\1\367\7\4\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\1\4\1\370\1\0\10\4\2\0\5\4\10\0\1\4"+
+    "\1\0\1\4\1\370\12\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\3\4\1\371\10\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\4\4"+
+    "\2\372\2\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\7\4\1\373\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\1\4\2\374\1\375\4\4\2\0\5\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\7\4\1\376\2\0"+
+    "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\4\4\1\377\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+    "\1\364\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\5\4\10\0\1\4\1\0\4\4\1\u0100"+
+    "\7\4\1\0\2\4\3\60\2\252\1\0\2\60\4\0"+
+    "\1\u0101\1\252\1\u0101\1\u0102\1\60\1\u0101\2\60\1\u0101"+
+    "\1\60\1\252\2\0\2\60\3\252\10\0\1\60\1\0"+
+    "\1\60\1\252\2\60\1\252\7\60\1\0\2\60\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\1\u0103\4\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\2\4\1\262\11\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\3\4"+
+    "\1\266\10\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+    "\1\0\3\4\1\120\10\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\7\4\1\u0104\2\0"+
+    "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\7\4\1\u0105"+
+    "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\3\4"+
+    "\1\u0106\4\4\2\0\5\4\10\0\1\4\1\0\3\4"+
+    "\1\u0107\10\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+    "\1\0\7\4\1\364\4\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\114\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\7\4\1\u0100\4\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\1\u0108\1\u0109\1\0"+
+    "\10\4\2\0\1\4\1\u0108\3\4\10\0\1\4\1\0"+
+    "\1\4\1\u0109\12\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\1\u010a\1\4\1\0\10\4\2\0\1\4"+
+    "\1\u010a\3\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+    "\1\u010b\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\1\u010c\2\254\5\4\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\1\u010d\4\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\3\4\1\u010e\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\1\4\1\u010f\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\1\4\1\u010f\12\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\4\4"+
+    "\2\232\2\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\7\4\1\277\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\6\4\1\114\1\4\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\1\114\1\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\1\4\2\u0110\5\4"+
+    "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\11\4\1\114\2\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\7\4\1\u0111\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\3\4\1\u0112\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+    "\1\0\3\4\1\u0113\10\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\2\4\1\114\11\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+    "\1\u0114\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\7\4\1\161\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\3\4\1\u0115\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\4\4\1\u0116\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\4\4\2\301\2\4\2\0\5\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\1\u0117\1\4\1\0\6\4\1\u0118"+
+    "\1\4\2\0\1\4\1\u0117\3\4\10\0\1\4\1\0"+
+    "\14\4\1\0\1\u0118\1\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\4\4\1\362\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\4\4\1\u0119"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\6\4\1\u011a\5\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\1\u011b\4\4\10\0\1\u011c\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\3\4\1\u010d\4\4\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\1\u011d\3\4\1\u011e\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\1\u011f\4\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\7\4\1\u0120\2\0"+
+    "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\6\4\1\u0121"+
+    "\1\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\1\u0121\1\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\3\4\1\232\4\4\2\0\5\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\1\4\1\114\1\0\10\4\2\0\5\4\10\0"+
+    "\1\4\1\0\1\4\1\114\12\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\1\u0122\1\4\1\0\10\4"+
+    "\2\0\1\4\1\u0122\3\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\7\4\1\u0123\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\1\4\2\u0124\3\4\1\u0125\1\4\2\0"+
+    "\5\4\10\0\1\4\1\0\3\4\1\u0126\10\4\1\0"+
+    "\1\u0125\1\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\3\4\1\274\4\4\2\0\5\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\1\u0127\1\4\1\0\10\4\2\0\1\4\1\u0127"+
+    "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\1\4\2\u0128"+
+    "\5\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\7\4\1\u0129\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\1\u012a"+
+    "\1\4\1\0\10\4\2\0\1\4\1\u012a\3\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\3\4\1\u012b\4\4\2\0"+
+    "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\7\4\1\u0110"+
+    "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\4\4\1\221\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\1\4\2\u012c\5\4\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+    "\4\4\1\340\7\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\1\74\4\4"+
+    "\10\0\1\4\1\0\12\4\1\u012d\1\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\1\122"+
+    "\7\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\5\4\10\0\1\4\1\0\3\4\1\114"+
+    "\10\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\1\u012e\4\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\1\u012f\7\4\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\3\4\1\u0130\4\4\2\0"+
+    "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\4\4\1\274\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\10\50\1\0\22\50\1\0\12\50\1\u0131\16\50\30\0"+
+    "\1\354\107\0\1\u0132\17\0\10\50\1\0\15\50\1\356"+
+    "\4\50\1\0\31\50\2\0\10\50\1\0\22\50\1\0"+
+    "\13\50\1\u0133\15\50\2\0\10\50\1\0\17\50\1\u0134"+
+    "\2\50\1\0\31\50\32\0\1\u0135\104\0\1\u0136\20\0"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\4\4"+
+    "\2\114\2\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\1\120"+
+    "\1\4\1\0\10\4\2\0\1\4\1\120\3\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\1\4\2\u0137\5\4\2\0"+
+    "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\5\4\10\0\1\4\1\0\11\4\1\232\2\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\1\u0138\1\4"+
+    "\1\0\10\4\2\0\1\4\1\u0138\3\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+    "\1\0\3\4\1\u0139\10\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\6\4\1\u013a\5\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+    "\1\u013b\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\3\4\1\u013c\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\11\4"+
+    "\1\u013d\2\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\4\4\1\u013e\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+    "\1\4\1\0\7\4\1\u011a\4\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\1\u013f\7\4"+
+    "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\3\4"+
+    "\1\250\4\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\5\60\1\0\2\60\4\0\2\60\1\0"+
+    "\1\60\5\u0101\2\60\2\0\5\60\10\0\1\60\1\0"+
+    "\14\60\1\0\2\60\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\7\4\1\u0140\2\0\5\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\1\u0141\1\4\1\0\10\4\2\0\1\4\1\u0141"+
+    "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\1\u0142\1\4\1\0\10\4"+
+    "\2\0\1\4\1\u0142\3\4\10\0\1\4\1\0\7\4"+
+    "\1\u0143\4\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\7\4\1\u0144\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\1\u0145\1\4\1\0\10\4\2\0\1\4"+
+    "\1\u0145\3\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+    "\1\325\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\5\4\10\0\1\4\1\0\3\4\1\u0146"+
+    "\10\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\1\364\4\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\3\4\1\120\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\3\4\1\u0147"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\1\4\2\217\5\4"+
+    "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\3\4"+
+    "\1\u0148\4\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\3\4\1\u0149\4\4\2\0\5\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\2\4\2\114\1\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\4\4"+
+    "\1\u014a\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\5\4\10\0\1\4\1\0\1\114\13\4\1\0\1\4"+
+    "\1\114\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\5\4\10\0\1\4\1\0\3\4\1\u0110"+
+    "\10\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\1\u014b\4\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\3\4\1\u014c\4\4\2\0\5\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\7\4\1\u014d\2\0"+
+    "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\4\4\1\u014e\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\3\4"+
+    "\1\u014f\4\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\4\4\1\220\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\7\4\1\u0150\2\0\5\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\7\4\1\u0151\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\1\4\2\340\5\4\2\0"+
+    "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\5\4\10\0\1\4\1\0\11\4\1\u0152\2\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\7\4\1\370\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\2\4"+
+    "\1\u0125\11\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\7\4\1\u0153\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+    "\1\4\1\0\3\4\1\u0154\10\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\4\4\2\u0155"+
+    "\2\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\5\4\10\0\1\4\1\0\2\4\1\u0156"+
+    "\11\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\1\4\2\222\5\4\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+    "\1\4\1\0\6\4\1\u0157\5\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\4\4\1\u0158\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\3\4\1\u0159\10\4"+
+    "\1\0\2\4\1\3\3\4\1\u010a\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\1\u015a\1\4\1\0\3\4\1\u015b\4\4\2\0\1\4"+
+    "\1\u015a\3\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+    "\1\u015c\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\4\4\1\70\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\11\4"+
+    "\1\u015d\2\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\1\4\2\u015e\5\4\2\0\5\4"+
+    "\10\0\1\4\1\0\3\4\1\u015f\10\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\3\4"+
+    "\1\u0160\4\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\4\4\1\224\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\10\50\1\0\12\50\2\356\6\50"+
+    "\1\0\13\50\1\u0133\15\50\46\0\1\u0161\22\0\10\50"+
+    "\1\0\22\50\1\0\10\50\1\u0162\20\50\2\0\1\50"+
+    "\4\u0134\1\50\1\u0134\1\50\1\0\2\50\20\u0134\1\u0135"+
+    "\6\u0134\2\50\1\u0134\1\50\16\u0134\1\50\2\u0135\1\0"+
+    "\1\u0135\1\u0163\2\u0135\1\0\1\u0163\4\0\1\u0163\2\u0135"+
+    "\1\u0163\10\u0135\2\u0163\5\u0135\4\u0163\2\0\1\u0135\1\0"+
+    "\1\u0135\1\u0163\14\u0135\1\0\2\u0135\23\0\2\354\22\0"+
+    "\1\u0132\17\0\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\2\4"+
+    "\1\u0164\11\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+    "\1\0\2\4\1\u0165\11\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\2\4\1\u014c\11\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+    "\1\u0166\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\7\4\1\u0167\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\1\u0168\4\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\4\4\1\u0169\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\1\232\1\4\1\0\10\4\2\0\1\4\1\232"+
+    "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\3\4\1\120"+
+    "\4\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\5\4\10\0\1\4\1\0\7\4\1\u0143"+
+    "\4\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\1\4\2\u0145\5\4\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\2\4\2\u016a"+
+    "\1\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\7\4\1\230"+
+    "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\11\4\1\u016b\2\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\1\362\4\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+    "\1\362\13\4\1\0\1\4\1\362\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\1\u016c\4\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\3\4\1\u016d\10\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+    "\1\362\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\4\4\2\120\2\4\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\1\4\2\u016e\5\4\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\3\4\1\u016f\4\4\2\0"+
+    "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\4\4\2\u0170"+
+    "\2\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\5\4\10\0\1\4\1\0\2\4\1\u0171"+
+    "\11\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\4\4\2\345\2\4\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\3\4\1\u0172"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\1\u0173\1\4\1\0\10\4\2\0"+
+    "\1\4\1\u0173\3\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\4\4\1\u0174\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\6\4"+
+    "\1\u016b\5\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+    "\1\0\1\u0125\13\4\1\0\1\4\1\u0125\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\u016a\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\6\4\1\u0175\1\4"+
+    "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\1\u0175"+
+    "\1\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\7\4\1\u0176\2\0\5\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\1\47\4\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+    "\2\4\1\u0177\11\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\1\4\2\u0178\5\4\2\0"+
+    "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\5\4\10\0\1\4\1\0\3\4\1\u0179\10\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\4\4\1\u017a\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\3\4\1\u017b\4\4\2\0\5\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+    "\1\0\2\4\1\u017c\11\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\6\4\1\u017d\5\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+    "\1\u017e\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+    "\2\4\44\0\1\u0135\22\0\10\50\1\0\22\50\1\0"+
+    "\10\50\1\u0134\20\50\2\0\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\1\232\7\4\2\0\5\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\6\4\1\u0118\1\4\2\0"+
+    "\5\4\10\0\1\4\1\0\14\4\1\0\1\u0118\1\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\6\4\1\136\5\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\3\4\1\364\4\4\2\0\5\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\10\4\2\0\4\4\1\u017f\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\7\4\1\u0180\2\0\5\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\1\u013e\7\4\2\0"+
+    "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\3\4\1\u0181\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\3\4\1\304\10\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\5\4"+
+    "\1\114\6\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\4\4\2\u0114\2\4\2\0\5\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\1\4\1\u0182\1\0\10\4\2\0"+
+    "\5\4\10\0\1\4\1\0\1\4\1\u0182\12\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\1\u0108\4\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\1\u016f\4\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\1\u0183\1\4\1\0\10\4\2\0\1\4\1\u0183\3\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\7\4\1\u0184\2\0"+
+    "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\1\u0185\1\4\1\0\10\4"+
+    "\2\0\1\4\1\u0185\3\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\1\4"+
+    "\1\u0186\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+    "\1\4\1\u0186\12\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\4\4\1\u0187"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\2\4\1\364\11\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\2\4\1\u0188\11\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\6\4\1\u0189\1\4\2\0\5\4\10\0\1\4"+
+    "\1\0\14\4\1\0\1\u0189\1\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\7\4\1\u018a\2\0\5\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+    "\10\0\1\4\1\0\14\4\1\u018b\2\4\1\3\3\4"+
+    "\1\232\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+    "\5\4\10\0\1\4\1\0\2\4\1\u0145\11\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\10\4\2\0\5\4\10\0\1\4\1\0\13\4\1\114"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\3\4\1\u018c\4\4\2\0\5\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\1\u018d\1\4\1\0\10\4\2\0\1\4\1\u018d"+
+    "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\1\u018e\1\4\1\0\10\4"+
+    "\2\0\1\4\1\u018e\3\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\1\u018f"+
+    "\1\4\1\0\10\4\2\0\1\4\1\u018f\3\4\10\0"+
+    "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\7\4\1\362\2\0\4\4"+
+    "\1\u0190\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\1\4\1\362\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\1\4\1\362\12\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\4\4\1\u0191\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\7\4\1\u0192\2\0\5\4\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\1\u0193\1\4\1\0\10\4\2\0\1\4\1\u0193"+
+    "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\23\0"+
+    "\2\u0194\42\0\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\7\4\1\147\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+    "\2\4\1\0\10\4\2\0\4\4\1\u016f\10\0\1\4"+
+    "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\2\4\1\0\1\4\2\u0195\5\4\2\0\5\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\1\4\2\u0196\5\4"+
+    "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+    "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\4\4\1\324\7\4"+
+    "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+    "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\11\4"+
+    "\1\327\2\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+    "\4\0\1\137\1\4\1\0\10\4\2\0\1\4\1\137"+
+    "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\1\u0197\1\4\1\0\10\4"+
+    "\2\0\1\4\1\u0197\3\4\10\0\1\4\1\0\14\4"+
+    "\1\0\2\4\31\0\1\u0198\35\0\1\3\4\4\1\0"+
+    "\2\3\4\0\2\4\1\0\10\4\2\0\1\u0199\4\4"+
+    "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+    "\1\0\2\3\4\0\1\4\1\u0199\1\0\10\4\2\0"+
+    "\5\4\10\0\1\4\1\0\1\4\1\u0199\12\4\1\0"+
+    "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+    "\1\4\2\u019a\5\4\2\0\5\4\10\0\1\4\1\0"+
+    "\14\4\1\0\2\4\35\0\1\u019b\31\0\1\3\4\4"+
+    "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\4\4"+
+    "\1\u0190\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+    "\4\4\1\0\2\3\4\0\1\4\1\232\1\0\10\4"+
+    "\2\0\5\4\10\0\1\4\1\0\1\4\1\232\12\4"+
+    "\1\0\2\4\31\0\1\u019c\63\0\1\u019d\121\0\1\u019e"+
+    "\33\0\1\u019f\112\0\1\u01a0\45\0\1\u01a1\35\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[22000];
+    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\4\1\1\11\1\1\1\11\2\1\1\11\16\1"+
+    "\2\11\14\1\1\11\26\1\1\11\6\1\1\0\73\1"+
+    "\2\0\3\1\2\0\1\1\1\0\137\1\2\0\3\1"+
+    "\2\0\100\1\1\0\3\1\1\0\52\1\1\0\1\1"+
+    "\1\0\47\1\1\0\10\1\1\0\3\1\1\0\2\1"+
+    "\6\0\1\11";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[417];
+    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;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public VisualBasicTokenMaker() {
+	}
+
+
+	/**
+	 * 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;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		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 = YYINITIAL;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 VisualBasicTokenMaker(java.io.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 VisualBasicTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 184) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 21: break;
+        case 6: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 22: break;
+        case 16: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 23: break;
+        case 13: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 24: break;
+        case 15: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 25: break;
+        case 9: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 26: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 27: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 28: break;
+        case 7: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 29: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 30: break;
+        case 17: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 31: break;
+        case 18: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 32: break;
+        case 14: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 33: break;
+        case 19: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 34: break;
+        case 20: 
+          { addToken(Token.RESERVED_WORD_2);
+          }
+        case 35: break;
+        case 12: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 36: break;
+        case 8: 
+          { start = zzMarkedPos-1; yybegin(EOL_COMMENT);
+          }
+        case 37: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 38: break;
+        case 4: 
+          { addToken(Token.OPERATOR);
+          }
+        case 39: break;
+        case 10: 
+          { 
+          }
+        case 40: 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 418: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 419: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/WindowsBatchTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/WindowsBatchTokenMaker.java
new file mode 100644
index 0000000..302aa57
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/WindowsBatchTokenMaker.java
@@ -0,0 +1,603 @@
+/*
+ * 03/07/2004
+ *
+ * WindowsBatchTokenMaker.java - Scanner for Windows batch files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A token maker that turns text into a linked list of
+ * <code>Token</code>s for syntax highlighting Microsoft
+ * Windows batch files.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class WindowsBatchTokenMaker extends AbstractTokenMaker {
+
+	protected final String operators = "@:*<>=?";
+
+	private int currentTokenStart;
+	private int currentTokenType;
+
+	private boolean bracketVariable;			// Whether a variable is of the format %{...}
+
+
+	/**
+	 * Constructor.
+	 */
+	public WindowsBatchTokenMaker() {
+		super();	// Initializes tokensToHighlight.
+	}
+
+
+	/**
+	 * Checks the token to give it the exact ID it deserves before
+	 * being passed up to the super method.
+	 *
+	 * @param segment <code>Segment</code> to get text from.
+	 * @param start Start offset in <code>segment</code> of token.
+	 * @param end End offset in <code>segment</code> of token.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which the token occurs.
+	 */
+	public void addToken(Segment segment, int start, int end, int tokenType, int startOffset) {
+
+		switch (tokenType) {
+			// Since reserved words, functions, and data types are all passed
+			// into here as "identifiers," we have to see what the token
+			// really is...
+			case Token.IDENTIFIER:
+				int value = wordsToHighlight.get(segment, start,end);
+				if (value!=-1)
+					tokenType = value;
+				break;
+		}
+
+		super.addToken(segment, start, end, tokenType, startOffset);
+
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "rem ", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * Returns the words to highlight for Windows batch files.
+	 *
+	 * @return A <code>TokenMap</code> containing the words to highlight for
+	 *         Windows batch files.
+	 * @see org.fife.ui.rsyntaxtextarea.AbstractTokenMaker#getWordsToHighlight
+	 */
+	public TokenMap getWordsToHighlight() {
+
+		TokenMap tokenMap = new TokenMap(true); // Ignore case.
+
+		int reservedWord = Token.RESERVED_WORD;
+		tokenMap.put("call",			reservedWord);
+		tokenMap.put("choice",		reservedWord);
+		tokenMap.put("cls",			reservedWord);
+		tokenMap.put("echo",			reservedWord);
+		tokenMap.put("exit",			reservedWord);
+		tokenMap.put("goto",			reservedWord);
+		tokenMap.put("if",			reservedWord);
+		tokenMap.put("pause",		reservedWord);
+		tokenMap.put("shift",		reservedWord);
+		tokenMap.put("start",		reservedWord);
+
+		tokenMap.put("ansi.sys",		reservedWord);
+		tokenMap.put("append",		reservedWord);
+		tokenMap.put("arp",			reservedWord);
+		tokenMap.put("assign",		reservedWord);
+		tokenMap.put("assoc",		reservedWord);
+		tokenMap.put("at",			reservedWord);
+		tokenMap.put("attrib",		reservedWord);
+		tokenMap.put("break",		reservedWord);
+		tokenMap.put("cacls",		reservedWord);
+		tokenMap.put("call",			reservedWord);
+		tokenMap.put("cd",			reservedWord);
+		tokenMap.put("chcp",			reservedWord);
+		tokenMap.put("chdir",		reservedWord);
+		tokenMap.put("chkdsk",		reservedWord);
+		tokenMap.put("chknfts",		reservedWord);
+		tokenMap.put("choice",		reservedWord);
+		tokenMap.put("cls",			reservedWord);
+		tokenMap.put("cmd",			reservedWord);
+		tokenMap.put("color",		reservedWord);
+		tokenMap.put("comp",			reservedWord);
+		tokenMap.put("compact",		reservedWord);
+		tokenMap.put("control",		reservedWord);
+		tokenMap.put("convert",		reservedWord);
+		tokenMap.put("copy",			reservedWord);
+		tokenMap.put("ctty",			reservedWord);
+		tokenMap.put("date",			reservedWord);
+		tokenMap.put("debug",		reservedWord);
+		tokenMap.put("defrag",		reservedWord);
+		tokenMap.put("del",			reservedWord);
+		tokenMap.put("deltree",		reservedWord);
+		tokenMap.put("dir",			reservedWord);
+		tokenMap.put("diskcomp",		reservedWord);
+		tokenMap.put("diskcopy",		reservedWord);
+		tokenMap.put("do",				reservedWord);
+		tokenMap.put("doskey",		reservedWord);
+		tokenMap.put("dosshell",		reservedWord);
+		tokenMap.put("drivparm",		reservedWord);
+		tokenMap.put("echo",			reservedWord);
+		tokenMap.put("edit",			reservedWord);
+		tokenMap.put("edlin",		reservedWord);
+		tokenMap.put("emm386",		reservedWord);
+		tokenMap.put("erase",		reservedWord);
+		tokenMap.put("exist",		reservedWord);
+		tokenMap.put("exit",			reservedWord);
+		tokenMap.put("expand",		reservedWord);
+		tokenMap.put("extract",		reservedWord);
+		tokenMap.put("fasthelp",		reservedWord);
+		tokenMap.put("fc",			reservedWord);
+		tokenMap.put("fdisk",		reservedWord);
+		tokenMap.put("find",			reservedWord);
+		tokenMap.put("for",			reservedWord);
+		tokenMap.put("format",		reservedWord);
+		tokenMap.put("ftp",			reservedWord);
+		tokenMap.put("graftabl",		reservedWord);
+		tokenMap.put("help",			reservedWord);
+		tokenMap.put("ifshlp.sys",	reservedWord);
+		tokenMap.put("in",			reservedWord);
+		tokenMap.put("ipconfig",		reservedWord);
+		tokenMap.put("keyb",			reservedWord);
+		tokenMap.put("label",		reservedWord);
+		tokenMap.put("lh",			reservedWord);
+		tokenMap.put("loadfix",		reservedWord);
+		tokenMap.put("loadhigh",		reservedWord);
+		tokenMap.put("lock",			reservedWord);
+		tokenMap.put("md",			reservedWord);
+		tokenMap.put("mem",			reservedWord);
+		tokenMap.put("mkdir",		reservedWord);
+		tokenMap.put("mode",			reservedWord);
+		tokenMap.put("more",			reservedWord);
+		tokenMap.put("move",			reservedWord);
+		tokenMap.put("msav",			reservedWord);
+		tokenMap.put("msd",			reservedWord);
+		tokenMap.put("mscdex",		reservedWord);
+		tokenMap.put("nbtstat",		reservedWord);
+		tokenMap.put("net",			reservedWord);
+		tokenMap.put("netstat",		reservedWord);
+		tokenMap.put("nlsfunc",		reservedWord);
+		tokenMap.put("not",			reservedWord);
+		tokenMap.put("nslookup",		reservedWord);
+		tokenMap.put("path",			reservedWord);
+		tokenMap.put("pathping",		reservedWord);
+		tokenMap.put("pause",		reservedWord);
+		tokenMap.put("ping",			reservedWord);
+		tokenMap.put("power",		reservedWord);
+		tokenMap.put("print",		reservedWord);
+		tokenMap.put("prompt",		reservedWord);
+		tokenMap.put("qbasic",		reservedWord);
+		tokenMap.put("rd",			reservedWord);
+		tokenMap.put("ren",			reservedWord);
+		tokenMap.put("rename",		reservedWord);
+		tokenMap.put("rmdir",		reservedWord);
+		tokenMap.put("route",		reservedWord);
+		tokenMap.put("sc",			reservedWord);
+		tokenMap.put("scandisk",		reservedWord);
+		tokenMap.put("scandreg",		reservedWord);
+		tokenMap.put("set",			reservedWord);
+		tokenMap.put("setx",			reservedWord);
+		tokenMap.put("setver",		reservedWord);
+		tokenMap.put("share",		reservedWord);
+		tokenMap.put("shutdown",		reservedWord);
+		tokenMap.put("smartdrv",		reservedWord);
+		tokenMap.put("sort",			reservedWord);
+		tokenMap.put("subset",		reservedWord);
+		tokenMap.put("switches",		reservedWord);
+		tokenMap.put("sys",			reservedWord);
+		tokenMap.put("time",			reservedWord);
+		tokenMap.put("tracert",		reservedWord);
+		tokenMap.put("tree",			reservedWord);
+		tokenMap.put("type",			reservedWord);
+		tokenMap.put("undelete",		reservedWord);
+		tokenMap.put("unformat",		reservedWord);
+		tokenMap.put("unlock",		reservedWord);
+		tokenMap.put("ver",			reservedWord);
+		tokenMap.put("verify",		reservedWord);
+		tokenMap.put("vol",			reservedWord);
+		tokenMap.put("xcopy",		reservedWord);
+
+		return tokenMap;
+
+	}
+
+
+	/**
+	 * Returns a list of tokens representing the given text.
+	 *
+	 * @param text The text to break into tokens.
+	 * @param startTokenType The token with which to start tokenizing.
+	 * @param startOffset The offset at which the line of tokens begins.
+	 * @return A linked list of tokens representing <code>text</code>.
+	 */
+	public Token getTokenList(Segment text, int startTokenType, final int startOffset) {
+
+		resetTokenList();
+
+		char[] array = text.array;
+		int offset = text.offset;
+		int count = text.count;
+		int end = offset + count;
+
+		// See, when we find a token, its starting position is always of the form:
+		// 'startOffset + (currentTokenStart-offset)'; but since startOffset and
+		// offset are constant, tokens' starting positions become:
+		// 'newStartOffset+currentTokenStart' for one less subtraction operation.
+		int newStartOffset = startOffset - offset;
+
+		currentTokenStart = offset;
+		currentTokenType  = startTokenType;
+
+//beginning:
+		for (int i=offset; i<end; i++) {
+
+			char c = array[i];
+
+			switch (currentTokenType) {
+
+				case Token.NULL:
+
+					currentTokenStart = i;	// Starting a new token here.
+
+					switch (c) {
+
+						case ' ':
+						case '\t':
+							currentTokenType = Token.WHITESPACE;
+							break;
+
+						case '"':
+							currentTokenType = Token.ERROR_STRING_DOUBLE;
+							break;
+
+						case '%':
+							currentTokenType = Token.VARIABLE;
+							break;
+
+						// The "separators".
+						case '(':
+						case ')':
+							addToken(text, currentTokenStart,i, Token.SEPARATOR, newStartOffset+currentTokenStart);
+							currentTokenType = Token.NULL;
+							break;
+
+						// The "separators2".
+						case ',':
+						case ';':
+							addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenType = Token.NULL;
+							break;
+
+						// Newer version of EOL comments, or a label
+						case ':':
+							// If this will be the first token added, it is
+							// a new-style comment or a label
+							if (firstToken==null) {
+								if (i<end-1 && array[i+1]==':') { // new-style comment
+									currentTokenType = Token.COMMENT_EOL;
+								}
+								else { // Label
+									currentTokenType = Token.PREPROCESSOR;
+								}
+							}
+							else { // Just a colon
+								currentTokenType = Token.IDENTIFIER;
+							}
+							break;
+
+						default:
+
+							// Just to speed things up a tad, as this will usually be the case (if spaces above failed).
+							if (RSyntaxUtilities.isLetterOrDigit(c) || c=='\\') {
+								currentTokenType = Token.IDENTIFIER;
+								break;
+							}
+
+							int indexOf = operators.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i, Token.OPERATOR, newStartOffset+currentTokenStart);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							else {
+								currentTokenType = Token.IDENTIFIER;
+								break;
+							}
+
+					} // End of switch (c).
+
+					break;
+
+				case Token.WHITESPACE:
+
+					switch (c) {
+
+						case ' ':
+						case '\t':
+							break;	// Still whitespace.
+
+						case '"':
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.ERROR_STRING_DOUBLE;
+							break;
+
+						case '%':
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.VARIABLE;
+							break;
+
+						// The "separators".
+						case '(':
+						case ')':
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.SEPARATOR, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							break;
+
+						// The "separators2".
+						case ',':
+						case ';':
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							break;
+
+						// Newer version of EOL comments, or a label
+						case ':':
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							// If the previous (whitespace) token was the first token
+							// added, this is a new-style comment or a label
+							if (firstToken.getNextToken()==null) {
+								if (i<end-1 && array[i+1]==':') { // new-style comment
+									currentTokenType = Token.COMMENT_EOL;
+								}
+								else { // Label
+									currentTokenType = Token.PREPROCESSOR;
+								}
+							}
+							else { // Just a colon
+								currentTokenType = Token.IDENTIFIER;
+							}
+							break;
+
+						default:	// Add the whitespace token and start anew.
+
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+
+							// Just to speed things up a tad, as this will usually be the case (if spaces above failed).
+							if (RSyntaxUtilities.isLetterOrDigit(c) || c=='\\') {
+								currentTokenType = Token.IDENTIFIER;
+								break;
+							}
+
+							int indexOf = operators.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i, Token.OPERATOR, newStartOffset+currentTokenStart);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							else {
+								currentTokenType = Token.IDENTIFIER;
+							}
+
+					} // End of switch (c).
+
+					break;
+
+				default: // Should never happen
+				case Token.IDENTIFIER:
+
+					switch (c) {
+
+						case ' ':
+						case '\t':
+							// Check for REM comments.
+							if (i-currentTokenStart==3 &&
+								(array[i-3]=='r' || array[i-3]=='R') &&
+								(array[i-2]=='e' || array[i-2]=='E') &&
+								(array[i-1]=='m' || array[i-1]=='M')) {
+									currentTokenType = Token.COMMENT_EOL;
+									break;
+							}
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.WHITESPACE;
+							break;
+
+						case '"':
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.ERROR_STRING_DOUBLE;
+							break;
+
+						case '%':
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.VARIABLE;
+							break;
+
+						// Should be part of identifiers, but not at end of "REM".
+						case '\\':
+							// Check for REM comments.
+							if (i-currentTokenStart==3 &&
+								(array[i-3]=='r' || array[i-3]=='R') &&
+								(array[i-2]=='e' || array[i-2]=='E') &&
+								(array[i-1]=='m' || array[i-1]=='M')) {
+									currentTokenType = Token.COMMENT_EOL;
+							}
+							break;
+
+						case '.':
+						case '_':
+							break;	// Characters good for identifiers.
+
+						// The "separators".
+						case '(':
+						case ')':
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.SEPARATOR, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							break;
+
+						// The "separators2".
+						case ',':
+						case ';':
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							break;
+
+						default:
+
+							// Just to speed things up a tad, as this will usually be the case.
+							if (RSyntaxUtilities.isLetterOrDigit(c) || c=='\\') {
+								break;
+							}
+
+							int indexOf = operators.indexOf(c);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								addToken(text, i,i, Token.OPERATOR, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+
+							// Otherwise, fall through and assume we're still okay as an IDENTIFIER...
+
+					} // End of switch (c).
+
+					break;
+
+				case Token.COMMENT_EOL:
+					i = end - 1;
+					addToken(text, currentTokenStart,i, Token.COMMENT_EOL, newStartOffset+currentTokenStart);
+					// We need to set token type to null so at the bottom we don't add one more token.
+					currentTokenType = Token.NULL;
+					break;
+
+				case Token.PREPROCESSOR: // Used for labels
+					i = end - 1;
+					addToken(text, currentTokenStart,i, Token.PREPROCESSOR, newStartOffset+currentTokenStart);
+					// We need to set token type to null so at the bottom we don't add one more token.
+					currentTokenType = Token.NULL;
+					break;
+
+				case Token.ERROR_STRING_DOUBLE:
+
+					if (c=='"') {
+						addToken(text, currentTokenStart,i, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+currentTokenStart);
+						currentTokenStart = i + 1;
+						currentTokenType = Token.NULL;
+					}
+					// Otherwise, we're still an unclosed string...
+
+					break;
+
+				case Token.VARIABLE:
+
+						if (i==currentTokenStart+1) { // first character after '%'.
+							bracketVariable = false;
+							switch (c) {
+								case '{':
+									bracketVariable = true;
+									break;
+								default:
+									if (RSyntaxUtilities.isLetter(c) || c==' ') { // No tab, just space; spaces are okay in variable names.
+										break;
+									}
+									else if (RSyntaxUtilities.isDigit(c)) { // Single-digit command-line argument ("%1").
+										addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+										currentTokenType = Token.NULL;
+										break;
+									}
+									else { // Anything else, ???.
+										addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart); // ???
+										i--;
+										currentTokenType = Token.NULL;
+										break;
+									}
+							} // End of switch (c).
+						}
+						else { // Character other than first after the '%'.
+							if (bracketVariable==true) {
+								if (c=='}') {
+									addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+									currentTokenType = Token.NULL;
+								}
+							}
+							else {
+								if (c=='%') {
+									addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+									currentTokenType = Token.NULL;
+								}
+							}
+							break;
+						}
+						break;
+
+			} // End of switch (currentTokenType).
+
+		} // End of for (int i=offset; i<end; i++).
+
+		// Deal with the (possibly there) last token.
+		if (currentTokenType != Token.NULL) {
+
+				// Check for REM comments.
+				if (end-currentTokenStart==3 &&
+					(array[end-3]=='r' || array[end-3]=='R') &&
+					(array[end-2]=='e' || array[end-2]=='E') &&
+					(array[end-1]=='m' || array[end-1]=='M')) {
+						currentTokenType = Token.COMMENT_EOL;
+				}
+
+				addToken(text, currentTokenStart,end-1, currentTokenType, newStartOffset+currentTokenStart);
+		}
+
+		addNullToken();
+
+		// Return the first token in our linked list.
+		return firstToken;
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.flex
new file mode 100644
index 0000000..470eb9c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.flex
@@ -0,0 +1,485 @@
+/*
+ * 01/24/2005
+ *
+ * XMLTokenMaker.java - Generates tokens for XML syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for XML.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>XMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class XMLTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed XML tag; thus a new line is beginning still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed DOCTYPE element.
+	 */
+	public static final int INTERNAL_DTD					= -4;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed, locally-defined DTD in a DOCTYPE element.
+	 */
+	public static final int INTERNAL_DTD_INTERNAL			= -5;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed comment.  The state to return to when this comment ends is
+	 * embedded in the token type as well.
+	 */
+	public static final int INTERNAL_IN_XML_COMMENT			= -(1<<11);
+
+	/**
+	 * Whether closing markup tags are automatically completed for HTML.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * Whether the DTD we're currently in is a locally-defined one.  This
+	 * field is only valid when in a DOCTYPE element (the <DTD> state).
+	 */
+	private boolean inInternalDtd;
+
+	/**
+	 * The state we were in prior to the current one.  This is used to know
+	 * what state to resume after an MLC ends.
+	 */
+	private int prevState;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public XMLTokenMaker() {
+	}
+
+
+	static {
+		completeCloseTags = true;
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected OccurrenceMarker createOccurrenceMarker() {
+		return new XmlOccurrenceMarker();
+	}
+
+
+	/**
+	 * Returns whether markup close tags should be completed.  For XML, the
+	 * default value is <code>true</code>.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Static version of {@link #getCompleteCloseTags()}.  This hack is
+	 * unfortunately needed for applications to be able to query this value
+	 * without instantiating this class.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public static boolean getCompleteCloseMarkupTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Returns <code>Token.MARKUP_TAG_NAME</code>.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.MARKUP_TAG_NAME;
+	}
+
+
+	/**
+	 * 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;
+		prevState = YYINITIAL;
+		inInternalDtd = false;
+
+		// Start off in the proper state.
+		int state = YYINITIAL;
+		switch (initialTokenType) {
+			case Token.MARKUP_COMMENT:
+				state = COMMENT;
+				break;
+			case INTERNAL_DTD:
+				state = DTD;
+				break;
+			case INTERNAL_DTD_INTERNAL:
+				state = DTD;
+				inInternalDtd = true;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				break;
+			case Token.MARKUP_PROCESSING_INSTRUCTION:
+				state = PI;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				break;
+			case Token.MARKUP_CDATA:
+				state = CDATA;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_XML_COMMENT - prevState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_XML_COMMENT:
+							state = COMMENT;
+							break;
+					}
+					prevState = -initialTokenType&0xff;
+				}
+				else { // Shouldn't happen
+					state = Token.NULL;
+				}
+		}
+
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * 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(java.io.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;
+	}
+
+
+%}
+
+NameStartChar		= ([\:A-Z_a-z])
+NameChar			= ({NameStartChar}|[\-\.0-9])
+TagName				= ({NameStartChar}{NameChar}*)
+Whitespace			= ([ \t\f])
+LineTerminator			= ([\n])
+Identifier			= ([^ \t\n<&]+)
+EntityReference		= ([&][^; \t]*[;]?)
+InTagIdentifier		= ([^ \t\n\"\'=\/>]+)
+CDataBegin			= ("<![CDATA[")
+CDataEnd				= ("]]>")
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ([A-Za-z_0-9\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$A-Za-z0-9])
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state COMMENT
+%state PI
+%state DTD
+%state INTAG
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state CDATA
+
+%%
+
+<YYINITIAL> {
+	"<!--"							{ start = zzStartRead; prevState = zzLexicalState; yybegin(COMMENT); }
+	{CDataBegin}					{ addToken(Token.MARKUP_CDATA_DELIMITER); start = zzMarkedPos; yybegin(CDATA); }
+	"<!"							{ start = zzMarkedPos-2; inInternalDtd = false; yybegin(DTD); }
+	"<?"							{ start = zzMarkedPos-2; yybegin(PI); }
+	"<"{TagName}				{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(INTAG);
+								}
+	"</"{TagName}				{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(INTAG);
+								}
+	"<"							{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	"</"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	{EntityReference}				{ addToken(Token.MARKUP_ENTITY_REFERENCE); }
+	{Whitespace}+					{ addToken(Token.WHITESPACE); }
+	<<EOF>>						{ addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+	[^hwf\n\-]+					{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos; }
+	[hwf]						{}
+	"-->"						{ int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); start = temp; yybegin(prevState); }
+	"-"							{}
+	{LineTerminator} |
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_XML_COMMENT - prevState); return firstToken; }
+}
+
+<PI> {
+	[^\n\?]+						{}
+	{LineTerminator}				{ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+	"?>"							{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION); }
+	"?"							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+}
+
+<DTD> {
+	[^\n\[\]<>]+				{}
+	"<!--"						{ int temp = zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_DTD); start = temp; prevState = zzLexicalState; yybegin(COMMENT); }
+	"<"							{}
+	"["							{ inInternalDtd = true; }
+	"]"							{ inInternalDtd = false; }
+	">"							{ if (!inInternalDtd) { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD); } }
+	{LineTerminator} |
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_DTD); addEndToken(inInternalDtd ? INTERNAL_DTD_INTERNAL : INTERNAL_DTD); return firstToken; }
+}
+
+<INTAG> {
+	{InTagIdentifier}				{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}+					{ addToken(Token.WHITESPACE); }
+	"="							{ addToken(Token.OPERATOR); }
+	"/"							{ addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */ }
+	"/>"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	">"							{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+	[^\"]*						{}
+	[\"]						{ yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+	[^\']*						{}
+	[\']						{ yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<CDATA> {
+	[^\]]+						{}
+	{CDataEnd}					{ int temp=zzStartRead; yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.MARKUP_CDATA_DELIMITER); }
+	"]"							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_CDATA); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.java
new file mode 100644
index 0000000..edea09e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.java
@@ -0,0 +1,992 @@
+/* The following code was generated by JFlex 1.4.1 on 3/22/13 6:51 PM */
+
+/*
+ * 01/24/2005
+ *
+ * XMLTokenMaker.java - Generates tokens for XML syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for XML.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>XMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class XMLTokenMaker extends AbstractMarkupTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int INTAG = 4;
+  public static final int DTD = 3;
+  public static final int INATTR_DOUBLE = 5;
+  public static final int YYINITIAL = 0;
+  public static final int COMMENT = 1;
+  public static final int CDATA = 7;
+  public static final int INATTR_SINGLE = 6;
+  public static final int PI = 2;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\6\1\4\1\0\1\3\23\0\1\6\1\12\1\11\1\22"+
+    "\1\30\1\22\1\7\1\25\5\22\1\2\1\42\1\24\12\27\1\23"+
+    "\1\10\1\5\1\44\1\21\1\43\1\22\1\16\1\26\1\14\1\15"+
+    "\17\26\1\17\6\26\1\13\1\0\1\20\1\0\1\1\1\0\4\26"+
+    "\1\40\1\35\1\26\1\31\1\36\2\26\1\37\3\26\1\33\2\26"+
+    "\1\34\1\32\2\26\1\41\3\26\3\0\1\22\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 =
+    "\5\0\2\1\1\0\2\2\1\3\1\4\1\5\1\6"+
+    "\2\1\1\7\4\1\1\10\2\1\1\11\1\1\1\12"+
+    "\1\13\1\14\2\15\1\16\1\17\1\20\1\21\1\22"+
+    "\1\1\1\23\3\1\1\24\1\25\1\4\1\26\1\6"+
+    "\5\0\1\27\4\0\1\30\1\31\5\0\1\32\1\33"+
+    "\3\0\1\34\1\35\6\0\1\36";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[77];
+    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\45\0\112\0\157\0\224\0\271\0\336\0\u0103"+
+    "\0\u0128\0\u014d\0\u0172\0\u0197\0\u01bc\0\u01e1\0\u0206\0\u022b"+
+    "\0\u0172\0\u0250\0\u0275\0\u029a\0\u02bf\0\u0172\0\u02e4\0\u0309"+
+    "\0\u0172\0\u032e\0\u0172\0\u0172\0\u0172\0\u0353\0\u0378\0\u0172"+
+    "\0\u0172\0\u039d\0\u0172\0\u0172\0\u03c2\0\u0172\0\u03e7\0\u040c"+
+    "\0\u0431\0\u0456\0\u047b\0\u04a0\0\u0172\0\u0172\0\u04c5\0\u04ea"+
+    "\0\u050f\0\u0534\0\u0559\0\u0172\0\u057e\0\u05a3\0\u05c8\0\u05ed"+
+    "\0\u0612\0\u0172\0\u0637\0\u065c\0\u0681\0\u06a6\0\u06cb\0\u0172"+
+    "\0\u0172\0\u06f0\0\u0715\0\u073a\0\u075f\0\u0172\0\u0784\0\u07a9"+
+    "\0\u075f\0\u07ce\0\u07f3\0\u0818\0\u0172";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[77];
+    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 =
+    "\3\11\1\12\1\13\1\14\1\15\1\16\35\11\2\17"+
+    "\1\20\1\17\1\21\24\17\1\22\3\17\1\23\3\17"+
+    "\1\24\3\17\4\25\1\26\36\25\1\27\1\25\4\30"+
+    "\1\31\1\32\5\30\1\33\4\30\1\34\1\35\23\30"+
+    "\3\36\1\37\1\0\1\36\1\15\2\36\1\40\7\36"+
+    "\1\41\2\36\1\42\1\43\16\36\1\44\11\45\1\46"+
+    "\33\45\25\47\1\46\17\47\20\50\1\51\24\50\4\11"+
+    "\4\0\40\11\1\12\2\0\1\15\1\0\35\11\46\0"+
+    "\1\52\10\0\1\53\1\0\4\52\3\0\1\52\1\54"+
+    "\1\0\1\52\2\0\11\52\1\0\1\55\4\0\1\15"+
+    "\2\0\1\15\36\0\6\16\1\0\1\16\1\56\34\16"+
+    "\2\17\1\0\1\17\1\0\24\17\1\0\3\17\1\0"+
+    "\3\17\1\0\3\17\2\0\1\57\74\0\1\60\44\0"+
+    "\1\61\3\0\1\62\47\0\1\63\3\0\4\25\1\0"+
+    "\36\25\1\0\1\25\21\0\1\64\23\0\4\30\2\0"+
+    "\5\30\1\0\4\30\2\0\23\30\12\0\1\65\32\0"+
+    "\4\36\1\0\1\36\1\0\2\36\1\0\7\36\1\0"+
+    "\2\36\2\0\16\36\1\0\3\36\1\37\1\0\1\36"+
+    "\1\15\2\36\1\0\7\36\1\0\2\36\2\0\16\36"+
+    "\22\0\1\41\23\0\11\45\1\0\33\45\25\47\1\0"+
+    "\17\47\20\50\1\0\24\50\20\0\1\66\25\0\2\52"+
+    "\11\0\4\52\3\0\1\52\2\0\2\52\1\0\12\52"+
+    "\4\0\1\67\10\0\1\70\32\0\1\71\12\0\4\71"+
+    "\3\0\1\71\2\0\1\71\2\0\11\71\24\0\1\72"+
+    "\55\0\1\73\45\0\1\74\50\0\1\75\46\0\1\76"+
+    "\5\0\1\77\63\0\1\100\25\0\1\101\56\0\1\102"+
+    "\31\0\2\71\11\0\4\71\3\0\1\71\2\0\2\71"+
+    "\1\0\12\71\35\0\1\103\34\0\1\104\61\0\1\74"+
+    "\46\0\1\105\4\0\1\106\57\0\1\107\52\0\1\104"+
+    "\10\0\1\74\34\0\1\110\21\0\2\111\4\0\2\111"+
+    "\1\0\2\111\4\105\1\111\1\0\2\111\1\105\1\111"+
+    "\14\105\3\111\16\0\1\112\52\0\1\105\37\0\1\113"+
+    "\43\0\1\114\41\0\1\115\31\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[2109];
+    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 =
+    "\5\0\2\1\1\0\2\1\1\11\5\1\1\11\4\1"+
+    "\1\11\2\1\1\11\1\1\3\11\2\1\2\11\1\1"+
+    "\2\11\1\1\1\11\6\1\2\11\5\0\1\11\4\0"+
+    "\1\1\1\11\5\0\2\11\3\0\1\1\1\11\6\0"+
+    "\1\11";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[77];
+    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;
+
+  /* user code: */
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed XML tag; thus a new line is beginning still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed DOCTYPE element.
+	 */
+	public static final int INTERNAL_DTD					= -4;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed, locally-defined DTD in a DOCTYPE element.
+	 */
+	public static final int INTERNAL_DTD_INTERNAL			= -5;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed comment.  The state to return to when this comment ends is
+	 * embedded in the token type as well.
+	 */
+	public static final int INTERNAL_IN_XML_COMMENT			= -(1<<11);
+
+	/**
+	 * Whether closing markup tags are automatically completed for HTML.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * Whether the DTD we're currently in is a locally-defined one.  This
+	 * field is only valid when in a DOCTYPE element (the <DTD> state).
+	 */
+	private boolean inInternalDtd;
+
+	/**
+	 * The state we were in prior to the current one.  This is used to know
+	 * what state to resume after an MLC ends.
+	 */
+	private int prevState;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public XMLTokenMaker() {
+	}
+
+
+	static {
+		completeCloseTags = true;
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * 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.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected OccurrenceMarker createOccurrenceMarker() {
+		return new XmlOccurrenceMarker();
+	}
+
+
+	/**
+	 * Returns whether markup close tags should be completed.  For XML, the
+	 * default value is <code>true</code>.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Static version of {@link #getCompleteCloseTags()}.  This hack is
+	 * unfortunately needed for applications to be able to query this value
+	 * without instantiating this class.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public static boolean getCompleteCloseMarkupTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Returns <code>Token.MARKUP_TAG_NAME</code>.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.MARKUP_TAG_NAME;
+	}
+
+
+	/**
+	 * 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;
+		prevState = YYINITIAL;
+		inInternalDtd = false;
+
+		// Start off in the proper state.
+		int state = YYINITIAL;
+		switch (initialTokenType) {
+			case Token.MARKUP_COMMENT:
+				state = COMMENT;
+				break;
+			case INTERNAL_DTD:
+				state = DTD;
+				break;
+			case INTERNAL_DTD_INTERNAL:
+				state = DTD;
+				inInternalDtd = true;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				break;
+			case Token.MARKUP_PROCESSING_INSTRUCTION:
+				state = PI;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				break;
+			case Token.MARKUP_CDATA:
+				state = CDATA;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_XML_COMMENT - prevState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_XML_COMMENT:
+							state = COMMENT;
+							break;
+					}
+					prevState = -initialTokenType&0xff;
+				}
+				else { // Shouldn't happen
+					state = Token.NULL;
+				}
+		}
+
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new Token();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * 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(java.io.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;
+		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 XMLTokenMaker(java.io.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 XMLTokenMaker(java.io.InputStream in) {
+    this(new java.io.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 < 116) {
+      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 java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * 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;
+  }
+
+
+  /**
+   * 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   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;
+    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 25: 
+          { int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); start = temp; yybegin(prevState);
+          }
+        case 31: break;
+        case 19: 
+          { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 32: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 33: break;
+        case 29: 
+          { int temp = zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_DTD); start = temp; prevState = zzLexicalState; yybegin(COMMENT);
+          }
+        case 34: break;
+        case 11: 
+          { inInternalDtd = false;
+          }
+        case 35: break;
+        case 4: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+          }
+        case 36: break;
+        case 24: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(INTAG);
+          }
+        case 37: break;
+        case 9: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_DTD); addEndToken(inInternalDtd ? INTERNAL_DTD_INTERNAL : INTERNAL_DTD); return firstToken;
+          }
+        case 38: break;
+        case 16: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */
+          }
+        case 39: break;
+        case 7: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_XML_COMMENT - prevState); return firstToken;
+          }
+        case 40: break;
+        case 5: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 41: break;
+        case 27: 
+          { start = zzStartRead; prevState = zzLexicalState; yybegin(COMMENT);
+          }
+        case 42: break;
+        case 26: 
+          { int temp=zzStartRead; yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.MARKUP_CDATA_DELIMITER);
+          }
+        case 43: break;
+        case 6: 
+          { addToken(Token.MARKUP_ENTITY_REFERENCE);
+          }
+        case 44: break;
+        case 12: 
+          { if (!inInternalDtd) { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD); }
+          }
+        case 45: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 46: break;
+        case 10: 
+          { inInternalDtd = true;
+          }
+        case 47: break;
+        case 23: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION);
+          }
+        case 48: break;
+        case 21: 
+          { start = zzMarkedPos-2; inInternalDtd = false; yybegin(DTD);
+          }
+        case 49: break;
+        case 20: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(INTAG);
+          }
+        case 50: break;
+        case 22: 
+          { start = zzMarkedPos-2; yybegin(PI);
+          }
+        case 51: break;
+        case 8: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+          }
+        case 52: break;
+        case 14: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+          }
+        case 53: break;
+        case 28: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos;
+          }
+        case 54: break;
+        case 15: 
+          { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 55: break;
+        case 17: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+          }
+        case 56: break;
+        case 18: 
+          { addToken(Token.OPERATOR);
+          }
+        case 57: break;
+        case 30: 
+          { addToken(Token.MARKUP_CDATA_DELIMITER); start = zzMarkedPos; yybegin(CDATA);
+          }
+        case 58: break;
+        case 13: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 59: break;
+        case 1: 
+          { 
+          }
+        case 60: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case INTAG: {
+              addToken(start,zzStartRead-1, INTERNAL_INTAG); return firstToken;
+            }
+            case 78: break;
+            case DTD: {
+              addToken(start,zzStartRead-1, Token.MARKUP_DTD); addEndToken(inInternalDtd ? INTERNAL_DTD_INTERNAL : INTERNAL_DTD); return firstToken;
+            }
+            case 79: break;
+            case INATTR_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+            }
+            case 80: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 81: break;
+            case COMMENT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_XML_COMMENT - prevState); return firstToken;
+            }
+            case 82: break;
+            case CDATA: {
+              addToken(start,zzStartRead-1, Token.MARKUP_CDATA); return firstToken;
+            }
+            case 83: break;
+            case INATTR_SINGLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+            }
+            case 84: break;
+            case PI: {
+              addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+            }
+            case 85: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/package.html b/src/org/fife/ui/rsyntaxtextarea/modes/package.html
new file mode 100644
index 0000000..5e78c96
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/package.html
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	Scanners that tokenize source in <code>RSyntaxTextArea</code>.
+	</body>
+</html>
diff --git a/src/org/fife/ui/rsyntaxtextarea/package.html b/src/org/fife/ui/rsyntaxtextarea/package.html
new file mode 100644
index 0000000..206c591
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/package.html
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	A syntax-highlighting text editor.
+	</body>
+</html>
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/AbstractParser.java b/src/org/fife/ui/rsyntaxtextarea/parser/AbstractParser.java
new file mode 100644
index 0000000..6449aa3
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/AbstractParser.java
@@ -0,0 +1,95 @@
+/*
+ * 07/31/2009
+ *
+ * AbstractParser.java - A base implementation for parsers.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.net.URL;
+
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+
+
+/**
+ * A base class for {@link Parser} implementations.  Most <code>Parser</code>s
+ * should be able to extend this class.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class AbstractParser implements Parser {
+
+	/**
+	 * Whether this parser is enabled.  If this is <code>false</code>, then
+	 * this parser will not be run.
+	 */
+	private boolean enabled;
+
+	/**
+	 * Listens for events from {@link FocusableTip}s generated from this
+	 * parser's notices.
+	 */
+	private ExtendedHyperlinkListener linkListener;
+
+
+	/**
+	 * Constructor.
+	 */
+	protected AbstractParser() {
+		setEnabled(true);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public ExtendedHyperlinkListener getHyperlinkListener() {
+		return linkListener;
+	}
+
+
+	/**
+	 * Returns <code>null</code>.  Parsers that wish to show images in their
+	 * tool tips should override this method to return the image base URL.
+	 *
+	 * @return <code>null</code> always.
+	 */
+	public URL getImageBase() {
+		return null;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean isEnabled() {
+		return enabled;
+	}
+
+
+	/**
+	 * Toggles whether this parser is enabled.
+	 *
+	 * @param enabled Whether this parser is enabled.
+	 * @see #isEnabled()
+	 */
+	public void setEnabled(boolean enabled) {
+		this.enabled = enabled;
+	}
+
+
+	/**
+	 * Returns the listener for this parser.
+	 *
+	 * @param listener The new listener.
+	 * @see #getHyperlinkListener()
+	 */
+	public void setHyperlinkListener(ExtendedHyperlinkListener listener) {
+		linkListener = listener;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/DefaultParseResult.java b/src/org/fife/ui/rsyntaxtextarea/parser/DefaultParseResult.java
new file mode 100644
index 0000000..78beac7
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/DefaultParseResult.java
@@ -0,0 +1,145 @@
+/*
+ * 07/27/2009
+ *
+ * DefaultParseResult.java - A basic implementation of a ParseResult.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * A basic implementation of {@link ParseResult}.  Most, if not all,
+ * <code>Parser</code>s can return instances of this class.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see Parser
+ */
+public class DefaultParseResult implements ParseResult {
+
+	private Parser parser;
+	private int firstLineParsed;
+	private int lastLineParsed;
+	private List notices;
+	private long parseTime;
+	private Exception error;
+
+
+	public DefaultParseResult(Parser parser) {
+		this.parser = parser;
+		notices = new ArrayList();
+	}
+
+
+	/**
+	 * Adds a parser notice.
+	 *
+	 * @param notice The new notice.
+	 * @see #clearNotices()
+	 */
+	public void addNotice(ParserNotice notice) {
+		notices.add(notice);
+	}
+
+
+	/**
+	 * Clears any parser notices in this result.
+	 *
+	 * @see #addNotice(ParserNotice)
+	 */
+	public void clearNotices() {
+		notices.clear();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Exception getError() {
+		return error;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int getFirstLineParsed() {
+		return firstLineParsed;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int getLastLineParsed() {
+		return lastLineParsed;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public List getNotices() {
+		return notices;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public long getParseTime() {
+		return parseTime;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Parser getParser() {
+		return parser;
+	}
+
+
+	/**
+	 * Sets the error that occurred when last parsing the document, if
+	 * any.
+	 *
+	 * @param e The error that occurred, or <code>null</code> if no error
+	 *         occurred.
+	 */
+	public void setError(Exception e) {
+		this.error = e;
+	}
+
+
+	/**
+	 * Sets the amount of time it took for this parser to parse the document.
+	 *
+	 * @param time The amount of time, in milliseconds.
+	 * @see #getParseTime()
+	 */
+	public void setParseTime(long time) {
+		parseTime = time;
+	}
+
+
+	/**
+	 * Sets the line range parsed.
+	 *
+	 * @param first The first line parsed, inclusive.
+	 * @param last The last line parsed, inclusive.
+	 * @see #getFirstLineParsed()
+	 * @see #getLastLineParsed()
+	 */
+	public void setParsedLines(int first, int last) {
+		firstLineParsed = first;
+		lastLineParsed = last;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/DefaultParserNotice.java b/src/org/fife/ui/rsyntaxtextarea/parser/DefaultParserNotice.java
new file mode 100644
index 0000000..ac5a4a8
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/DefaultParserNotice.java
@@ -0,0 +1,268 @@
+/*
+ * 08/11/2009
+ *
+ * DefaultParserNotice.java - Base implementation of a parser notice.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.awt.Color;
+
+
+/**
+ * Base implementation of a parser notice.  Most <code>Parser</code>
+ * implementations can return instances of this in their parse result.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see Parser
+ * @see ParseResult
+ */
+public class DefaultParserNotice implements ParserNotice {
+
+	private Parser parser;
+	private int level;
+	private int line;
+	private int offset;
+	private int length;
+	private boolean showInEditor;
+	private Color color;
+	private String message;
+	private String toolTipText;
+
+	private static final Color[] DEFAULT_COLORS = {
+		new Color(255, 0, 128),		// Error
+		new Color(244, 200, 45),	// Warning
+		Color.gray,					// Info
+	};
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param parser The parser that created this notice.
+	 * @param msg The text of the message.
+	 * @param line The line number for the message.
+	 */
+	public DefaultParserNotice(Parser parser, String msg, int line) {
+		this(parser, msg, line, -1, -1);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param parser The parser that created this notice.
+	 * @param message The message.
+	 * @param line The line number corresponding to the message.
+	 * @param offset The offset in the input stream of the code the
+	 *        message is concerned with, or <code>-1</code> if unknown.
+	 * @param length The length of the code the message is concerned with,
+	 *        or <code>-1</code> if unknown.
+	 */
+	public DefaultParserNotice(Parser parser, String message, int line,
+						int offset, int length) {
+		this.parser = parser;
+		this.message = message;
+		this.line = line;
+		this.offset = offset;
+		this.length = length;
+		setLevel(ERROR);
+		setShowInEditor(true);
+	}
+
+
+	/**
+	 * Compares this parser notice to another.
+	 *
+	 * @param obj Another parser notice.
+	 * @return How the two parser notices should be sorted relative to one
+	 *         another.
+	 */
+	public int compareTo(Object obj) {
+		int diff = -1;
+		if (obj instanceof ParserNotice) {
+			ParserNotice p2 = (ParserNotice)obj;
+			diff = level - p2.getLevel();
+			if (diff==0) {
+				diff = line - p2.getLine();
+				if (diff==0) {
+					diff = message.compareTo(p2.getMessage());
+				}
+			}
+		}
+		return diff;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean containsPosition(int pos) {
+		return offset<=pos && pos<(offset+length);
+	}
+
+
+	/**
+	 * Returns whether this parser notice is equal to another one.
+	 *
+	 * @param obj Another parser notice.
+	 * @return Whether the two notices are equal.
+	 */
+	public boolean equals(Object obj) {
+		return compareTo(obj)==0;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Color getColor() {
+		Color c = color; // User-defined
+		if (c==null) {
+			c = DEFAULT_COLORS[getLevel()];
+		}
+		return c;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int getLength() {
+		return length;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int getLevel() {
+		return level;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int getLine() {
+		return line;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getMessage() {
+		return message;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int getOffset() {
+		return offset;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Parser getParser() {
+		return parser;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean getShowInEditor() {
+		return showInEditor;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getToolTipText() {
+		return toolTipText!=null ? toolTipText : getMessage();
+	}
+
+
+	/**
+	 * Returns the hash code for this notice.
+	 *
+	 * @return The hash code.
+	 */
+	public int hashCode() {
+		return (line<<16) | offset;
+	}
+
+
+	/**
+	 * Sets the color to use when painting this notice.
+	 *
+	 * @param color The color to use.
+	 * @see #getColor()
+	 */
+	public void setColor(Color color) {
+		this.color = color;
+	}
+
+
+	/**
+	 * Sets the level of this notice.
+	 *
+	 * @param level The new level.
+	 * @see #getLevel()
+	 */
+	public void setLevel(int level) {
+		if (level>INFO) {
+			level = INFO;
+		}
+		else if (level<ERROR) {
+			level = ERROR;
+		}
+		this.level = level;
+	}
+
+
+	/**
+	 * Sets whether a squiggle underline should be drawn in the editor for
+	 * this notice.
+	 *
+	 * @param show Whether to draw a squiggle underline.
+	 * @see #getShowInEditor()
+	 */
+	public void setShowInEditor(boolean show) {
+		showInEditor = show;
+	}
+
+
+	/**
+	 * Sets the tooltip text to display for this notice.
+	 *
+	 * @param text The new tooltip text.  This can be HTML.  If this is
+	 *        <code>null</code>, then tooltips will return the same text as
+	 *        {@link #getMessage()}.
+	 * @see #getToolTipText()
+	 */
+	public void setToolTipText(String text) {
+		this.toolTipText = text;
+	}
+
+
+	/**
+	 * Returns a string representation of this parser notice.
+	 *
+	 * @return This parser notice as a string.
+	 */
+	public String toString() {
+		return "Line " + getLine() + ": " + getMessage();
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/ExtendedHyperlinkListener.java b/src/org/fife/ui/rsyntaxtextarea/parser/ExtendedHyperlinkListener.java
new file mode 100644
index 0000000..5d62282
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/ExtendedHyperlinkListener.java
@@ -0,0 +1,38 @@
+/*
+ * 07/31/2009
+ *
+ * ExtendedHyeprlinkListener.java - A hyperlink event from a FocusableTip.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.util.EventListener;
+import javax.swing.event.HyperlinkEvent;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+
+
+/**
+ * Listens for hyperlink events from {@link FocusableTip}s.  In addition to
+ * the link event, the text area that the tip is for is also received, which
+ * allows the listener to modify the displayed content, if desired.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface ExtendedHyperlinkListener extends EventListener {
+
+
+	/**
+	 * Called when a link in a {@link FocusableTip} is clicked.
+	 *
+	 * @param textArea The text area displaying the tip.
+	 * @param e The event.
+	 */
+	public void linkClicked(RSyntaxTextArea textArea, HyperlinkEvent e);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/ParseResult.java b/src/org/fife/ui/rsyntaxtextarea/parser/ParseResult.java
new file mode 100644
index 0000000..87fd22c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/ParseResult.java
@@ -0,0 +1,84 @@
+/*
+ * 07/27/2009
+ *
+ * ParseResult.java - The result of a Parser parsing some section of an
+ * RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.util.List;
+
+
+/**
+ * The result from a {@link Parser}.  This contains the section of lines
+ * parsed and any notices for that section.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see DefaultParseResult
+ * @see ParserNotice
+ */
+public interface ParseResult {
+
+
+	/**
+	 * Returns an error that occurred while parsing the document, if any.
+	 *
+	 * @return The error, or <code>null</code> if the document was
+	 *         successfully parsed.
+	 */
+	public Exception getError();
+
+
+	/**
+	 * Returns the first line parsed.  All parser implementations should
+	 * currently set this to <code>0</code> and parse the entire document.
+	 *
+	 * @return The first line parsed.
+	 * @see #getLastLineParsed()
+	 */
+	public int getFirstLineParsed();
+
+
+	/**
+	 * Returns the first line parsed.  All parser implementations should
+	 * currently set this to the document's line count and parse the entire
+	 * document.
+	 *
+	 * @return The last line parsed.
+	 * @see #getFirstLineParsed()
+	 */
+	public int getLastLineParsed();
+
+
+	/**
+	 * Returns the notices for the parsed section.
+	 *
+	 * @return A list of {@link ParserNotice}s.
+	 */
+	public List getNotices();
+
+
+	/**
+	 * Returns the parser that generated these notices.
+	 *
+	 * @return The parser.
+	 */
+	public Parser getParser();
+
+
+	/**
+	 * Returns the amount of time this parser took to parse the specified
+	 * range of text.  This is an optional operation; parsers are permitted
+	 * to return <code>0</code> for this value.
+	 *
+	 * @return The parse time, in milliseconds, or <code>0</code> if the
+	 *         parse time was not recorded.
+	 */
+	public long getParseTime();
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/Parser.java b/src/org/fife/ui/rsyntaxtextarea/parser/Parser.java
new file mode 100644
index 0000000..ee6d9e1
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/Parser.java
@@ -0,0 +1,76 @@
+/*
+ * 09/23/2005
+ *
+ * Parser.java - An interface for a parser for RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.net.URL;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+
+
+/**
+ * An interface for a parser for content in an {@link RSyntaxTextArea}.
+ * A <code>Parser</code> returns a list of issues it finds in the text area's
+ * content, which the text area can flag (e.g. squiggle underline).  It can
+ * also return descriptions of the issues, to be used in tool tips.<p>
+ * 
+ * To install a <code>Parser</code>, simply call
+ * {@link RSyntaxTextArea#addParser(Parser)}.
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ * @see AbstractParser
+ */
+public interface Parser {
+
+
+	/**
+	 * Returns the listener for hyperlink events from {@link FocusableTip}s,
+	 * or <code>null</code> if none.
+	 *
+	 * @return The listener.
+	 */
+	public ExtendedHyperlinkListener getHyperlinkListener();
+
+
+	/**
+	 * Returns the base URL for any images displayed in returned
+	 * {@link ParserNotice} HTML text.  Note that if a parser notice's text
+	 * is not HTML, this URL is not used.
+	 *
+	 * @return The URL.  This may be <code>null</code>.
+	 */
+	public URL getImageBase();
+
+
+	/**
+	 * Returns whether this parser is enabled.  If this returns
+	 * <code>false</code>, it will not be run.
+	 *
+	 * @return Whether this parser is enabled.
+	 */
+	public boolean isEnabled();
+
+
+	/**
+	 * Parses input from the specified document.
+	 *
+	 * @param doc The document to parse.  This document is in a read lock,
+	 *        so it cannot be modified while parsing is occurring.
+	 * @param style The language being rendered, such as
+	 *        {@link SyntaxConstants#SYNTAX_STYLE_JAVA}.
+	 * @return An object describing the section of the document parsed and the
+	 *         results.  This is guaranteed to be non-<code>null</code>.
+	 */
+	public ParseResult parse(RSyntaxDocument doc, String style);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/ParserNotice.java b/src/org/fife/ui/rsyntaxtextarea/parser/ParserNotice.java
new file mode 100644
index 0000000..06da722
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/ParserNotice.java
@@ -0,0 +1,130 @@
+/*
+ * 09/23/2005
+ *
+ * ParserNotice.java - A notice (i.e, and error or warning) from a parser.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.awt.Color;
+
+
+/**
+ * A notice (e.g., a warning or error) from a parser.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see DefaultParserNotice
+ */
+public interface ParserNotice extends Comparable {
+
+	/**
+	 * Indicates an info notice.
+	 */
+	public static final int INFO		= 2;
+
+	/**
+	 * Indicates a warning notice.
+	 */
+	public static final int WARNING		= 1;
+
+	/**
+	 * Indicates an error notice.
+	 */
+	public static final int ERROR		= 0;
+
+
+	/**
+	 * Returns whether this parser notice contains the specified location
+	 * in the document.
+	 *
+	 * @param pos The position in the document.
+	 * @return Whether the position is contained.  This will always return
+	 *         <code>false</code> if {@link #getOffset()} returns
+	 *         <code>-1</code>.
+	 */
+	public boolean containsPosition(int pos);
+
+
+	/**
+	 * Returns the color to use when painting this notice.
+	 *
+	 * @return The color.
+	 */
+	public Color getColor();
+
+
+	/**
+	 * Returns the length of the code the message is concerned with.
+	 *
+ 	 * @return The length of the code the message is concerned with, or
+ 	 *         <code>-1</code> if unknown.
+ 	 * @see #getOffset()
+ 	 * @see #getLine()
+	 */
+	public int getLength();
+
+
+	/**
+	 * Returns the level of this notice.
+	 *
+	 * @return One of {@link #INFO}, {@link #WARNING} OR {@link #ERROR}.
+	 */
+	public int getLevel();
+
+
+	/**
+	 * Returns the line number the notice is about.
+	 *
+	 * @return The line number.
+	 */
+	public int getLine();
+
+
+	/**
+	 * Returns the message from the parser.
+	 *
+	 * @return The message from the parser.
+	 */
+	public String getMessage();
+
+
+	/**
+	 * Returns the offset of the code the message is concerned with.
+	 *
+	 * @return The offset, or <code>-1</code> if unknown.
+	 * @see #getLength()
+	 * @see #getLine()
+	 */
+	public int getOffset();
+
+
+	/**
+	 * Returns the parser that created this message.
+	 *
+	 * @return The parser.
+	 */
+	public Parser getParser();
+
+
+	/**
+	 * Whether a squiggle underline should be drawn in the editor for this
+	 * notice.
+	 *
+	 * @return Whether a squiggle underline should be drawn.
+	 */
+	public boolean getShowInEditor();
+
+
+	/**
+	 * Returns the tooltip text to display for this notice.
+	 *
+	 * @return The tool tip text.  If none has been explicitly set, this
+	 *         method returns the same text as {@link #getMessage()}.
+	 */
+	public String getToolTipText();
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/TaskTagParser.java b/src/org/fife/ui/rsyntaxtextarea/parser/TaskTagParser.java
new file mode 100644
index 0000000..bdad145
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/TaskTagParser.java
@@ -0,0 +1,158 @@
+/*
+ * 08/11/2009
+ *
+ * TaskTagParser.java - Parser that scans code comments for task tags.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.awt.Color;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+import javax.swing.text.Element;
+
+import org.fife.ui.rsyntaxtextarea.ErrorStrip;
+import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
+import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * Parser that identifies "task tags," such as "<code>TODO</code>",
+ * "<code>FIXME</code>", etc. in source code comments.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class TaskTagParser extends AbstractParser {
+
+	private DefaultParseResult result;
+	private String DEFAULT_TASK_PATTERN	= "TODO|FIXME|HACK";
+	private Pattern taskPattern;
+
+	private static final Color COLOR = new Color(48, 150, 252);
+
+
+	/**
+	 * Creates a new task parser.  The default parser treats the following
+	 * identifiers in comments as task definitions:  "<code>TODO</code>",
+	 * "<code>FIXME</code>", and "<code>HACK</code>".
+	 */
+	public TaskTagParser() {
+		result = new DefaultParseResult(this);
+		setTaskPattern(DEFAULT_TASK_PATTERN);
+	}
+
+
+	/**
+	 * Returns the regular expression used to search for tasks.
+	 *
+	 * @return The regular expression.  This may be <code>null</code> if no
+	 *         regular expression was specified (or an empty string was
+	 *         specified).
+	 * @see #setTaskPattern(String)
+	 */
+	public String getTaskPattern() {
+		return taskPattern==null ? null : taskPattern.pattern();
+	}
+
+
+	public ParseResult parse(RSyntaxDocument doc, String style) {
+
+		Element root = doc.getDefaultRootElement();
+		int lineCount = root.getElementCount();
+
+		if (taskPattern==null ||
+				style==null || SyntaxConstants.SYNTAX_STYLE_NONE.equals(style)){
+			result.clearNotices();
+			result.setParsedLines(0, lineCount-1);
+			return result;
+		}
+
+		// TODO: Pass in parsed line range and just do that
+		result.clearNotices();
+		result.setParsedLines(0, lineCount-1);
+
+		for (int line=0; line<lineCount; line++) {
+
+			Token t = doc.getTokenListForLine(line);
+			int offs = -1;
+			int start = -1;
+			String text = null;
+
+			while (t!=null && t.isPaintable()) {
+				if (t.isComment()) {
+
+					offs = t.offset;
+					text = t.getLexeme();
+
+					Matcher m = taskPattern.matcher(text);
+					if (m.find()) {
+						start = m.start();
+						offs += start;
+						break;
+					}
+
+				}
+				t = t.getNextToken();
+			}
+
+			if (start>-1) {
+				text = text.substring(start);
+				// TODO: Strip off end of MLC's if they're there.
+				int len = text.length();
+				TaskNotice pn = new TaskNotice(this, text, line, offs, len);
+				pn.setLevel(ParserNotice.INFO);
+				pn.setShowInEditor(false);
+				pn.setColor(COLOR);
+				result.addNotice(pn);
+			}
+
+		}
+
+		return result;
+
+	}
+
+
+	/**
+	 * Sets the pattern of task identifiers.  You will usually want this to be
+	 * a list of words "or'ed" together, such as
+	 * "<code>TODO|FIXME|HACK|REMIND</code>".
+	 *
+	 * @param pattern The pattern.  A value of <code>null</code> or an
+	 *        empty string effectively disables task parsing.
+	 * @throws PatternSyntaxException If <code>pattern</code> is an invalid
+	 *         regular expression.
+	 * @see #getTaskPattern()
+	 */
+	public void setTaskPattern(String pattern) throws PatternSyntaxException {
+		if (pattern==null || pattern.length()==0) {
+			taskPattern = null;
+		}
+		else {
+			taskPattern = Pattern.compile(pattern);
+		}
+	}
+
+
+	/**
+	 * A parser notice that signifies a task.  This class is here so we can
+	 * treat tasks specially and show them in the {@link ErrorStrip} even
+	 * though they are <code>INFO</code>-level and marked as "don't show in
+	 * editor."
+	 */
+	public static class TaskNotice extends DefaultParserNotice {
+
+		public TaskNotice(Parser parser, String message, int line, int offs,
+							int length) {
+			super(parser, message, line, offs, length);
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/ToolTipInfo.java b/src/org/fife/ui/rsyntaxtextarea/parser/ToolTipInfo.java
new file mode 100644
index 0000000..7aca2f3
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/ToolTipInfo.java
@@ -0,0 +1,95 @@
+/*
+ * 07/29/2009
+ *
+ * ToolTipInfo.java - A tool tip's text and hyperlink listener.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.net.URL;
+import javax.swing.event.HyperlinkListener;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+
+
+/**
+ * Wrapper for a tool tip and a listener for hyperlink events in the tool
+ * tip (assuming the tip is HTML).  If the {@link RSyntaxTextArea} instance
+ * has {@link FocusableTip}s enabled, and the user clicks on a hyperlink in
+ * the tool tip, the specified {@link HyperlinkListener} will be called.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class ToolTipInfo {
+
+	private String text;
+	private HyperlinkListener listener;
+	private URL imageBase;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The tool tip text, or <code>null</code> for none.
+	 * @param listener The hyperlink listener, or <code>null</code> for none.
+	 */
+	public ToolTipInfo(String text, HyperlinkListener listener) {
+		this(text, listener, null);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The tool tip text, or <code>null</code> for none.
+	 * @param l The hyperlink listener, or <code>null</code> for none.
+	 * @param imageBase The base URL for images in the HTML <code>text</code>,
+	 *        or <code>null</code> for the default.
+	 */
+	public ToolTipInfo(String text, HyperlinkListener l, URL imageBase) {
+		this.text = text;
+		this.listener = l;
+		this.imageBase = imageBase;
+	}
+
+
+	/**
+	 * Returns the listener to call when hyperlinks are clicked in the tool
+	 * tip.
+	 *
+	 * @return The listener, or <code>null</code> for none.
+	 */
+	public HyperlinkListener getHyperlinkListener() {
+		return listener;
+	}
+
+
+	/**
+	 * Returns the base URL that any images in the HTML tool tip live in.
+	 * This allows you to reference images in a jar file in your
+	 * {@link FocusableTip}s.
+	 * Note that if what {@link #getToolTipText()} returns isn't HTML, this
+	 * value is effectively ignored.
+	 *
+	 * @return The image base, or <code>null</code> for the default.
+	 */
+	public URL getImageBase() {
+		return imageBase;
+	}
+
+
+	/**
+	 * Returns the tool tip text to display.
+	 *
+	 * @return The tool tip text, or <code>null</code> for none.
+	 */
+	public String getToolTipText() {
+		return text;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/XmlParser.java b/src/org/fife/ui/rsyntaxtextarea/parser/XmlParser.java
new file mode 100644
index 0000000..7ac405b
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/XmlParser.java
@@ -0,0 +1,229 @@
+/*
+ * 08/16/2008
+ *
+ * XMLParser.java - Simple XML parser.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.io.IOException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.xml.parsers.FactoryConfigurationError;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import org.xml.sax.*;
+import org.xml.sax.helpers.*;
+
+import org.fife.io.DocumentReader;
+import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
+
+
+/**
+ * A parser for XML documents.  Adds squiggle underlines for any XML errors
+ * found (though most XML parsers don't really have error recovery and so only
+ * can find one error at a time).<p>
+ *
+ * This class isn't actually used by RSyntaxTextArea anywhere, but you can
+ * install and use it yourself.  Doing so is as simple as:
+ * 
+ * <pre>
+ * XmlParser xmlParser = new XmlParser();
+ * textArea.addParser(xmlParser);
+ * </pre>
+ * 
+ * To support DTD validation, specify an entity resolver when creating the
+ * parser, and enable validation like so:
+ * 
+ * <pre>
+ * XmlParser xmlParser = new XmlParser(new MyEntityResolver());
+ * xmlParser.setValidating(true);
+ * textArea.addParser(xmlParser);
+ * </pre>
+ * 
+ * Also note that a single instance of this class can be installed on
+ * multiple instances of <code>RSyntaxTextArea</code>.<p>
+ *
+ * For a more complete XML parsing solution, see the
+ * <a href="http://svn.fifesoft.com/viewvc-1.0.5/bin/cgi/viewvc.cgi/RSTALanguageSupport/trunk/?root=RSyntaxTextArea">RSTALanguageSupport
+ * project</a>'s <code>XmlLanguageSupport</code> class.
+ * 
+ * @author Robert Futrell
+ * @version 1.1
+ */
+public class XmlParser extends AbstractParser {
+
+	private SAXParserFactory spf;
+	private DefaultParseResult result;
+	private EntityResolver entityResolver;
+
+
+	public XmlParser() {
+		this(null);
+	}
+
+
+	/**
+	 * Constructor allowing DTD validation of documents.
+	 * 
+	 * @param resolver An entity resolver to use if validation is enabled.
+	 * @see #setValidating(boolean)
+	 */
+	public XmlParser(EntityResolver resolver) {
+		this.entityResolver = resolver;
+		result = new DefaultParseResult(this);
+		try {
+			spf = SAXParserFactory.newInstance();
+		} catch (FactoryConfigurationError fce) {
+			fce.printStackTrace();
+		}
+	}
+
+
+	/**
+	 * Returns whether this parser does DTD validation.
+	 *
+	 * @return Whether this parser does DTD validation.
+	 * @see #setValidating(boolean)
+	 */
+	public boolean isValidating() {
+		return spf.isValidating();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public ParseResult parse(RSyntaxDocument doc, String style) {
+
+		result.clearNotices();
+		Element root = doc.getDefaultRootElement();
+		result.setParsedLines(0, root.getElementCount()-1);
+
+		if (spf==null || doc.getLength()==0) {
+			return result;
+		}
+
+		try {
+			SAXParser sp = spf.newSAXParser();
+			Handler handler = new Handler(doc);
+			DocumentReader r = new DocumentReader(doc);
+			InputSource input = new InputSource(r);
+			sp.parse(input, handler);
+			r.close();
+		} catch (SAXParseException spe) {
+			// A fatal parse error - ignore; a ParserNotice was already created.
+		} catch (Exception e) {
+			//e.printStackTrace(); // Will print if DTD specified and can't be found
+			result.addNotice(new DefaultParserNotice(this,
+					"Error parsing XML: " + e.getMessage(), 0, -1, -1));
+		}
+
+		return result;
+
+	}
+
+
+	/**
+	 * Sets whether this parser will use DTD validation if required.
+	 *
+	 * @param validating Whether DTD validation should be enabled.  If this is
+	 *        <code>true</code>, documents must specify a DOCTYPE, and you
+	 *        should have used the constructor specifying an entity resolver.
+	 * @see #isValidating()
+	 */
+	public void setValidating(boolean validating) {
+		spf.setValidating(validating);
+	}
+
+/*
+	public static void main(String[] args) {
+		javax.swing.JFrame frame = new javax.swing.JFrame();
+		org.fife.ui.rsyntaxtextarea.RSyntaxTextArea textArea = new
+			org.fife.ui.rsyntaxtextarea.RSyntaxTextArea(25, 40);
+		textArea.setSyntaxEditingStyle("text/xml");
+		XmlParser parser = new XmlParser(new EntityResolver() {
+			public InputSource resolveEntity(String publicId, String systemId)
+					throws SAXException, IOException {
+		    	if ("http://fifesoft.com/rsyntaxtextarea/theme.dtd".equals(systemId)) {
+		    		return new org.xml.sax.InputSource(getClass().getResourceAsStream("/theme.dtd"));
+		    	}
+		    	return null;
+			}
+		});
+		parser.setValidating(true);
+		textArea.addParser(parser);
+		try {
+			textArea.read(new java.io.BufferedReader(new java.io.FileReader("C:/temp/test.xml")), null);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		frame.setContentPane(new org.fife.ui.rtextarea.RTextScrollPane(textArea));
+		frame.pack();
+		frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
+		frame.setVisible(true);
+	}
+*/
+
+	/**
+	 * Callback notified when errors are found in the XML document.  Adds a
+	 * notice to be squiggle-underlined.
+	 */
+	private class Handler extends DefaultHandler {
+
+		private Document doc;
+
+		private Handler(Document doc) {
+			this.doc = doc;
+		}
+
+		private void doError(SAXParseException e, int level) {
+			int line = e.getLineNumber() - 1;
+			Element root = doc.getDefaultRootElement();
+			Element elem = root.getElement(line);
+			int offs = elem.getStartOffset();
+			int len = elem.getEndOffset() - offs;
+			if (line==root.getElementCount()-1) {
+				len++;
+			}
+			DefaultParserNotice pn = new DefaultParserNotice(XmlParser.this,
+											e.getMessage(), line, offs, len);
+			pn.setLevel(level);
+			result.addNotice(pn);
+		}
+
+		public void error(SAXParseException e) {
+			doError(e, ParserNotice.ERROR);
+		}
+
+		public void fatalError(SAXParseException e) {
+			doError(e, ParserNotice.ERROR);
+		}
+
+		// NOTE: If you compile with Java 5+, you must add IOException to the
+		// throws clause of this method.  The "official" release is built with
+		// Java 1.4.
+		public InputSource resolveEntity(String publicId, String systemId)
+								throws SAXException {
+			if (entityResolver!=null) {
+				try {
+					return entityResolver.resolveEntity(publicId, systemId);
+				} catch (IOException ioe) {
+					// TODO: Remove when removing 1.4.2-compatibility, as
+					// IOExceptions are thrown then
+					ioe.printStackTrace();
+				}
+			}
+			return super.resolveEntity(publicId, systemId);
+		}
+
+		public void warning(SAXParseException e) {
+			doError(e, ParserNotice.WARNING);
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/package.html b/src/org/fife/ui/rsyntaxtextarea/parser/package.html
new file mode 100644
index 0000000..9cc6c02
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/package.html
@@ -0,0 +1,9 @@
+<html>
+	<body>
+	Interfaces for parsing text in RSyntaxTextAreas and identifying errors,
+	warnings, etc.  Implementations of the <code>Parser</code>  interface
+	are notified when the document has been modified, so they can add
+	squiggle-underline markers to instances of RSTA to signify code errors and
+	other important snippets.
+	</body>
+</html>
diff --git a/src/org/fife/ui/rsyntaxtextarea/templates/AbstractCodeTemplate.java b/src/org/fife/ui/rsyntaxtextarea/templates/AbstractCodeTemplate.java
new file mode 100644
index 0000000..48080cb
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/templates/AbstractCodeTemplate.java
@@ -0,0 +1,132 @@
+/*
+ * 12/01/2008
+ *
+ * AbstractCodeTemplate.java - Base class for code templates.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.templates;
+
+
+/**
+ * A base class to build code templates on top of.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class AbstractCodeTemplate implements CodeTemplate {
+
+	/**
+	 * The ID of this template.
+	 */
+	private String id;
+
+
+	/**
+	 * This no-arg constructor is required for serialization purposes.
+	 */
+	public AbstractCodeTemplate() {
+	}
+
+
+	/**
+	 * Creates a new template.
+	 *
+	 * @param id The ID for this template.
+	 * @throws IllegalArgumentException If <code>id</code> is <code>null</code>.
+	 */
+	public AbstractCodeTemplate(String id) {
+		setID(id);
+	}
+
+
+	/**
+	 * Creates a deep copy of this template.
+	 *
+	 * @return A deep copy of this template.
+	 */
+	public Object clone() {
+		// This method can't be abstract as compilers don't like concrete
+		// subclassses calling super.clone() on  an abstract super.
+		try {
+			return super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new InternalError(
+				"CodeTemplate implementation not Cloneable: " +
+							getClass().getName());
+		}
+	}
+
+
+
+	/**
+	 * Compares the <code>StaticCodeTemplate</code> to another.
+	 *
+	 * @param o Another <code>StaticCodeTemplate</code> object.
+	 * @return A negative integer, zero, or a positive integer as this
+	 *         object is less than, equal-to, or greater than the passed-in
+	 *         object.
+	 * @throws ClassCastException If <code>o</code> is
+	 *         not an instance of <code>CodeTemplate</code>.
+	 */
+	public int compareTo(Object o) {
+		if (!(o instanceof CodeTemplate)) {
+			return -1;
+		}
+		CodeTemplate t2 = (CodeTemplate)o;
+		return getID().compareTo(t2.getID());
+	}
+
+
+	/**
+	 * Overridden to return "<code>true</code>" iff {@link #compareTo(Object)}
+	 * returns <code>0</code>.
+	 *
+	 * @return Whether this code template is equal to another.
+	 */
+	public boolean equals(Object obj) {
+		if (obj instanceof CodeTemplate) {
+			return compareTo(obj)==0;
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns the ID of this code template.
+	 *
+	 * @return The template's ID.
+	 * @see #setID(String)
+	 */
+	public String getID() {
+		return id;
+	}
+
+
+	/**
+	 * Returns the hash code for this template.
+	 *
+	 * @return The hash code for this template.
+	 */
+	public int hashCode() {
+		return id.hashCode();
+	}
+
+
+	/**
+	 * Sets the ID for this template.
+	 *
+	 * @param id The ID for this template.
+	 * @throws IllegalArgumentException If <code>id</code> is <code>null</code>.
+	 * @see #getID()
+	 */
+	public void setID(String id) {
+		if (id==null) {
+			throw new IllegalArgumentException("id cannot be null");
+		}
+		this.id = id;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/templates/CodeTemplate.java b/src/org/fife/ui/rsyntaxtextarea/templates/CodeTemplate.java
new file mode 100644
index 0000000..7295e04
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/templates/CodeTemplate.java
@@ -0,0 +1,73 @@
+/*
+ * 11/29/2008
+ *
+ * CodeTemplate.java - A "template" (macro) for commonly-typed code.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.templates;
+
+import java.io.Serializable;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+
+
+/**
+ * A "code template" is a kind of macro for commonly-typed code.  It
+ * associates a short identifier with a longer code snippet, then when the
+ * code template is enabled and the short identifier is typed, it is
+ * replaced with the longer code snippet.<p>
+ *
+ * For example, you can associate the identifier <code>forb</code>
+ * (short for "for-block") with the following code:<p>
+ *
+ * <pre>
+ *   for (<caret>) {
+ *
+ *   }
+ * </pre>
+ *
+ * Then, whenever you type <code>forb</code> followed by a trigger
+ * (e.g., a space) into a text area with this <code>CodeTemplate</code>,
+ * the code snippet is added in place of <code>forb</code>.  Further,
+ * the caret is placed at the position denoted by <code><caret></code>.<p>
+ *
+ * Static text replacements are done with {@link StaticCodeTemplate}.  Dynamic
+ * templates can also be created and used.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see StaticCodeTemplate
+ */
+public interface CodeTemplate extends Cloneable, Comparable, Serializable {
+
+
+	/**
+	 * Creates a deep copy of this template.
+	 *
+	 * @return A deep copy of this template.
+	 */
+	public Object clone();
+
+
+	/**
+	 * Returns the ID of this code template.
+	 *
+	 * @return The template's ID.
+	 */
+	public String getID();
+
+
+	/**
+	 * Invokes this code template.  The changes are made to the given text
+	 * area.
+	 *
+	 * @param textArea The text area to operate on.
+	 * @throws BadLocationException If something bad happens.
+	 */
+	public void invoke(RSyntaxTextArea textArea) throws BadLocationException;
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/templates/StaticCodeTemplate.java b/src/org/fife/ui/rsyntaxtextarea/templates/StaticCodeTemplate.java
new file mode 100644
index 0000000..c3b21d9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/templates/StaticCodeTemplate.java
@@ -0,0 +1,262 @@
+/*
+ * 02/21/2005
+ *
+ * CodeTemplate.java - A "template" (macro) for commonly-typed code.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.templates;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+import javax.swing.text.Element;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
+
+
+/**
+ * A code template that inserts static text before and after the caret.<p>
+ *
+ * For example, you can associate the identifier <code>forb</code>
+ * (short for "for-block") with the following code:<p>
+ *
+ * <pre>
+ *   for (<caret>) {
+ *
+ *   }
+ * </pre>
+ *
+ * Then, whenever you type <code>forb</code> followed by a trigger
+ * (e.g., a space) into a text area with this <code>CodeTemplate</code>,
+ * the code snippet is added in place of <code>forb</code>.  Further,
+ * the caret is placed at the position denoted by <code><caret></code>.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see CodeTemplate
+ */
+public class StaticCodeTemplate extends AbstractCodeTemplate {
+
+	private static final long serialVersionUID = 1;
+
+	/**
+	 * The code inserted before the caret position.
+	 */
+	private String beforeCaret;
+
+	/**
+	 * The code inserted after the caret position.
+	 */
+	private String afterCaret;
+
+	/**
+	 * Cached value representing whether <code>beforeCaret</code> contains
+	 * one or more newlines.
+	 */
+	private transient int firstBeforeNewline;
+
+	/**
+	 * Cached value representing whether <code>afterCaret</code> contains
+	 * one or more newlines.
+	 */
+	private transient int firstAfterNewline;
+
+	private static final String EMPTY_STRING		= "";
+
+
+	/**
+	 * Constructor.  This constructor only exists to support persistance
+	 * through serialization.
+	 */
+	public StaticCodeTemplate() {
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param id The ID of this code template.
+	 * @param beforeCaret The text to place before the caret.
+	 * @param afterCaret The text to place after the caret.
+	 */
+	public StaticCodeTemplate(String id, String beforeCaret, String afterCaret){
+		super(id);
+		setBeforeCaretText(beforeCaret);
+		setAfterCaretText(afterCaret);
+	}
+
+
+	/**
+	 * Returns the text that will be placed after the caret.
+	 *
+	 * @return The text.
+	 * @see #setAfterCaretText
+	 */
+	public String getAfterCaretText() {
+		return afterCaret;
+	}
+
+
+	/**
+	 * Returns the text that will be placed before the caret.
+	 *
+	 * @return The text.
+	 * @see #setBeforeCaretText
+	 */
+	public String getBeforeCaretText() {
+		return beforeCaret;
+	}
+
+
+	/**
+	 * Returns the "after caret" text, with each new line indented by
+	 * the specified amount.
+	 *
+	 * @param indent The amount to indent.
+	 * @return The "after caret" text.
+	 */
+	private String getAfterTextIndented(String indent) {
+		return getTextIndented(getAfterCaretText(), firstAfterNewline, indent);
+	}
+
+
+	/**
+	 * Returns the "before caret" text, with each new line indented by
+	 * the specified amount.
+	 *
+	 * @param indent The amount to indent.
+	 * @return The "before caret" text.
+	 */
+	private String getBeforeTextIndented(String indent) {
+		return getTextIndented(getBeforeCaretText(),firstBeforeNewline,indent);
+	}
+
+
+	/**
+	 * Returns text with newlines indented by the specifed amount.
+	 *
+	 * @param text The original text.
+	 * @param firstNewline The index of the first '\n' character.
+	 * @param indent The amount to indent.
+	 * @return The indented text.
+	 */
+	private String getTextIndented(String text,int firstNewline,String indent) {
+		if (firstNewline==-1) {
+			return text;
+		}
+		int pos = 0;
+		int old = firstNewline+1;
+		StringBuffer sb = new StringBuffer(text.substring(0, old));
+		sb.append(indent);
+		while ((pos=text.indexOf('\n', old))>-1) {
+			sb.append(text.substring(old, pos+1));
+			sb.append(indent);
+			old = pos+1;
+		}
+		if (old<text.length()) {
+			sb.append(text.substring(old));
+		}
+		return sb.toString();
+	}
+
+
+	/**
+	 * Invokes this code template.  The changes are made to the given text
+	 * area.
+	 *
+	 * @param textArea The text area to operate on.
+	 * @throws BadLocationException If something bad happens.
+	 */
+	public void invoke(RSyntaxTextArea textArea) throws BadLocationException {
+
+		Caret c = textArea.getCaret();
+		int dot = c.getDot();
+		int mark = c.getMark();
+		int p0 = Math.min(dot, mark);
+		int p1 = Math.max(dot, mark);
+		RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+		Element map = doc.getDefaultRootElement();
+
+		int lineNum = map.getElementIndex(dot);
+		Element line = map.getElement(lineNum);
+		int start = line.getStartOffset();
+		int end = line.getEndOffset()-1; // Why always "-1"?
+		String s = textArea.getText(start,end-start);
+		int len = s.length();
+
+		// endWS is the end of the leading whitespace
+		// of the current line.
+		int endWS = 0;
+		while (endWS<len && RSyntaxUtilities.isWhitespace(s.charAt(endWS))) {
+			endWS++;
+		}
+		s = s.substring(0, endWS);
+		p0 -= getID().length();
+		String beforeText = getBeforeTextIndented(s);
+		String afterText = getAfterTextIndented(s);
+		doc.replace(p0,p1-p0, beforeText+afterText, null);
+		textArea.setCaretPosition(p0+beforeText.length());
+
+	}
+
+
+	/**
+	 * Called when reading a serialized version of this document.  This is
+	 * overridden to initialize the transient members of this class.
+	 *
+	 * @param in The input stream to read from.
+	 * @throws ClassNotFoundException Never.
+	 * @throws IOException If an IO error occurs.
+	 */
+	private void readObject(ObjectInputStream in) throws ClassNotFoundException,
+											IOException  {
+		in.defaultReadObject();
+		// "Resetting" before and after text to the same values will replace
+		// nulls with empty srings, and set transient "first*Newline" values.
+		setBeforeCaretText(this.beforeCaret);
+		setAfterCaretText(this.afterCaret);
+	}
+
+
+	/**
+	 * Sets the text to place after the caret.
+	 *
+	 * @param afterCaret The text.
+	 * @see #getAfterCaretText()
+	 */
+	public void setAfterCaretText(String afterCaret) {
+		this.afterCaret = afterCaret==null ? EMPTY_STRING : afterCaret;
+		firstAfterNewline = this.afterCaret.indexOf('\n');
+	}
+
+
+	/**
+	 * Sets the text to place before the caret.
+	 *
+	 * @param beforeCaret The text.
+	 * @see #getBeforeCaretText()
+	 */
+	public void setBeforeCaretText(String beforeCaret) {
+		this.beforeCaret = beforeCaret==null ? EMPTY_STRING : beforeCaret;
+		firstBeforeNewline = this.beforeCaret.indexOf('\n');
+	}
+
+
+	/**
+	 * Returns a string representation of this template for debugging
+	 * purposes.
+	 *
+	 * @return A string representation of this template.
+	 */
+	public String toString() {
+		return "[StaticCodeTemplate: id=" + getID() +
+			", text=" + getBeforeCaretText() + "|" + getAfterCaretText() + "]";
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/templates/package.html b/src/org/fife/ui/rsyntaxtextarea/templates/package.html
new file mode 100644
index 0000000..afa3a6c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/templates/package.html
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	Facilitates adding code templates to an <code>RSyntaxTextArea</code>.
+	</body>
+</html>
diff --git a/src/org/fife/ui/rtextarea/AbstractGutterComponent.java b/src/org/fife/ui/rtextarea/AbstractGutterComponent.java
new file mode 100644
index 0000000..33283b0
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/AbstractGutterComponent.java
@@ -0,0 +1,114 @@
+/*
+ * 02/17/2009
+ *
+ * AbstractGutterComponent.java - A component that can be displayed in a Gutter.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Container;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import javax.swing.JPanel;
+import javax.swing.event.DocumentEvent;
+import javax.swing.text.View;
+
+
+/**
+ * A component that can be displayed in a {@link Gutter}.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+abstract class AbstractGutterComponent extends JPanel {
+
+	/**
+	 * The text area whose lines we are marking with icons.
+	 */
+	protected RTextArea textArea;
+
+	/**
+	 * The number of lines in the text area.
+	 */
+	protected int currentLineCount;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The text area.
+	 */
+	public AbstractGutterComponent(RTextArea textArea) {
+		setTextArea(textArea);
+	}
+
+
+	/**
+	 * Returns the bounds of a child view as a rectangle, since
+	 * <code>View</code>s tend to use <code>Shape</code>.
+	 *
+	 * @param parent The parent view of the child whose bounds we're getting.
+	 * @param line The index of the child view.
+	 * @param editorRect Returned from the text area's
+	 *        <code>getVisibleEditorRect</code> method.
+	 * @return The child view's bounds.
+	 */
+	protected static final Rectangle getChildViewBounds(View parent, int line,
+										Rectangle editorRect) {
+		Shape alloc = parent.getChildAllocation(line, editorRect);
+		if (alloc==null) {
+			// WrappedSyntaxView can have this when made so small it's
+			// no longer visible
+			return new Rectangle();
+		}
+		return alloc instanceof Rectangle ? (Rectangle)alloc :
+										alloc.getBounds();
+	}
+
+
+	/**
+	 * Returns the parent <code>Gutter</code> component.
+	 *
+	 * @return The parent <code>Gutter</code>.
+	 */
+	protected Gutter getGutter() {
+		Container parent = getParent();
+		return (parent instanceof Gutter) ? (Gutter)parent : null;
+	}
+
+
+	/**
+	 * Called when text is inserted to or removed from the text area.
+	 * Implementations can take this opportunity to repaint, revalidate, etc.
+	 *
+	 * @param e The document event.
+	 */
+	abstract void handleDocumentEvent(DocumentEvent e);
+
+
+	/**
+	 * Called when the line heights of the text area change.  This is usually
+	 * the result of one or more of the fonts in the editor changing.
+	 */
+	abstract void lineHeightsChanged();
+
+
+	/**
+	 * Sets the text area being displayed.  Subclasses can override, but
+	 * should call the super implementation.
+	 *
+	 * @param textArea The text area.
+	 */
+	public void setTextArea(RTextArea textArea) {
+		this.textArea = textArea;
+		int lineCount = textArea==null ? 0 : textArea.getLineCount();
+		if (currentLineCount!=lineCount) {
+			currentLineCount = lineCount;
+			repaint();
+		}
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/BackgroundPainterStrategy.java b/src/org/fife/ui/rtextarea/BackgroundPainterStrategy.java
new file mode 100644
index 0000000..bdca27f
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/BackgroundPainterStrategy.java
@@ -0,0 +1,44 @@
+/*
+ * 01/22/2005
+ *
+ * BackgroundPainterStrategy.java - Renders an RTextAreaBase's background
+ * using some strategy.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Graphics;
+import java.awt.Rectangle;
+
+
+/**
+ * Interface for classes that paint the background of an
+ * <code>RTextAreaBase</code>.  The Strategy pattern is used for this
+ * object because the background can be painted as a solid color, as
+ * an image, and possibly other ways (gradients, animated images, etc.).
+ * When a method to change the background of an <code>RTextAreaBase</code>
+ * instance is called (such as <code>setBackground</code>,
+ * <code>setBackgroundImage</code> or <code>setBackgoundObject</code>),
+ * the correct strategy is then created and used to paint its background.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see org.fife.ui.rtextarea.ImageBackgroundPainterStrategy
+ * @see org.fife.ui.rtextarea.ColorBackgroundPainterStrategy
+ */
+public interface BackgroundPainterStrategy {
+
+
+	/**
+	 * Paints the background.
+	 *
+	 * @param g The graphics context.
+	 * @param bounds The bounds of the object whose backgrouns we're
+	 *        painting.
+	 */
+	public void paint(Graphics g, Rectangle bounds);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/BufferedImageBackgroundPainterStrategy.java b/src/org/fife/ui/rtextarea/BufferedImageBackgroundPainterStrategy.java
new file mode 100644
index 0000000..e34cb84
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/BufferedImageBackgroundPainterStrategy.java
@@ -0,0 +1,98 @@
+/*
+ * 01/22/2005
+ *
+ * BufferedImageBackgroundPainterStrategy.java - Renders an RTextAreaBase's
+ * background as an image using a BufferedImage.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Graphics;
+import java.awt.Image;
+
+
+/**
+ * A strategy for painting the background of an <code>RTextAreaBase</code>
+ * as an image.  The image is always stretched to completely fill the
+ * <code>RTextAreaBase</code>.<p>
+ *
+ * A <code>java.awt.image.BufferedImage</code> is used for rendering;
+ * theoretically, for performance you should use
+ * <code>java.awt.image.VolatileImage</code>; see
+ * <code>org.fife.ui.RTextArea.VolatileImageBackgroundPainterStrategy</code>
+ * for this.<p>
+ *
+ * You can set the scaling hint used when stretching/skewing the image
+ * to fit in the <code>RTextAreaBase</code>'s background via the
+ * <code>setScalingHint</code> method, but keep in mind the more
+ * accurate the scaling hint, the less responsive your application will
+ * be when stretching the window (as that's the only time the image's
+ * size is recalculated).
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see org.fife.ui.rtextarea.ImageBackgroundPainterStrategy
+ * @see org.fife.ui.rtextarea.VolatileImageBackgroundPainterStrategy
+ */
+public class BufferedImageBackgroundPainterStrategy
+					extends ImageBackgroundPainterStrategy {
+
+	private Image bgImage;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param ta The text area whose background we'll be painting.
+	 */
+	public BufferedImageBackgroundPainterStrategy(RTextAreaBase ta) {
+		super(ta);
+	}
+
+
+	/**
+	 * Paints the image at the specified location.  This method assumes
+	 * scaling has already been done, and simply paints the background
+	 * image "as-is."
+	 *
+	 * @param g The graphics context.
+	 * @param x The x-coordinate at which to paint.
+	 * @param y The y-coordinate at which to paint.
+	 */
+	protected void paintImage(Graphics g, int x, int y) {
+		if (bgImage != null)
+			g.drawImage(bgImage, x,y, null);
+	}
+
+
+	/**
+	 * Rescales the displayed image to be the specified size.
+	 *
+	 * @param width The new width of the image.
+	 * @param height The new height of the image.
+	 * @param hint The scaling hint to use.
+	 */
+	protected void rescaleImage(int width, int height, int hint) {
+		Image master = getMasterImage();
+		if (master!=null) {
+			bgImage = master.getScaledInstance(width,height, hint);
+			tracker.addImage(bgImage, 1);
+			try {
+				tracker.waitForID(1);
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+				bgImage = null;
+				return;
+			} finally {
+				tracker.removeImage(bgImage, 1);
+			}
+		}
+		else {
+			bgImage = null;
+		}
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/ChangeableHighlightPainter.java b/src/org/fife/ui/rtextarea/ChangeableHighlightPainter.java
new file mode 100644
index 0000000..b7d394f
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/ChangeableHighlightPainter.java
@@ -0,0 +1,440 @@
+/*
+ * 11/10/2004
+ *
+ * ChangableHighlightPainter.java - A highlight painter whose color you can
+ * change.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Paint;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.SystemColor;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import javax.swing.plaf.TextUI;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.LayeredHighlighter;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+
+/**
+ * An extension of <code>LayerPainter</code> that allows the user to
+ * change several of its properties:
+ *
+ * <ul>
+ *   <li>Its color/fill style (can use a <code>GradientPaint</code>, for
+ *       example).</li>
+ *   <li>Whether the edges of a painted highlight are rounded.</li>
+ *   <li>Whether painted highlights have translucency.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ */
+public class ChangeableHighlightPainter
+		extends LayeredHighlighter.LayerPainter implements Serializable {
+
+
+	/**
+	 * The <code>Paint</code>/<code>Color</code> of this highlight.
+	 */
+	private Paint paint;
+
+	/**
+	 * Whether selections have rounded edges.
+	 */
+	private boolean roundedEdges;
+
+	/**
+	 * The alpha composite used to render with translucency.
+	 */
+	private transient AlphaComposite alphaComposite;
+
+	/**
+	 * The alpha value used in computing translucency.  This should stay in the
+	 * range <code>0.0f</code> (completely invisible) to <code>1.0f</code>
+	 * (completely opaque).
+	 */
+	private float alpha;
+
+
+	private static final int ARCWIDTH				= 8;
+	private static final int ARCHEIGHT				= 8;
+
+
+	/**
+	 * Creates a new <code>ChangableHighlightPainter</code> that paints
+	 * highlights with the text area's selection color (i.e., behaves exactly
+	 * like
+	 * <code>javax.swing.text.DefaultHighlighter.DefaultHighlightPainter
+	 * </code>).
+	 */
+	public ChangeableHighlightPainter() {
+		this(null);
+	}
+
+
+	/**
+	 * Creates a new highlight painter using the specified <code>Paint</code>
+	 * without rounded edges.
+	 *
+	 * @param paint The <code>Paint</code> (usually a
+	 *        <code>java.awt.Color</code>) with which to paint the
+	 *        highlights.
+	 */
+	public ChangeableHighlightPainter(Paint paint) {
+		this(paint, false);
+	}
+
+
+	/**
+	 * Creates a new highlight painter.
+	 *
+	 * @param paint The <code>Paint</code> (usually a
+	 *        <code>java.awt.Color</code>) with which to paint the
+	 *        highlights.
+	 * @param rounded Whether to use rounded edges on the highlights.
+	 */
+	public ChangeableHighlightPainter(Paint paint, boolean rounded) {
+		this(paint, rounded, 1.0f);
+	}
+
+
+	/**
+	 * Creates a new highlight painter.
+	 *
+	 * @param paint The <code>Paint</code> (usually a
+	 *        <code>java.awt.Color</code>) with which to paint the
+	 *        highlights.
+	 * @param rounded Whether to use rounded edges on the highlights.
+	 * @param alpha The alpha value to use when painting highlights.  This
+	 *        value should be in the range <code>0.0f</code> (completely
+	 *        transparent) through <code>1.0f</code> (opaque).
+	 */
+	public ChangeableHighlightPainter(Paint paint, boolean rounded,
+											float alpha) {
+		setPaint(paint);
+		setRoundedEdges(rounded);
+		setAlpha(alpha);
+	}
+
+
+	/**
+	 * Returns the alpha value used in computing the translucency of these
+	 * highlights.  A value of <code>1.0f</code> (the default) means that no
+	 * translucency is used; there is no performance hit for this value.  For
+	 * all other values (<code>[0.0f..1.0f)</code>), there will be a
+	 * performance hit.
+	 *
+	 * @return The alpha value.
+	 * @see #setAlpha
+	 */
+	public float getAlpha() {
+		return alpha;
+	}
+
+
+	/**
+	 * Returns the alpha composite to use when rendering highlights with this
+	 * painter.
+	 *
+	 * @return The alpha composite.
+	 */
+	private AlphaComposite getAlphaComposite() {
+		if (alphaComposite==null)
+			alphaComposite = AlphaComposite.getInstance(
+									AlphaComposite.SRC_OVER, alpha);
+		return alphaComposite;
+	}
+
+
+	/**
+	 * Returns the <code>Paint</code> (usually a <code>java.awt.Color</code>)
+	 * being used to paint highlights.
+	 *
+	 * @return The <code>Paint</code>.
+	 * @see #setPaint
+	 */
+	public Paint getPaint() {
+		return paint;
+	}
+
+
+	/**
+	 * Returns whether rounded edges are used when painting selections with
+	 * this highlight painter.
+	 *
+	 * @return Whether rounded edges are used.
+	 * @see #setRoundedEdges
+	 */
+	public boolean getRoundedEdges() {
+		return roundedEdges;
+	}
+
+
+	/**
+	 * Paints a highlight.
+	 *
+	 * @param g the graphics context
+	 * @param offs0 the starting model offset >= 0
+	 * @param offs1 the ending model offset >= offs1
+	 * @param bounds the bounding box for the highlight
+	 * @param c the editor
+	 */
+	public void paint(Graphics g, int offs0, int offs1, Shape bounds,
+					JTextComponent c) {
+
+		Rectangle alloc = bounds.getBounds();
+
+		// Set up translucency if necessary.
+		Graphics2D g2d = (Graphics2D)g;
+		Composite originalComposite = null;
+		if (getAlpha()<1.0f) {
+			originalComposite = g2d.getComposite();
+			g2d.setComposite(getAlphaComposite());
+		}
+
+		try {
+
+			// Determine locations.
+			TextUI mapper = c.getUI();
+			Rectangle p0 = mapper.modelToView(c, offs0);
+			Rectangle p1 = mapper.modelToView(c, offs1);
+			Paint paint = getPaint();
+			if (paint==null)
+				g2d.setColor(c.getSelectionColor());
+			else
+				g2d.setPaint(paint);
+
+			// Entire highlight is on one line.
+			if (p0.y == p1.y) {
+				Rectangle r = p0.union(p1);
+				g2d.fillRect(r.x, r.y, r.width, r.height);
+			}
+
+			// Highlight spans lines.
+			else {
+				int p0ToMarginWidth = alloc.x + alloc.width - p0.x;
+				g2d.fillRect(p0.x, p0.y, p0ToMarginWidth, p0.height);
+				if ((p0.y + p0.height) != p1.y) {
+					g2d.fillRect(alloc.x, p0.y + p0.height, alloc.width, 
+			   					p1.y - (p0.y + p0.height));
+				}
+				g2d.fillRect(alloc.x, p1.y, (p1.x - alloc.x), p1.height);
+			}
+
+		} catch (BadLocationException e) {
+			// Never happens.
+			e.printStackTrace();
+		} finally {
+			// Restore state from before translucency if necessary.
+			if (getAlpha()<1.0f)
+				g2d.setComposite(originalComposite);
+		}
+
+	}
+
+	
+	/**
+	 * Paints a portion of a highlight.
+	 *
+	 * @param g the graphics context
+	 * @param offs0 the starting model offset >= 0
+	 * @param offs1 the ending model offset >= offs1
+	 * @param bounds the bounding box of the view, which is not
+	 *        necessarily the region to paint.
+	 * @param c the editor
+	 * @param view View painting for
+	 * @return region drawing occurred in
+	 */
+	public Shape paintLayer(Graphics g, int offs0, int offs1,
+						Shape bounds, JTextComponent c, View view) {
+
+
+		// Set up translucency if necessary.
+		Graphics2D g2d = (Graphics2D)g;
+		Composite originalComposite = null;
+		if (getAlpha()<1.0f) {
+			originalComposite = g2d.getComposite();
+			g2d.setComposite(getAlphaComposite());
+		}
+
+		// Set the color (our own if defined, otherwise text area's).
+		Paint paint = getPaint();
+		if (paint==null)
+			g2d.setColor(c.getSelectionColor());
+		else
+			g2d.setPaint(paint);
+
+		// This special case isn't needed for most standard Swing Views (which
+		// always return a width of 1 for modelToView() calls), but it is
+		// needed for RSTA views, which actually return the width of chars for
+		// modelToView calls.  But this should be faster anyway, as we
+		// short-circuit and do only one modelToView() for one offset.
+		if (offs0==offs1) {
+			try {
+				Shape s = view.modelToView(offs0, bounds,
+											Position.Bias.Forward);
+				Rectangle r = s.getBounds();
+				g.drawLine(r.x, r.y, r.x, r.y+r.height);
+				return r;
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Never happens
+				return null;
+			}
+		}
+
+		// Contained in view, can just use bounds.
+		if (offs0==view.getStartOffset() && offs1==view.getEndOffset()) {
+
+			Rectangle alloc;
+			if (bounds instanceof Rectangle)
+				alloc = (Rectangle)bounds;
+			else
+				alloc = bounds.getBounds();
+			
+			g2d.fillRect(alloc.x, alloc.y, alloc.width, alloc.height);
+
+			// Restore state from before translucency if necessary.
+			if (getAlpha()<1.0f)
+				g2d.setComposite(originalComposite);
+
+			return alloc;
+
+		}
+
+		// Should only render part of View.
+		else {
+
+			try {
+
+				Shape shape = view.modelToView(offs0, Position.Bias.Forward,
+										offs1,Position.Bias.Backward,
+										bounds);
+				Rectangle r = (shape instanceof Rectangle) ?
+								(Rectangle)shape : shape.getBounds();
+				if (roundedEdges) {
+					g2d.fillRoundRect(r.x,r.y, r.width,r.height, ARCWIDTH,
+													ARCHEIGHT);
+				}
+				else {
+					g2d.fillRect(r.x, r.y, r.width, r.height);
+				}
+
+				// Restore state from before translucency if necessary.
+				if (getAlpha()<1.0f)
+					g2d.setComposite(originalComposite);
+
+				return r;
+
+			} catch (BadLocationException ble) {
+				ble.printStackTrace();
+			} finally {
+				// Restore state from before translucency if necessary.
+				if (getAlpha()<1.0f)
+					g2d.setComposite(originalComposite);
+			}
+
+		}
+
+		// Only if exception
+		return null;
+
+	}
+
+
+	/**
+	 * Deserializes a painter.
+	 *
+	 * @param s The stream to read from.
+	 * @throws ClassNotFoundException
+	 * @throws IOException
+	 */
+	private void readObject(ObjectInputStream s)
+						throws ClassNotFoundException, IOException {
+		s.defaultReadObject();
+		// We cheat and always serialize the Paint as a Color.  "-1" means
+		// no Paint (i.e. use system selection color when painting).
+		int rgb = s.readInt();
+		paint = rgb==-1 ? null : new Color(rgb);
+		alphaComposite = null; // Keep FindBugs happy.  This will get set later
+	}
+
+
+	/**
+	 * Sets the alpha value used in rendering highlights.  If this value is
+	 * <code>1.0f</code> (the default), the highlights are rendered completely
+	 * opaque.  This behavior matches that of
+	 * <code>DefaultHighlightPainter</code> and imposes no performance hit.  If
+	 * this value is below <code>1.0f</code>, it represents how opaque the
+	 * highlight will be.  There will be a small performance hit for values
+	 * less than <code>1.0f</code>.
+	 *
+	 * @param alpha The new alpha value to use for transparency.
+	 * @see #getAlpha
+	 */
+	public void setAlpha(float alpha) {
+		this.alpha = alpha;
+		this.alpha = Math.max(alpha, 0.0f);
+		this.alpha = Math.min(1.0f, alpha);
+		alphaComposite = null; // So it is recreated with new alpha.
+	}
+
+
+	/**
+	 * Sets the <code>Paint</code> (usually a <code>java.awt.Color</code>)
+	 * used to paint this highlight.
+	 *
+	 * @param paint The new <code>Paint</code>.
+	 * @see #getPaint
+	 */
+	public void setPaint(Paint paint) {
+		this.paint = paint;
+	}
+
+
+	/**
+	 * Sets whether rounded edges are used when painting this highlight.
+	 *
+	 * @param rounded Whether rounded edges should be used.
+	 * @see #getRoundedEdges
+	 */
+	public void setRoundedEdges(boolean rounded) {
+		roundedEdges = rounded;
+	}
+
+
+	/**
+	 * Serializes this painter.
+	 *
+	 * @param s The stream to write to.
+	 * @throws IOException If an IO error occurs.
+	 */
+	private void writeObject(ObjectOutputStream s) throws IOException {
+		s.defaultWriteObject();
+		int rgb = -1; // No Paint -> Use JTextComponent's selection color
+		if (paint!=null) {
+			// NOTE: We cheat and always serialize the Paint as a Color.
+			// This is (practically) always the case anyway.
+			Color c = (paint instanceof Color) ? ((Color)paint) :
+											SystemColor.textHighlight;
+			rgb = c.getRGB();
+		}
+		s.writeInt(rgb);
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/ColorBackgroundPainterStrategy.java b/src/org/fife/ui/rtextarea/ColorBackgroundPainterStrategy.java
new file mode 100644
index 0000000..c25d0dc
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/ColorBackgroundPainterStrategy.java
@@ -0,0 +1,108 @@
+/*
+ * 01/22/2005
+ *
+ * ColorBackgroundPainterStrategy.java - Renders an RTextAreaBase's background
+ * as a single color.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+
+
+/**
+ * A strategy for painting the background of an <code>RTextAreaBase</code>
+ * as a solid color.  The default background for <code>RTextAreaBase</code>s
+ * is this strategy using the color white.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see org.fife.ui.rtextarea.ImageBackgroundPainterStrategy
+ */
+public class ColorBackgroundPainterStrategy
+				implements BackgroundPainterStrategy {
+
+	private Color color;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param color The color to use when painting the background.
+	 */
+	public ColorBackgroundPainterStrategy(Color color) {
+		setColor(color);
+	}
+
+
+	/**
+	 * Returns whether or not the specified object is equivalent to
+	 * this one.
+	 *
+	 * @param o2 The object to which to compare.
+	 * @return Whether <code>o2</code> is another
+	 *         <code>ColorBackgroundPainterStrategy</code> representing
+	 *         the same color as this one.
+	 */
+	public boolean equals(Object o2) {
+		return o2!=null &&
+			(o2 instanceof ColorBackgroundPainterStrategy) &&
+			this.color.equals(
+				((ColorBackgroundPainterStrategy)o2).getColor());
+	}
+
+
+	/**
+	 * Returns the color used to paint the background.
+	 *
+	 * @return The color.
+	 * @see #setColor
+	 */
+	public Color getColor() {
+		return color;
+	}
+
+
+	/**
+	 * Returns the hash code to use when placing an object of this type into
+	 * hash maps.  This method is implemented since we overrode
+	 * {@link #equals(Object)}, to keep FindBugs happy.
+	 *
+	 * @return The hash code.
+	 */
+	public int hashCode() {
+		return color.hashCode();
+	}
+
+
+	/**
+	 * Paints the background.
+	 *
+	 * @param g The graphics context.
+	 * @param bounds The bounds of the object whose backgrouns we're
+	 *        painting.
+	 */
+	public void paint(Graphics g, Rectangle bounds) {
+		Color temp = g.getColor();
+		g.setColor(color);
+		g.fillRect(bounds.x,bounds.y, bounds.width,bounds.height);
+		g.setColor(temp);
+	}
+
+
+	/**
+	 * Sets the color used to paint the background.
+	 *
+	 * @param color The color to use.
+	 * @see #getColor
+	 */
+	public void setColor(Color color) {
+		this.color = color;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/ConfigurableCaret.java b/src/org/fife/ui/rtextarea/ConfigurableCaret.java
new file mode 100644
index 0000000..603e998
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/ConfigurableCaret.java
@@ -0,0 +1,722 @@
+/*
+ * 12/21/2004
+ *
+ * ConfigurableCaret.java - The caret used by RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.datatransfer.*;
+import java.awt.event.ActionEvent;
+import java.io.*;
+import javax.swing.*;
+import javax.swing.plaf.*;
+import javax.swing.text.*;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * The caret used by {@link RTextArea}.  This caret has all of the properties
+ * that <code>javax.swing.text.DefaultCaret</code> does, as well as adding the
+ * following niceties:
+ *
+ * <ul>
+ *   <li>This caret can paint itself several different ways:
+ *      <ol>
+ *         <li>As a vertical line (like <code>DefaultCaret</code>)</li>
+ *         <li>As a slightly thicker vertical line (like Eclipse)</li>
+ *         <li>As an underline</li>
+ *         <li>As a "block caret"</li>
+ *         <li>As a rectangle around the current character</li>
+ *      </ol></li>
+ *   <li>On Microsoft Windows and other operating systems that do not
+ *       support system selection (i.e., selecting text, then pasting
+ *       via the middle mouse button), clicking the middle mouse button
+ *       will cause a regular paste operation to occur.  On systems
+ *       that support system selection (i.e., all UNIX variants),
+ *       the middle mouse button will behave normally.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ */
+public class ConfigurableCaret extends DefaultCaret {
+
+	/**
+	 * The minimum value of a caret style.
+	 */
+	public static final int MIN_STYLE				= 0;
+
+	/**
+	 * The vertical line style.
+	 */
+	public static final int VERTICAL_LINE_STYLE		= 0;
+
+	/**
+	 * The horizontal line style.
+	 */
+	public static final int UNDERLINE_STYLE			= 1;
+
+	/**
+	 * The block style.
+	 */
+	public static final int BLOCK_STYLE			= 2;
+
+	/**
+	 * The block border style.
+	 */
+	public static final int BLOCK_BORDER_STYLE		= 3;
+
+	/**
+	 * A thicker vertical line (2 pixels instead of 1).
+	 */
+	public static final int THICK_VERTICAL_LINE_STYLE	= 4;
+
+	/**
+	 * The maximum value of a caret style.
+	 */
+	public static final int MAX_STYLE				= THICK_VERTICAL_LINE_STYLE;
+
+	/**
+	 * Action used to select a word on a double click.
+	 */
+	static private transient Action selectWord = null;
+
+	/**
+	 * Action used to select a line on a triple click.
+	 */
+	static private transient Action selectLine = null;
+
+	/**
+	 * holds last MouseEvent which caused the word selection
+	 */
+	private transient MouseEvent selectedWordEvent = null;
+
+	/**
+	 * Used for fastest-possible retrieval of the character at the
+	 * caret's position in the document.
+	 */
+	private transient Segment seg;
+
+	/**
+	 * Whether the caret is a vertical line, a horizontal line, or a block.
+	 */
+	private int style;
+
+	/**
+	 * The selection painter.  By default this paints selections with the
+	 * text area's selection color.
+	 */
+	private ChangeableHighlightPainter selectionPainter;
+
+	/**
+	 * Whether this is Java 1.4.
+	 */
+	/* TODO: Remove me when 1.4 support is removed. */
+	private static final boolean IS_JAVA_1_4 =
+				"1.4".equals(System.getProperty("java.specification.version"));
+
+
+	/**
+	 * Creates the caret using {@link #VERTICAL_LINE_STYLE}.
+	 */
+	public ConfigurableCaret() {
+		this(VERTICAL_LINE_STYLE);
+	}
+
+
+	/**
+	 * Constructs a new <code>ConfigurableCaret</code>.
+	 *
+	 * @param style The style to use when painting the caret.  If this is
+	 *        invalid, then {@link #VERTICAL_LINE_STYLE} is used.
+	 */
+	public ConfigurableCaret(int style) {
+		seg = new Segment();
+		setStyle(style);
+		selectionPainter = new ChangeableHighlightPainter();
+	}
+
+
+	/**
+	 * Adjusts the caret location based on the MouseEvent.
+	 */
+	private void adjustCaret(MouseEvent e) {
+		if ((e.getModifiers()&ActionEvent.SHIFT_MASK)!=0 && getDot()!=-1)
+			moveCaret(e);
+		else
+			positionCaret(e);
+	}
+
+
+	/**
+	 * Adjusts the focus, if necessary.
+	 *
+	 * @param inWindow if true indicates requestFocusInWindow should be used
+	 */
+	private void adjustFocus(boolean inWindow) {
+		RTextArea textArea = getTextArea();
+		if ((textArea != null) && textArea.isEnabled() &&
+				textArea.isRequestFocusEnabled()) {
+			if (inWindow)
+				textArea.requestFocusInWindow();
+			else 
+				textArea.requestFocus();
+		}
+	}
+
+
+	/**
+	 * Overridden to damage the correct width of the caret, since this caret
+	 * can be different sizes.
+	 *
+	 * @param r The current location of the caret.
+	 */
+	protected synchronized void damage(Rectangle r) {
+		if (r != null) {
+			validateWidth(r); // Check for "0" or "1" caret width
+			x = r.x - 1;
+			y = r.y;
+			width = r.width + 4;
+			height = r.height;
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Called when the UI is being removed from the
+	 * interface of a JTextComponent.  This is used to
+	 * unregister any listeners that were attached.
+	 *
+	 * @param c The text component.  If this is not an
+	 *        <code>RTextArea</code>, an <code>Exception</code>
+	 *        will be thrown.
+	 * @see Caret#deinstall
+	 */
+	public void deinstall(JTextComponent c) {
+		if (!(c instanceof RTextArea))
+			throw new IllegalArgumentException(
+					"c must be instance of RTextArea");
+		super.deinstall(c);
+		c.setNavigationFilter(null);
+	}
+
+
+	/**
+	 * Gets the text editor component that this caret is bound to.
+	 *
+	 * @return The <code>RTextArea</code>.
+	 */
+	protected RTextArea getTextArea() {
+		return (RTextArea)getComponent();
+	}
+
+
+	/**
+	 * Returns whether this caret's selection uses rounded edges.
+	 *
+	 * @return Whether this caret's edges are rounded.
+	 * @see #setRoundedSelectionEdges
+	 */
+	public boolean getRoundedSelectionEdges() {
+		return ((ChangeableHighlightPainter)getSelectionPainter()).
+								getRoundedEdges();
+	}
+
+
+	/**
+	 * Gets the painter for the Highlighter.  This is overridden to return
+	 * our custom selection painter.
+	 *
+	 * @return The painter.
+	 */
+	protected Highlighter.HighlightPainter getSelectionPainter() {
+		return selectionPainter;
+	}
+
+
+	/**
+	 * Gets the current style of this caret.
+	 *
+	 * @return The caret's style.
+	 * @see #setStyle(int)
+	 */
+	public int getStyle() {
+		return style;
+	}
+
+
+	/**
+	 * Installs this caret on a text component.
+	 *
+	 * @param c The text component.  If this is not an {@link RTextArea},
+	 *        an <code>Exception</code> will be thrown.
+	 * @see Caret#install
+	 */
+	public void install(JTextComponent c) {
+		if (!(c instanceof RTextArea))
+			throw new IllegalArgumentException(
+					"c must be instance of RTextArea");
+		super.install(c);
+		c.setNavigationFilter(new FoldAwareNavigationFilter());
+	}
+	/**
+	 * Called when the mouse is clicked.  If the click was generated from
+	 * button1, a double click selects a word, and a triple click the
+	 * current line.
+	 *
+	 * @param e the mouse event
+	 * @see MouseListener#mouseClicked
+	 */
+	public void mouseClicked(MouseEvent e) {
+
+		if (! e.isConsumed()) {
+
+			RTextArea textArea = getTextArea();
+			int nclicks = e.getClickCount();
+
+			if (SwingUtilities.isLeftMouseButton(e)) {
+				if (nclicks<=2) {
+					// Only handle these clicks for 1.4.  In 1.5 the word
+					// selection is (also?) handled in mousePressed, and if we
+					// handle it here, our word selection gets doubled-up.
+					if (IS_JAVA_1_4) {
+						if (nclicks==1) {
+							selectedWordEvent = null;
+						}
+						else { // 2
+							selectWord(e);
+							selectedWordEvent = null;
+						}
+					}
+				}
+				else {
+					nclicks %= 2; // Alternate selecting word/line.
+					switch (nclicks) {
+						case 0:
+							selectWord(e);
+							selectedWordEvent = null;
+							break;
+						case 1:
+							Action a = null;
+							ActionMap map = textArea.getActionMap();
+							if (map != null)
+								a = map.get(RTextAreaEditorKit.selectLineAction);
+							if (a == null) {
+								if (selectLine == null) {
+									selectLine = new RTextAreaEditorKit.SelectLineAction();
+								}
+								a = selectLine;
+							}
+							a.actionPerformed(new ActionEvent(textArea,
+										ActionEvent.ACTION_PERFORMED,
+										null, e.getWhen(), e.getModifiers()));
+					}
+				}
+			}
+
+			else if (SwingUtilities.isMiddleMouseButton(e)) {
+				if (nclicks == 1 && textArea.isEditable() && textArea.isEnabled()) {
+					// Paste the system selection, if it exists (e.g., on UNIX
+					// platforms, the user can select text, the middle-mouse click
+					// to paste it; this doesn't work on Windows).  If the system
+					// doesn't support system selection, just do a normal paste.
+					JTextComponent c = (JTextComponent) e.getSource();
+					if (c != null) {
+						try {
+							Toolkit tk = c.getToolkit();
+							Clipboard buffer = tk.getSystemSelection();
+							// If the system supports system selections, (e.g. UNIX),
+							// try to do it.
+							if (buffer != null) {
+								adjustCaret(e);
+								TransferHandler th = c.getTransferHandler();
+								if (th != null) {
+									Transferable trans = buffer.getContents(null);
+									if (trans != null)
+										th.importData(c, trans);
+								}
+								adjustFocus(true);
+							}
+							// If the system doesn't support system selections
+							// (e.g. Windows), just do a normal paste.
+							else {
+								textArea.paste();
+							}
+						} catch (HeadlessException he) {
+							// do nothing... there is no system clipboard
+						}
+					} // if (c!=null)
+				} // if (nclicks == 1 && component.isEditable() && component.isEnabled())
+			} // else if (SwingUtilities.isMiddleMouseButton(e))
+
+		} // if (!c.isConsumed())
+
+	}
+
+
+	/**
+	 * Overridden to also focus the text component on right mouse clicks.
+	 *
+	 * @param e The mouse event.
+	 */
+	public void mousePressed(MouseEvent e) {
+		super.mousePressed(e);
+		if (!e.isConsumed() && SwingUtilities.isRightMouseButton(e)) {
+			JTextComponent c = getComponent();
+			if (c!=null && c.isEnabled() && c.isRequestFocusEnabled()) {
+				c.requestFocusInWindow();
+			}
+		}
+	}
+
+
+	/**
+	 * Paints the cursor.
+	 *
+	 * @param g The graphics context in which to paint.
+	 */
+	public void paint(Graphics g) {
+
+		// If the cursor is currently visible...
+		if (isVisible()) {
+
+			try {
+
+				RTextArea textArea = getTextArea();
+				g.setColor(textArea.getCaretColor());
+				TextUI mapper = textArea.getUI();
+				Rectangle r = mapper.modelToView(textArea, getDot());
+
+				// "Correct" the value of rect.width (takes into
+				// account caret being at EOL (and thus rect.width==1),
+				// etc.
+				// We do this even for LINE_STYLE because
+				// if they change from that caret to block/underline,
+				// the first time they do so width==1, so it will take
+				// one caret flash to paint correctly (wider).  If we
+				// do this every time, then it's painted correctly the
+				// first blink.
+				validateWidth(r);
+
+				// This condition is most commonly hit when code folding is
+				// enabled and the user collapses a fold above the caret
+				// position.  If our cached x/y/w/h aren't updated, this caret
+				// appears to stop blinking because the wrong line range gets
+				// damaged.  This check keeps us in sync.
+				if (width>0 && height>0 &&
+						!contains(r.x, r.y, r.width, r.height)) {
+					Rectangle clip = g.getClipBounds();
+					if (clip != null && !clip.contains(this)) {
+						// Clip doesn't contain the old location, force it
+						// to be repainted lest we leave a caret around.
+						repaint();
+					}
+					// This will potentially cause a repaint of something
+					// we're already repainting, but without changing the
+					// semantics of damage we can't really get around this.
+					damage(r);
+				}
+
+				// Need to subtract 2 from height, otherwise
+				// the caret will expand too far vertically.
+				r.height -= 2;
+
+				switch (style) {
+
+					// Draw a big rectangle, and xor the foreground color.
+					case BLOCK_STYLE:
+						Color textAreaBg = textArea.getBackground();
+						if (textAreaBg==null) {
+							textAreaBg = Color.white;
+						}
+						g.setXORMode(textAreaBg);
+						// fills x==r.x to x==(r.x+(r.width)-1), inclusive.
+						g.fillRect(r.x,r.y, r.width,r.height);
+						break;
+
+					// Draw a rectangular border.
+					case BLOCK_BORDER_STYLE:
+						// fills x==r.x to x==(r.x+(r.width-1)), inclusive.
+						g.drawRect(r.x,r.y, r.width-1,r.height);
+						break;
+
+					// Draw an "underline" below the current position.
+					case UNDERLINE_STYLE:
+						textAreaBg = textArea.getBackground();
+						if (textAreaBg==null) {
+							textAreaBg = Color.white;
+						}
+						g.setXORMode(textAreaBg);
+						int y = r.y + r.height;
+						g.drawLine(r.x,y, r.x+r.width-1,y);
+						break;
+
+					// Draw a vertical line.
+					default:
+					case VERTICAL_LINE_STYLE:
+						g.drawLine(r.x,r.y, r.x,r.y+r.height);
+						break;
+
+					// A thicker vertical line.
+					case THICK_VERTICAL_LINE_STYLE:
+						g.drawLine(r.x,r.y, r.x,r.y+r.height);
+						r.x++;
+						g.drawLine(r.x,r.y, r.x,r.y+r.height);
+						break;
+
+				} // End of switch (style).
+
+			} catch (BadLocationException ble) {
+				ble.printStackTrace();
+			}
+
+		} // End of if (isVisible()).
+
+	}
+
+
+	/**
+	 * Deserializes a caret.  This is overridden to read the caret's style.
+	 *
+	 * @param s The stream to read from.
+	 * @throws ClassNotFoundException
+	 * @throws IOException
+	 */
+	private void readObject(ObjectInputStream s)
+						throws ClassNotFoundException, IOException {
+		s.defaultReadObject();
+		setStyle(s.readInt());
+		seg = new Segment();
+	}
+
+
+	/**
+	 * Selects word based on the MouseEvent
+	 */
+	private void selectWord(MouseEvent e) {
+		if (selectedWordEvent != null
+				&& selectedWordEvent.getX() == e.getX()
+				&& selectedWordEvent.getY() == e.getY()) {
+			// We've already the done selection for this.
+			return;
+		}
+		Action a = null;
+		RTextArea textArea = getTextArea();
+		ActionMap map = textArea.getActionMap();
+		if (map != null) {
+			a = map.get(RTextAreaEditorKit.selectWordAction);
+		}
+		if (a == null) {
+			if (selectWord == null) {
+				selectWord = new RTextAreaEditorKit.SelectWordAction();
+			}
+			a = selectWord;
+		}
+		a.actionPerformed(new ActionEvent(textArea,
+							ActionEvent.ACTION_PERFORMED,
+							null, e.getWhen(), e.getModifiers()));
+		selectedWordEvent = e;
+	}
+
+
+	/**
+	 * Sets whether this caret's selection should have rounded edges.
+	 *
+	 * @param rounded Whether it should have rounded edges.
+	 * @see #getRoundedSelectionEdges()
+	 */
+	public void setRoundedSelectionEdges(boolean rounded) {
+		((ChangeableHighlightPainter)getSelectionPainter()).
+								setRoundedEdges(rounded);
+	}
+
+
+	/**
+	 * Overridden to always render the selection, even when the text component
+	 * loses focus.
+	 *
+	 * @param visible Whether the selection should be visible.  This parameter
+	 *        is ignored.
+	 */
+	public void setSelectionVisible(boolean visible) {
+		super.setSelectionVisible(true);
+	}
+
+
+	/**
+	 * Sets the style used when painting the caret.
+	 *
+	 * @param style The style to use.  If this isn't one of
+	 *        <code>VERTICAL_LINE_STYLE</code>, <code>UNDERLINE_STYLE</code>,
+	 *        or <code>BLOCK_STYLE</code>, then
+	 *        <code>VERTICAL_LINE_STYLE</code> is used.
+	 * @see #getStyle()
+	 */
+	public void setStyle(int style) {
+		if (style<MIN_STYLE || style>MAX_STYLE)
+			style = VERTICAL_LINE_STYLE;
+		this.style = style;
+		repaint();
+	}
+
+
+	/**
+	 * Helper function used by the block and underline carets to ensure the
+	 * width of the painted caret is valid.  This is done for the following
+	 * reasons:
+	 *
+	 * <ul>
+	 *   <li>The <code>View</code> classes in the javax.swing.text package
+	 *       always return a width of "1" when <code>modelToView</code> is
+	 *       called.  We'll be needing the actual width.</li>
+	 *   <li>Even in smart views, such as <code>RSyntaxTextArea</code>'s
+	 *       <code>SyntaxView</code> and <code>WrappedSyntaxView</code> that
+	 *       return the width of the current character, if the caret is at the
+	 *       end of a line for example, the width returned from
+	 *       <code>modelToView</code> will be 0 (as the width of unprintable
+	 *       characters such as '\n' is calculated as 0).  In this case, we'll
+	 *       use a default width value.</li>
+	 * </ul>
+	 *
+	 * @param rect The rectangle returned by the current
+	 *        <code>View</code>'s <code>modelToView</code>
+	 *        method for the caret position.
+	 */
+	private void validateWidth(Rectangle rect) {
+
+		// If the width value > 1, we assume the View is
+		// a "smart" view that returned the proper width.
+		// So only worry about this stuff if width <= 1.
+		if (rect!=null && rect.width<=1) {
+
+			// The width is either 1 (most likely, we're using a "dumb" view
+			// like those in javax.swing.text) or 0 (most likely, we're using
+			// a "smart" view like org.fife.ui.rsyntaxtextarea.SyntaxView,
+			// we're at the end of a line, and the width of '\n' is being
+			// computed as 0).
+
+			try {
+
+				// Try to get a width for the character at the caret
+				// position.  We use the text area's font instead of g's
+				// because g's may vary in an RSyntaxTextArea.
+				RTextArea textArea = getTextArea();
+				textArea.getDocument().getText(getDot(),1, seg);
+				Font font = textArea.getFont();
+				FontMetrics fm = textArea.getFontMetrics(font);
+				rect.width = fm.charWidth(seg.array[seg.offset]);
+
+				// This width being returned 0 likely means that it is an
+				// unprintable character (which is almost 100% to be a
+				// newline char, i.e., we're at the end of a line).  So,
+				// just use the width of a space.
+				if (rect.width==0) {
+					rect.width = fm.charWidth(' ');
+				}
+
+			} catch (BadLocationException ble) {
+				// This shouldn't ever happen.
+				ble.printStackTrace();
+				rect.width = 8;
+			}
+
+		} // End of if (rect!=null && rect.width<=1).
+
+	}
+
+
+	/**
+	 * Serializes this caret.  This is overridden to write the style of the
+	 * caret.
+	 *
+	 * @param s The stream to write to.
+	 * @throws IOException If an IO error occurs.
+	 */
+	private void writeObject(ObjectOutputStream s) throws IOException {
+		s.defaultWriteObject();
+		s.writeInt(getStyle());
+	}
+
+
+	/**
+	 * Keeps the caret out of folded regions in edge cases where it doesn't
+	 * happen automatically, for example, when the caret moves automatically in
+	 * response to Document.insert() and Document.remove() calls.  Most keyboard
+	 * shortcuts already take folding into account, as do viewToModel() and
+	 * modelToView(), so this filter usually does not do anything.<p>
+	 *
+	 * Common cases: backspacing to visible line of collapsed region.
+	 */
+	private class FoldAwareNavigationFilter extends NavigationFilter {
+
+	    public void setDot(FilterBypass fb, int dot, Position.Bias bias) {
+
+	    	RTextArea textArea = getTextArea();
+	        if (textArea instanceof RSyntaxTextArea) {
+
+	        	RSyntaxTextArea rsta = (RSyntaxTextArea)getTextArea();
+	        	if (rsta.isCodeFoldingEnabled()) {
+
+	        		int lastDot = getDot();
+	        		FoldManager fm = rsta.getFoldManager();
+	        		int line = 0;
+	        		try {
+	        			line = textArea.getLineOfOffset(dot);
+	        		} catch (Exception e) {
+	        			e.printStackTrace();
+	        		}
+
+	        		if (fm.isLineHidden(line)) {
+
+	        			//System.out.println("filterBypass: avoiding hidden line");
+	        			try {
+		        			if (dot>lastDot) { // Moving to further line
+		        				int lineCount = textArea.getLineCount();
+		        				while (++line<lineCount &&
+		        						fm.isLineHidden(line));
+		            			if (line<lineCount) {
+		            				dot = textArea.getLineStartOffset(line);
+		            			}
+		            			else { // No lower lines visible 
+		            				UIManager.getLookAndFeel().
+		            						provideErrorFeedback(textArea);
+		            				return;
+		            			}
+		        			}
+		        			else if (dot<lastDot) { // Moving to earlier line
+		        				while (--line>=0 && fm.isLineHidden(line));
+		        				if (line>=0) {
+		        					dot = textArea.getLineEndOffset(line) - 1;
+		        				}
+		        			}
+						} catch (Exception e) {
+							e.printStackTrace();
+							return;
+						}
+
+	        		}
+
+	        	}
+
+	        }
+
+	        super.setDot(fb, dot, bias);
+
+	    }
+
+	    public void moveDot(FilterBypass fb, int dot, Position.Bias bias) {
+	        super.moveDot(fb, dot, bias);
+	    }
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/FoldIndicator.java b/src/org/fife/ui/rtextarea/FoldIndicator.java
new file mode 100644
index 0000000..d859e47
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/FoldIndicator.java
@@ -0,0 +1,685 @@
+/*
+ * 10/08/2011
+ *
+ * FoldIndicator.java - Gutter component allowing the user to expand and
+ * collapse folds.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import javax.swing.Icon;
+import javax.swing.JToolTip;
+import javax.swing.ToolTipManager;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.MouseInputAdapter;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.View;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+import org.fife.ui.rsyntaxtextarea.focusabletip.TipUtil;
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * Component in the gutter that displays +/- icons to expand and collapse
+ * fold regions in the editor.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FoldIndicator extends AbstractGutterComponent {
+
+	/**
+	 * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+	 * each paint.
+	 */
+	private Insets textAreaInsets;
+
+	/**
+	 * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+	 * each paint.
+	 */
+	private Rectangle visibleRect;
+
+	/**
+	 * The fold to show the outline line for.
+	 */
+	private Fold foldWithOutlineShowing;
+
+	/**
+	 * The color to use for fold icon backgrounds, if the default icons
+	 * are used.
+	 */
+	private Color foldIconBackground;
+
+	/**
+	 * The icon used for collapsed folds.
+	 */
+	private Icon collapsedFoldIcon;
+
+	/**
+	 * The icon used for expanded folds.
+	 */
+	private Icon expandedFoldIcon;
+
+	/**
+	 * Whether tool tips are displayed showing the contents of collapsed
+	 * fold regions.
+	 */
+	private boolean showFoldRegionTips;
+
+	/**
+	 * The color used to paint fold outlines.
+	 */
+	static final Color DEFAULT_FOREGROUND = Color.gray;
+
+	/**
+	 * The default color used to paint the "inside" of fold icons.
+	 */
+	static final Color DEFAULT_FOLD_BACKGROUND = Color.white;
+
+	/**
+	 * Listens for events in this component.
+	 */
+	private Listener listener;
+
+	/**
+	 * Width of this component.
+	 */
+	private static final int WIDTH = 12;
+
+
+	public FoldIndicator(RTextArea textArea) {
+		super(textArea);
+		setForeground(DEFAULT_FOREGROUND);
+		setFoldIconBackground(DEFAULT_FOLD_BACKGROUND);
+		collapsedFoldIcon = new FoldIcon(true);
+		expandedFoldIcon = new FoldIcon(false);
+		listener = new Listener(this);
+		visibleRect = new Rectangle();
+		setShowCollapsedRegionToolTips(true);
+	}
+
+
+	/**
+	 * Overridden to use the editor's background if it's detected that the
+	 * user isn't using white as the editor bg, but the system's tool tip
+	 * background is yellow-ish.
+	 *
+	 * @return The tool tip.
+	 */
+	public JToolTip createToolTip() {
+		JToolTip tip = super.createToolTip();
+		Color textAreaBG = textArea.getBackground();
+		if (textAreaBG!=null && !Color.white.equals(textAreaBG)) {
+			Color bg = TipUtil.getToolTipBackground();
+			// If current L&F's tool tip color is close enough to "yellow",
+			// and we're not using the default text background of white, use
+			// the editor background as the tool tip background.
+			if (bg.getRed()>=240 && bg.getGreen()>=240 && bg.getBlue()>=200) {
+				tip.setBackground(textAreaBG);
+			}
+		}
+		return tip;
+	}
+
+
+	private Fold findOpenFoldClosestTo(Point p) {
+
+		Fold fold = null;
+
+		RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+		if (rsta.isCodeFoldingEnabled()) { // Should always be true
+			int offs = rsta.viewToModel(p); // TODO: Optimize me
+			if (offs>-1) {
+				try {
+					int line = rsta.getLineOfOffset(offs);
+					FoldManager fm = rsta.getFoldManager();
+					fold = fm.getFoldForLine(line);
+					if (fold==null) {
+						fold = fm.getDeepestOpenFoldContaining(offs);
+					}
+				} catch (BadLocationException ble) {
+					ble.printStackTrace(); // Never happens
+				}
+			}
+		}
+	
+		return fold;
+
+	}
+
+
+	/**
+	 * Returns the color to use for the "background" of fold icons.  This
+	 * is be ignored if custom icons are used.
+	 *
+	 * @return The background color.
+	 * @see #setFoldIconBackground(Color)
+	 */
+	public Color getFoldIconBackground() {
+		return foldIconBackground;
+	}
+
+
+	public Dimension getPreferredSize() {
+		int h = textArea!=null ? textArea.getHeight() : 100; // Arbitrary
+		return new Dimension(WIDTH, h);
+	}
+
+
+	/**
+	 * Returns whether tool tips are displayed showing the contents of
+	 * collapsed fold regions when the mouse hovers over a +/- icon.
+	 *
+	 * @return Whether these tool tips are displayed.
+	 * @see #setShowCollapsedRegionToolTips(boolean)
+	 */
+	public boolean getShowCollapsedRegionToolTips() {
+		return showFoldRegionTips;
+	}
+
+
+	/**
+	 * Positions tool tips to be aligned in the text component, so that the
+	 * displayed content is shown (almost) exactly where it would be in the
+	 * editor.
+	 *
+	 * @param e The mouse location.
+	 */
+	public Point getToolTipLocation(MouseEvent e) {
+
+		// ToolTipManager requires both location and text to be null to hide
+		// a currently-visible tool tip window.  If text is null but location
+		// has some value, it will show a tool tip with empty content, the size
+		// of its border (!).
+		String text = getToolTipText(e);
+		if (text==null) {
+			return null;
+		}
+
+		// Try to overlap the tip's text directly over the code
+		Point p = e.getPoint();
+		p.y = (p.y/textArea.getLineHeight()) * textArea.getLineHeight();
+		p.x = getWidth() + textArea.getMargin().left;
+		Gutter gutter = getGutter();
+		int gutterMargin = gutter.getInsets().right;
+		p.x += gutterMargin;
+		JToolTip tempTip = createToolTip();
+		p.x -= tempTip.getInsets().left;
+		p.y += 16;
+		return p;
+	}
+
+
+	/**
+	 * Overridden to show the content of a collapsed fold on mouse-overs.
+	 *
+	 * @param e The mouse location.
+	 */
+	public String getToolTipText(MouseEvent e) {
+
+		String text = null;
+
+		RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+		if (rsta.isCodeFoldingEnabled()) {
+			FoldManager fm = rsta.getFoldManager();
+			int pos = rsta.viewToModel(new Point(0, e.getY()));
+			if (pos>=0) { // Not -1
+				int line = 0;
+				try {
+					line = rsta.getLineOfOffset(pos);
+				} catch (BadLocationException ble) {
+					ble.printStackTrace(); // Never happens
+					return null;
+				}
+				Fold fold = fm.getFoldForLine(line);
+				if (fold!=null && fold.isCollapsed()) {
+
+					int endLine = fold.getEndLine();
+					if (fold.getLineCount()>25) { // Not too big
+						endLine = fold.getStartLine() + 25;
+					}
+
+					StringBuffer sb = new StringBuffer("<html><nobr>");
+					while (line<=endLine && line<rsta.getLineCount()) { // Sanity
+						Token t = rsta.getTokenListForLine(line);
+						while (t!=null && t.isPaintable()) {
+							t.appendHTMLRepresentation(sb, rsta, true, true);
+							t = t.getNextToken();
+						}
+						sb.append("<br>");
+						line++;
+					}
+
+					text = sb.toString();
+
+				}
+			}
+		}
+
+		return text;
+
+	}
+
+
+	void handleDocumentEvent(DocumentEvent e) {
+		int newLineCount = textArea.getLineCount();
+		if (newLineCount!=currentLineCount) {
+			currentLineCount = newLineCount;
+			repaint();
+		}
+	}
+
+
+	void lineHeightsChanged() {
+		// TODO Auto-generated method stub
+	}
+
+
+	protected void paintComponent(Graphics g) {
+
+		if (textArea==null) {
+			return;
+		}
+
+		visibleRect = g.getClipBounds(visibleRect);
+		if (visibleRect==null) { // ???
+			visibleRect = getVisibleRect();
+		}
+		//System.out.println("IconRowHeader repainting: " + visibleRect);
+		if (visibleRect==null) {
+			return;
+		}
+
+		Color bg = getBackground();
+		if (getGutter()!=null) { // Should always be true
+			bg = getGutter().getBackground();
+		}
+		g.setColor(bg);
+		g.fillRect(0,visibleRect.y, getWidth(),visibleRect.height);
+
+		RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+		if (!rsta.isCodeFoldingEnabled()) { 
+			return; // We should be hidden in this case, but still...
+		}
+
+		if (textArea.getLineWrap()) {
+			paintComponentWrapped(g);
+			return;
+		}
+
+		// Get where to start painting (top of the row).
+		// We need to be "scrolled up" up just enough for the missing part of
+		// the first line.
+		int cellHeight = textArea.getLineHeight();
+		int topLine = visibleRect.y/cellHeight;
+		int y = topLine*cellHeight +
+			(cellHeight-collapsedFoldIcon.getIconHeight())/2;
+		textAreaInsets = textArea.getInsets(textAreaInsets);
+		if (textAreaInsets!=null) {
+			y += textAreaInsets.top;
+		}
+
+		// Get the first and last lines to paint.
+		FoldManager fm = rsta.getFoldManager();
+		topLine += fm.getHiddenLineCountAbove(topLine, true);
+
+		int width = getWidth();
+		int x = width - 10;
+		int line = topLine;
+		boolean paintingOutlineLine = foldWithOutlineShowing!=null &&
+				foldWithOutlineShowing.containsLine(line);
+
+		while (y<visibleRect.y+visibleRect.height) {
+			if (paintingOutlineLine) {
+				g.setColor(getForeground());
+				int w2 = width/2;
+				if (line==foldWithOutlineShowing.getEndLine()) {
+					int y2 = y+cellHeight/2;
+					g.drawLine(w2,y, w2,y2);
+					g.drawLine(w2,y2, width-2,y2);
+					paintingOutlineLine = false;
+				}
+				else {
+					g.drawLine(w2,y, w2,y+cellHeight);
+				}
+			}
+			Fold fold = fm.getFoldForLine(line);
+			if (fold!=null) {
+				if (fold==foldWithOutlineShowing && !fold.isCollapsed()) {
+					g.setColor(getForeground());
+					int w2 = width/2;
+					g.drawLine(w2,y+cellHeight/2, w2,y+cellHeight);
+					paintingOutlineLine = true;
+				}
+				if (fold.isCollapsed()) {
+					collapsedFoldIcon.paintIcon(this, g, x, y);
+					// Skip to next line to paint, taking extra care for lines with
+					// block ends and begins together, e.g. "} else {"
+					do {
+						int hiddenLineCount = fold.getLineCount();
+						if (hiddenLineCount==0) {
+							// Fold parser identified a zero-line fold region.
+							// This is really a bug, but we'll be graceful here
+							// and avoid an infinite loop.
+							break;
+						}
+						line += hiddenLineCount;
+						fold = fm.getFoldForLine(line);
+					} while (fold!=null && fold.isCollapsed());
+				}
+				else {
+					expandedFoldIcon.paintIcon(this, g, x, y);
+				}
+			}
+			line++;
+			y += cellHeight;
+		}
+
+	}
+
+
+	/**
+	 * Paints folding icons when line wrapping is enabled.
+	 *
+	 * @param g The graphics context.
+	 */
+	private void paintComponentWrapped(Graphics g) {
+
+		// The variables we use are as follows:
+		// - visibleRect is the "visible" area of the text area; e.g.
+		// [0,100, 300,100+(lineCount*cellHeight)-1].
+		// actualTop.y is the topmost-pixel in the first logical line we
+		// paint.  Note that we may well not paint this part of the logical
+		// line, as it may be broken into many physical lines, with the first
+		// few physical lines scrolled past.  Note also that this is NOT the
+		// visible rect of this line number list; this line number list has
+		// visible rect == [0,0, insets.left-1,visibleRect.height-1].
+		// - offset (<=0) is the y-coordinate at which we begin painting when
+		// we begin painting with the first logical line.  This can be
+		// negative, signifying that we've scrolled past the actual topmost
+		// part of this line.
+
+		// The algorithm is as follows:
+		// - Get the starting y-coordinate at which to paint.  This may be
+		//   above the first visible y-coordinate as we're in line-wrapping
+		//   mode, but we always paint entire logical lines.
+		// - Paint that line's indicator, if appropriate.  Increment y to be
+		//   just below the are we just painted (i.e., the beginning of the
+		//   next logical line's view area).
+		// - Get the ending visual position for that line.  We can now loop
+		//   back, paint this line, and continue until our y-coordinate is
+		//   past the last visible y-value.
+
+		// We avoid using modelToView/viewToModel where possible, as these
+		// methods trigger a parsing of the line into syntax tokens, which is
+		// costly.  It's cheaper to just grab the child views' bounds.
+
+		// Some variables we'll be using.
+		int width = getWidth();
+
+		RTextAreaUI ui = (RTextAreaUI)textArea.getUI();
+		View v = ui.getRootView(textArea).getView(0);
+		Document doc = textArea.getDocument();
+		Element root = doc.getDefaultRootElement();
+		int topPosition = textArea.viewToModel(
+								new Point(visibleRect.x,visibleRect.y));
+		int topLine = root.getElementIndex(topPosition);
+		int cellHeight = textArea.getLineHeight();
+		FoldManager fm = ((RSyntaxTextArea)textArea).getFoldManager();
+
+		// Compute the y at which to begin painting text, taking into account
+		// that 1 logical line => at least 1 physical line, so it may be that
+		// y<0.  The computed y-value is the y-value of the top of the first
+		// (possibly) partially-visible view.
+		Rectangle visibleEditorRect = ui.getVisibleEditorRect();
+		Rectangle r = LineNumberList.getChildViewBounds(v, topLine,
+												visibleEditorRect);
+		int y = r.y;
+		y += (cellHeight-collapsedFoldIcon.getIconHeight())/2;
+
+		int visibleBottom = visibleRect.y + visibleRect.height;
+		int x = width - 10;
+		int line = topLine;
+		boolean paintingOutlineLine = foldWithOutlineShowing!=null &&
+				foldWithOutlineShowing.containsLine(line);
+		int lineCount = root.getElementCount();
+
+		while (y<visibleBottom && line<lineCount) {
+
+			int curLineH = LineNumberList.getChildViewBounds(v, line,
+					visibleEditorRect).height;
+
+			if (paintingOutlineLine) {
+				g.setColor(getForeground());
+				int w2 = width/2;
+				if (line==foldWithOutlineShowing.getEndLine()) {
+					int y2 = y + curLineH - cellHeight/2;
+					g.drawLine(w2,y, w2,y2);
+					g.drawLine(w2,y2, width-2,y2);
+					paintingOutlineLine = false;
+				}
+				else {
+					g.drawLine(w2,y, w2,y+curLineH);
+				}
+			}
+			Fold fold = fm.getFoldForLine(line);
+			if (fold!=null) {
+				if (fold==foldWithOutlineShowing && !fold.isCollapsed()) {
+					g.setColor(getForeground());
+					int w2 = width/2;
+					g.drawLine(w2,y+cellHeight/2, w2,y+curLineH);
+					paintingOutlineLine = true;
+				}
+				if (fold.isCollapsed()) {
+					collapsedFoldIcon.paintIcon(this, g, x, y);
+					y += LineNumberList.getChildViewBounds(v, line,
+								visibleEditorRect).height;
+					line += fold.getLineCount() + 1;
+				}
+				else {
+					expandedFoldIcon.paintIcon(this, g, x, y);
+					y += curLineH;
+					line++;
+				}
+			}
+			else {
+				y += curLineH;
+				line++;
+			}
+		}
+
+	}
+
+
+	private int rowAtPoint(Point p) {
+
+		int line = 0;
+
+		try {
+			int offs = textArea.viewToModel(p);
+			if (offs>-1) {
+				line = textArea.getLineOfOffset(offs);
+			}
+		} catch (BadLocationException ble) {
+			ble.printStackTrace(); // Never happens
+		}
+
+		return line;
+
+	}
+
+
+	/**
+	 * Sets the color to use for the "background" of fold icons.  This will
+	 * be ignored if custom icons are used.
+	 *
+	 * @param bg The new background color.
+	 * @see #getFoldIconBackground()
+	 */
+	public void setFoldIconBackground(Color bg) {
+		foldIconBackground = bg;
+	}
+
+
+	/**
+	 * Sets the icons to use to represent collapsed and expanded folds.
+	 *
+	 * @param collapsedIcon The collapsed fold icon.  This cannot be
+	 *        <code>null</code>.
+	 * @param expandedIcon The expanded fold icon.  This cannot be
+	 *        <code>null</code>.
+	 */
+	public void setFoldIcons(Icon collapsedIcon, Icon expandedIcon) {
+		this.collapsedFoldIcon = collapsedIcon;
+		this.expandedFoldIcon = expandedIcon;
+		revalidate(); // Icons may be different sizes.
+		repaint();
+	}
+
+
+	/**
+	 * Toggles whether tool tips should be displayed showing the contents of
+	 * collapsed fold regions when the mouse hovers over a +/- icon.
+	 *
+	 * @param show Whether to show these tool tips.
+	 * @see #getShowCollapsedRegionToolTips()
+	 */
+	public void setShowCollapsedRegionToolTips(boolean show) {
+		if (show!=showFoldRegionTips) {
+			if (show) {
+				ToolTipManager.sharedInstance().registerComponent(this);
+			}
+			else {
+				ToolTipManager.sharedInstance().unregisterComponent(this);
+			}
+			showFoldRegionTips = show;
+		}
+	}
+
+
+	/**
+	 * Overridden so we can track when code folding is enabled/disabled.
+	 */
+	public void setTextArea(RTextArea textArea) {
+		if (this.textArea!=null) {
+			this.textArea.removePropertyChangeListener(
+					RSyntaxTextArea.CODE_FOLDING_PROPERTY, listener);
+		}
+		super.setTextArea(textArea);
+		if (this.textArea!=null) {
+			this.textArea.addPropertyChangeListener(
+					RSyntaxTextArea.CODE_FOLDING_PROPERTY, listener);
+		}
+	}
+
+
+	/**
+	 * The default +/- icon for expanding and collapsing folds.
+	 */
+	private class FoldIcon implements Icon {
+
+		private boolean collapsed;
+
+		public FoldIcon(boolean collapsed) {
+			this.collapsed = collapsed;
+		}
+
+		public int getIconHeight() {
+			return 8;
+		}
+
+		public int getIconWidth() {
+			return 8;
+		}
+
+		public void paintIcon(Component c, Graphics g, int x, int y) {
+			g.setColor(foldIconBackground);
+			g.fillRect(x,y, 8,8);
+			g.setColor(getForeground());
+			g.drawRect(x,y, 8,8);
+			g.drawLine(x+2,y+4, x+2+4,y+4);
+			if (collapsed) {
+				g.drawLine(x+4,y+2, x+4,y+6);
+			}
+		}
+		
+	}
+
+
+	/**
+	 * Listens for events in this component.
+	 */
+	private class Listener extends MouseInputAdapter
+			implements PropertyChangeListener {
+
+		public Listener(FoldIndicator fgc) {
+			fgc.addMouseListener(this);
+			fgc.addMouseMotionListener(this);
+		}
+
+		public void mouseClicked(MouseEvent e) {
+
+//			// TODO: Implement code folding with word wrap enabled
+//			if (textArea.getLineWrap()) {
+//				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+//				return;
+//			}
+
+			Point p = e.getPoint();
+			int line = rowAtPoint(p);
+
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			FoldManager fm = rsta.getFoldManager();
+
+			Fold fold = fm.getFoldForLine(line);
+			if (fold!=null) {
+				fold.toggleCollapsedState();
+				getGutter().repaint();
+				textArea.repaint();
+			}
+
+		}
+
+		public void mouseExited(MouseEvent e) {
+			if (foldWithOutlineShowing!=null) {
+				foldWithOutlineShowing = null;
+				repaint();
+			}
+		}
+
+		public void mouseMoved(MouseEvent e) {
+			Fold newSelectedFold = findOpenFoldClosestTo(e.getPoint());
+			if (newSelectedFold!=foldWithOutlineShowing &&
+					newSelectedFold!=null && !newSelectedFold.isOnSingleLine()) {
+				foldWithOutlineShowing = newSelectedFold;
+				repaint();
+			}
+		}
+
+		public void propertyChange(PropertyChangeEvent e) {
+			// Whether folding is enabled in the editor has changed.
+			repaint();
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/Gutter.java b/src/org/fife/ui/rtextarea/Gutter.java
new file mode 100644
index 0000000..d521e05
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/Gutter.java
@@ -0,0 +1,965 @@
+/*
+ * 02/17/2009
+ *
+ * Gutter.java - Manages line numbers, icons, etc. on the left-hand side of
+ * an RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.ComponentOrientation;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.ComponentAdapter;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import javax.swing.Icon;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.border.Border;
+import javax.swing.border.EmptyBorder;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.ActiveLineRangeEvent;
+import org.fife.ui.rsyntaxtextarea.ActiveLineRangeListener;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * The gutter is the component on the left-hand side of the text area that
+ * displays optional information such as line numbers, fold regions, and icons
+ * (for bookmarks, debugging breakpoints, error markers, etc.).<p>
+ *
+ * Icons can be added on a per-line basis to visually mark syntax errors, lines
+ * with breakpoints set on them, etc.  To add icons to the gutter, you must
+ * first call {@link RTextScrollPane#setIconRowHeaderEnabled(boolean)} on the
+ * parent scroll pane, to make the icon area visible.  Then, you can add icons
+ * that track either lines in the document, or offsets, via
+ * {@link #addLineTrackingIcon(int, Icon)} and
+ * {@link #addOffsetTrackingIcon(int, Icon)}, respectively.  To remove an
+ * icon you've added, use {@link #removeTrackingIcon(GutterIconInfo)}.<p>
+ *
+ * In addition to support for arbitrary per-line icons, this component also
+ * has built-in support for displaying icons representing "bookmarks;" that is,
+ * lines a user can cycle through via F2 and Shift+F2.  Bookmarked lines are
+ * toggled via Ctrl+F2.  In order to enable bookmarking, you must first assign
+ * an icon to represent a bookmarked line, then actually enable the feature:
+ * 
+ * <pre>
+ * Gutter gutter = scrollPane.getGutter();
+ * gutter.setBookmarkIcon(new ImageIcon("bookmark.png"));
+ * gutter.setBookmarkingEnabled(true);
+ * </pre>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see GutterIconInfo
+ */
+public class Gutter extends JPanel {
+
+	/**
+	 * The color used to highlight active line ranges if none is specified.
+	 */
+	public static final Color DEFAULT_ACTIVE_LINE_RANGE_COLOR =
+												new Color(51, 153, 255);
+
+	/**
+	 * The text area.
+	 */
+	private RTextArea textArea;
+
+	/**
+	 * Renders line numbers.
+	 */
+	private LineNumberList lineNumberList;
+
+	/**
+	 * The color used to render line numbers.
+	 */
+	private Color lineNumberColor;
+
+	/**
+	 * The starting index for line numbers in the gutter.
+	 */
+	private int lineNumberingStartIndex;
+
+	/**
+	 * The font used to render line numbers.
+	 */
+	private Font lineNumberFont;
+
+	/**
+	 * Renders bookmark icons, breakpoints, error icons, etc.
+	 */
+	private IconRowHeader iconArea;
+
+	/**
+	 * Shows lines that are code-foldable.
+	 */
+	private FoldIndicator foldIndicator;
+
+	/**
+	 * Listens for events in our text area.
+	 */
+	private TextAreaListener listener;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The parent text area.
+	 */
+	public Gutter(RTextArea textArea) {
+
+		listener = new TextAreaListener();
+		lineNumberColor = Color.gray;
+		lineNumberFont = RTextArea.getDefaultFont();
+		lineNumberingStartIndex = 1;
+
+		setTextArea(textArea);
+		setLayout(new BorderLayout());
+		if (this.textArea!=null) {
+			// Enable line numbers our first time through if they give us
+			// a text area.
+			setLineNumbersEnabled(true);
+			if (this.textArea instanceof RSyntaxTextArea) {
+				RSyntaxTextArea rsta = (RSyntaxTextArea)this.textArea;
+				setFoldIndicatorEnabled(rsta.isCodeFoldingEnabled());
+			}
+		}
+
+		setBorder(new GutterBorder(0, 0, 0, 1)); // Assume ltr
+
+		Color bg = null;
+		if (textArea!=null) {
+			bg = textArea.getBackground(); // May return null if image bg
+		}
+		setBackground(bg!=null ? bg : Color.WHITE);
+
+	}
+
+
+	/**
+	 * Adds an icon that tracks an offset in the document, and is displayed
+	 * adjacent to the line numbers.  This is useful for marking things such
+	 * as source code errors.
+	 *
+	 * @param line The line to track (zero-based).
+	 * @param icon The icon to display.  This should be small (say 16x16).
+	 * @return A tag for this icon.  This can later be used in a call to
+	 *         {@link #removeTrackingIcon(GutterIconInfo)} to remove this
+	 *         icon.
+	 * @throws BadLocationException If <code>offs</code> is an invalid offset
+	 *         into the text area.
+	 * @see #addLineTrackingIcon(int, Icon, String)
+	 * @see #addOffsetTrackingIcon(int, Icon)
+	 * @see #removeTrackingIcon(GutterIconInfo)
+	 */
+	public GutterIconInfo addLineTrackingIcon(int line, Icon icon)
+											throws BadLocationException {
+		return addLineTrackingIcon(line, icon, null);
+	}
+
+
+	/**
+	 * Adds an icon that tracks an offset in the document, and is displayed
+	 * adjacent to the line numbers.  This is useful for marking things such
+	 * as source code errors.
+	 *
+	 * @param line The line to track (zero-based).
+	 * @param icon The icon to display.  This should be small (say 16x16).
+	 * @param tip An optional tool tip for the icon.
+	 * @return A tag for this icon.  This can later be used in a call to
+	 *         {@link #removeTrackingIcon(GutterIconInfo)} to remove this
+	 *         icon.
+	 * @throws BadLocationException If <code>offs</code> is an invalid offset
+	 *         into the text area.
+	 * @see #addLineTrackingIcon(int, Icon)
+	 * @see #addOffsetTrackingIcon(int, Icon)
+	 * @see #removeTrackingIcon(GutterIconInfo)
+	 */
+	public GutterIconInfo addLineTrackingIcon(int line, Icon icon, String tip)
+											throws BadLocationException {
+		int offs = textArea.getLineStartOffset(line);
+		return addOffsetTrackingIcon(offs, icon, tip);
+	}
+
+
+	/**
+	 * Adds an icon that tracks an offset in the document, and is displayed
+	 * adjacent to the line numbers.  This is useful for marking things such
+	 * as source code errors.
+	 *
+	 * @param offs The offset to track.
+	 * @param icon The icon to display.  This should be small (say 16x16).
+	 * @return A tag for this icon.
+	 * @throws BadLocationException If <code>offs</code> is an invalid offset
+	 *         into the text area.
+	 * @see #addOffsetTrackingIcon(int, Icon, String)
+	 * @see #addLineTrackingIcon(int, Icon)
+	 * @see #removeTrackingIcon(GutterIconInfo)
+	 */
+	public GutterIconInfo addOffsetTrackingIcon(int offs, Icon icon)
+												throws BadLocationException {
+		return addOffsetTrackingIcon(offs, icon, null);
+	}
+
+
+	/**
+	 * Adds an icon that tracks an offset in the document, and is displayed
+	 * adjacent to the line numbers.  This is useful for marking things such
+	 * as source code errors.
+	 *
+	 * @param offs The offset to track.
+	 * @param icon The icon to display.  This should be small (say 16x16).
+	 * @param tip An optional tool tip for the icon.
+	 * @return A tag for this icon.
+	 * @throws BadLocationException If <code>offs</code> is an invalid offset
+	 *         into the text area.
+	 * @see #addOffsetTrackingIcon(int, Icon)
+	 * @see #addLineTrackingIcon(int, Icon)
+	 * @see #removeTrackingIcon(GutterIconInfo)
+	 */
+	public GutterIconInfo addOffsetTrackingIcon(int offs, Icon icon, String tip)
+												throws BadLocationException {
+		return iconArea.addOffsetTrackingIcon(offs, icon, tip);
+	}
+
+
+	/**
+	 * Clears the active line range.
+	 *
+	 * @see #setActiveLineRange(int, int)
+	 */
+	private void clearActiveLineRange() {
+		iconArea.clearActiveLineRange();
+	}
+
+
+	/**
+	 * Returns the color used to paint the active line range, if any.
+	 *
+	 * @return The color.
+	 * @see #setActiveLineRangeColor(Color)
+	 */
+	public Color getActiveLineRangeColor() {
+		return iconArea.getActiveLineRangeColor();
+	}
+
+
+	/**
+	 * Returns the icon to use for bookmarks.
+	 *
+	 * @return The icon to use for bookmarks.  If this is <code>null</code>,
+	 *         bookmarking is effectively disabled.
+	 * @see #setBookmarkIcon(Icon)
+	 * @see #isBookmarkingEnabled()
+	 */
+	public Icon getBookmarkIcon() {
+		return iconArea.getBookmarkIcon();
+	}
+
+
+	/**
+	 * Returns the bookmarks known to this gutter.
+	 *
+	 * @return The bookmarks.  If there are no bookmarks, an empty array is
+	 *         returned.
+	 */
+	public GutterIconInfo[] getBookmarks() {
+		return iconArea.getBookmarks();
+	}
+
+
+	/**
+	 * Returns the color of the "border" line.
+	 *
+	 * @return The color.
+	 * @see #setBorderColor(Color)
+	 */
+	public Color getBorderColor() {
+		return ((GutterBorder)getBorder()).getColor();
+	}
+
+
+	/**
+	 * Returns the background color used by the (default) fold icons.
+	 *
+	 * @return The background color.
+	 * @see #setFoldBackground(Color)
+	 */
+	public Color getFoldBackground() {
+		return foldIndicator.getFoldIconBackground();
+	}
+
+
+	/**
+	 * Returns the foreground color of the fold indicator.
+	 *
+	 * @return The foreground color of the fold indicator.
+	 * @see #setFoldIndicatorForeground(Color)
+	 */
+	public Color getFoldIndicatorForeground() {
+		return foldIndicator.getForeground();
+	}
+
+
+	/**
+	 * Returns the color to use to paint line numbers.
+	 *
+	 * @return The color used when painting line numbers.
+	 * @see #setLineNumberColor(Color)
+	 */
+	public Color getLineNumberColor() {
+		return lineNumberColor;
+	}
+
+
+	/**
+	 * Returns the font used for line numbers.
+	 *
+	 * @return The font used for line numbers.
+	 * @see #setLineNumberFont(Font)
+	 */
+	public Font getLineNumberFont() {
+		return lineNumberFont;
+	}
+
+
+	/**
+	 * Returns the starting line's line number.  The default value is
+	 * <code>1</code>.
+	 *
+	 * @return The index
+	 * @see #setLineNumberingStartIndex(int)
+	 */
+	public int getLineNumberingStartIndex() {
+		return lineNumberingStartIndex;
+	}
+
+
+	/**
+	 * Returns <code>true</code> if the line numbers are enabled and visible.
+	 *
+	 * @return Whether or not line numbers are visible.
+	 */
+	public boolean getLineNumbersEnabled() {
+		for (int i=0; i<getComponentCount(); i++) {
+			if (getComponent(i)==lineNumberList) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns whether tool tips are displayed showing the contents of
+	 * collapsed fold regions when the mouse hovers over a +/- icon.
+	 *
+	 * @return Whether these tool tips are displayed.
+	 * @see #setShowCollapsedRegionToolTips(boolean)
+	 */
+	public boolean getShowCollapsedRegionToolTips() {
+		return foldIndicator.getShowCollapsedRegionToolTips();
+	}
+
+
+	/**
+	 * Returns the tracking icons at the specified view position.
+	 *
+	 * @param p The view position.
+	 * @return The tracking icons at that position.  If there are no tracking
+	 *         icons there, this will be an empty array.
+	 * @throws BadLocationException If <code>p</code> is invalid.
+	 */
+	public GutterIconInfo[] getTrackingIcons(Point p)
+			throws BadLocationException {
+		int offs = textArea.viewToModel(new Point(0, p.y));
+		int line = textArea.getLineOfOffset(offs);
+		return iconArea.getTrackingIcons(line);
+	}
+
+
+	/**
+	 * Returns whether the fold indicator is enabled.
+	 *
+	 * @return Whether the fold indicator is enabled.
+	 * @see #setFoldIndicatorEnabled(boolean)
+	 */
+	public boolean isFoldIndicatorEnabled() {
+		for (int i=0; i<getComponentCount(); i++) {
+			if (getComponent(i)==foldIndicator) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns whether bookmarking is enabled.
+	 *
+	 * @return Whether bookmarking is enabled.
+	 * @see #setBookmarkingEnabled(boolean)
+	 */
+	public boolean isBookmarkingEnabled() {
+		return iconArea.isBookmarkingEnabled();
+	}
+
+
+	/**
+	 * Returns whether the icon row header is enabled.
+	 *
+	 * @return Whether the icon row header is enabled.
+	 */
+	public boolean isIconRowHeaderEnabled() {
+		for (int i=0; i<getComponentCount(); i++) {
+			if (getComponent(i)==iconArea) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Removes the specified tracking icon.
+	 *
+	 * @param tag A tag for an icon in the gutter, as returned from either
+	 *        {@link #addLineTrackingIcon(int, Icon)} or
+	 *        {@link #addOffsetTrackingIcon(int, Icon)}.
+	 * @see #removeAllTrackingIcons()
+	 * @see #addLineTrackingIcon(int, Icon)
+	 * @see #addOffsetTrackingIcon(int, Icon)
+	 */
+	public void removeTrackingIcon(GutterIconInfo tag) {
+		iconArea.removeTrackingIcon(tag);
+	}
+
+
+	/**
+	 * Removes all tracking icons.
+	 *
+	 * @see #removeTrackingIcon(GutterIconInfo)
+	 * @see #addOffsetTrackingIcon(int, Icon)
+	 */
+	public void removeAllTrackingIcons() {
+		iconArea.removeAllTrackingIcons();
+	}
+
+
+	/**
+	 * Sets the color to use to render active line ranges.
+	 *
+	 * @param color The color to use.  If this is null, then the default
+	 *        color is used.
+	 * @see #getActiveLineRangeColor()
+	 * @see #DEFAULT_ACTIVE_LINE_RANGE_COLOR
+	 */
+	public void setActiveLineRangeColor(Color color) {
+		iconArea.setActiveLineRangeColor(color);
+	}
+
+
+	/**
+	 * Highlights a range of lines in the icon area.  This, of course, will
+	 * only be visible if the icon area is visible.
+	 *
+	 * @param startLine The start of the line range.
+	 * @param endLine The end of the line range.
+	 * @see #clearActiveLineRange()
+	 */
+	private void setActiveLineRange(int startLine, int endLine) {
+		iconArea.setActiveLineRange(startLine, endLine);
+	}
+
+
+	/**
+	 * Sets the icon to use for bookmarks.
+	 *
+	 * @param icon The new bookmark icon.  If this is <code>null</code>,
+	 *        bookmarking is effectively disabled.
+	 * @see #getBookmarkIcon()
+	 * @see #isBookmarkingEnabled()
+	 */
+	public void setBookmarkIcon(Icon icon) {
+		iconArea.setBookmarkIcon(icon);
+	}
+
+
+	/**
+	 * Sets whether bookmarking is enabled.  Note that a bookmarking icon
+	 * must be set via {@link #setBookmarkIcon(Icon)} before bookmarks are
+	 * truly enabled.
+	 *
+	 * @param enabled Whether bookmarking is enabled.
+	 * @see #isBookmarkingEnabled()
+	 * @see #setBookmarkIcon(Icon)
+	 */
+	public void setBookmarkingEnabled(boolean enabled) {
+		iconArea.setBookmarkingEnabled(enabled);
+		if (enabled && !isIconRowHeaderEnabled()) {
+			setIconRowHeaderEnabled(true);
+		}
+	}
+
+
+	/**
+	 * Sets the color for the "border" line.
+	 *
+	 * @param color The new color.
+	 * @see #getBorderColor()
+	 */
+	public void setBorderColor(Color color) {
+		((GutterBorder)getBorder()).setColor(color);
+		repaint();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setComponentOrientation(ComponentOrientation o) {
+		// Reuse the border to preserve its color.
+		if (o.isLeftToRight()) {
+			((GutterBorder)getBorder()).setEdges(0, 0, 0, 1);
+		}
+		else {
+			((GutterBorder)getBorder()).setEdges(0, 1, 0, 0);
+		}
+		super.setComponentOrientation(o);
+	}
+
+
+	/**
+	 * Sets the icons to use to represent collapsed and expanded folds.
+	 *
+	 * @param collapsedIcon The collapsed fold icon.  This cannot be
+	 *        <code>null</code>.
+	 * @param expandedIcon The expanded fold icon.  This cannot be
+	 *        <code>null</code>.
+	 */
+	public void setFoldIcons(Icon collapsedIcon, Icon expandedIcon) {
+		if (foldIndicator!=null) {
+			foldIndicator.setFoldIcons(collapsedIcon, expandedIcon);
+		}
+	}
+
+
+	/**
+	 * Toggles whether the fold indicator is enabled.
+	 *
+	 * @param enabled Whether the fold indicator should be enabled.
+	 * @see #isFoldIndicatorEnabled()
+	 */
+	public void setFoldIndicatorEnabled(boolean enabled) {
+		if (foldIndicator!=null) {
+			if (enabled) {
+				add(foldIndicator, BorderLayout.LINE_END);
+			}
+			else {
+				remove(foldIndicator);
+			}
+			revalidate();
+		}
+	}
+
+
+	/**
+	 * Sets the background color used by the (default) fold icons.
+	 *
+	 * @param bg The new background color.
+	 * @see #getFoldBackground()
+	 */
+	public void setFoldBackground(Color bg) {
+		if (bg==null) {
+			bg = FoldIndicator.DEFAULT_FOLD_BACKGROUND;
+		}
+		foldIndicator.setFoldIconBackground(bg);
+	}
+
+
+	/**
+	 * Sets the foreground color used by the fold indicator.
+	 *
+	 * @param fg The new fold indicator foreground.
+	 * @see #getFoldIndicatorForeground()
+	 */
+	public void setFoldIndicatorForeground(Color fg) {
+		if (fg==null) {
+			fg = FoldIndicator.DEFAULT_FOREGROUND;
+		}
+		foldIndicator.setForeground(fg);
+	}
+
+
+	/**
+	 * Toggles whether the icon row header (used for breakpoints, bookmarks,
+	 * etc.) is enabled.
+	 *
+	 * @param enabled Whether the icon row header is enabled.
+	 * @see #isIconRowHeaderEnabled()
+	 */
+	void setIconRowHeaderEnabled(boolean enabled) {
+		if (iconArea!=null) {
+			if (enabled) {
+				add(iconArea, BorderLayout.LINE_START);
+			}
+			else {
+				remove(iconArea);
+			}
+			revalidate();
+		}
+	}
+
+
+	/**
+	 * Sets the color to use to paint line numbers.
+	 *
+	 * @param color The color to use when painting line numbers.
+	 * @see #getLineNumberColor()
+	 */
+	public void setLineNumberColor(Color color) {
+		if (color!=null && !color.equals(lineNumberColor)) {
+			lineNumberColor = color;
+			if (lineNumberList!=null) {
+				lineNumberList.setForeground(color);
+			}
+		}
+	}
+
+
+	/**
+	 * Sets the font used for line numbers.
+	 *
+	 * @param font The font to use.  This cannot be <code>null</code>.
+	 * @see #getLineNumberFont()
+	 */
+	public void setLineNumberFont(Font font) {
+		if (font==null) {
+			throw new IllegalArgumentException("font cannot be null");
+		}
+		if (!font.equals(lineNumberFont)) {
+			lineNumberFont = font;
+			if (lineNumberList!=null) {
+				lineNumberList.setFont(font);
+			}
+		}
+	}
+
+
+	/**
+	 * Sets the starting line's line number.  The default value is
+	 * <code>1</code>.  Applications can call this method to change this value
+	 * if they are displaying a subset of lines in a file, for example.
+	 *
+	 * @param index The new index.
+	 * @see #getLineNumberingStartIndex()
+	 */
+	public void setLineNumberingStartIndex(int index) {
+		if (index!=lineNumberingStartIndex) {
+			lineNumberingStartIndex = index;
+			lineNumberList.setLineNumberingStartIndex(index);
+		}
+	}
+
+
+	/**
+	 * Toggles whether or not line numbers are visible.
+	 *
+	 * @param enabled Whether or not line numbers should be visible.
+	 * @see #getLineNumbersEnabled()
+	 */
+	void setLineNumbersEnabled(boolean enabled) {
+		if (lineNumberList!=null) {
+			if (enabled) {
+				add(lineNumberList);
+			}
+			else {
+				remove(lineNumberList);
+			}
+			revalidate();
+		}
+	}
+
+
+	/**
+	 * Toggles whether tool tips should be displayed showing the contents of
+	 * collapsed fold regions when the mouse hovers over a +/- icon.
+	 *
+	 * @param show Whether to show these tool tips.
+	 * @see #getShowCollapsedRegionToolTips()
+	 */
+	public void setShowCollapsedRegionToolTips(boolean show) {
+		if (foldIndicator!=null) {
+			foldIndicator.setShowCollapsedRegionToolTips(show);
+		}
+	}
+
+
+	/**
+	 * Sets the text area being displayed.  This will clear any tracking
+	 * icons currently displayed.
+	 *
+	 * @param textArea The text area.
+	 */
+	void setTextArea(RTextArea textArea) {
+
+		if (this.textArea!=null) {
+			listener.uninstall();
+		}
+
+		if (textArea!=null) {
+
+			RTextAreaEditorKit kit = (RTextAreaEditorKit)textArea.getUI().
+					getEditorKit(textArea);
+
+			if (lineNumberList==null) {
+				lineNumberList = kit.createLineNumberList(textArea);
+				lineNumberList.setFont(getLineNumberFont());
+				lineNumberList.setForeground(getLineNumberColor());
+				lineNumberList.setLineNumberingStartIndex(
+						getLineNumberingStartIndex());
+			}
+			else {
+				lineNumberList.setTextArea(textArea);
+			}
+			if (iconArea==null) {
+				iconArea = kit.createIconRowHeader(textArea);
+			}
+			else {
+				iconArea.setTextArea(textArea);
+			}
+			if (foldIndicator==null) {
+				foldIndicator = new FoldIndicator(textArea);
+			}
+			else {
+				foldIndicator.setTextArea(textArea);
+			}
+
+			listener.install(textArea);
+
+		}
+
+		this.textArea = textArea;
+
+	}
+
+
+	/**
+	 * Programatically toggles whether there is a bookmark for the specified
+	 * line.  If bookmarking is not enabled, this method does nothing.
+	 *
+	 * @param line The line.
+	 * @return Whether a bookmark is now at the specified line.
+	 * @throws BadLocationException If <code>line</code> is an invalid line
+	 *         number in the text area.
+	 */
+	public boolean toggleBookmark(int line) throws BadLocationException {
+		return iconArea.toggleBookmark(line);
+	}
+
+
+//	public void setUI(ComponentUI ui) {
+//
+//		Border gutterBorder = getBorder();
+//
+//		super.setUI(ui);
+//
+//		// Some LaFs, such as WebLookAndFeel, override borders even when
+//		// they aren't UIResources.
+//		Border border = getBorder();
+//		if (border != gutterBorder) {
+//			setBorder(gutterBorder);
+//		}
+//
+//	}
+//
+//
+public void setBorder(Border border) {
+	if (border instanceof GutterBorder) {
+		super.setBorder(border);
+	}
+}
+	/**
+	 * The border used by the gutter.
+	 */
+	private static class GutterBorder extends EmptyBorder {
+
+		private Color color;
+		private Rectangle visibleRect;
+
+		public GutterBorder(int top, int left, int bottom, int right) {
+			super(top, left, bottom, right);
+			color = new Color(221, 221, 221);
+			visibleRect = new Rectangle();
+		}
+
+		public Color getColor() {
+			return color;
+		}
+
+		public void paintBorder(Component c, Graphics g, int x, int y,
+								int width, int height) {
+
+			visibleRect = g.getClipBounds(visibleRect);
+			if (visibleRect==null) { // ???
+				visibleRect = ((JComponent)c).getVisibleRect();
+			}
+
+			g.setColor(color);
+			if (left==1) {
+				g.drawLine(0,visibleRect.y,
+						0,visibleRect.y+visibleRect.height);
+			}
+			else {
+				g.drawLine(width-1,visibleRect.y,
+						width-1,visibleRect.y+visibleRect.height);
+			}
+
+		}
+
+		public void setColor(Color color) {
+			this.color = color;
+		}
+
+		public void setEdges(int top, int left, int bottom, int right) {
+			this.top = top;
+			this.left = left;
+			this.bottom = bottom;
+			this.right = right;
+		}
+
+	}
+
+
+	/**
+	 * Listens for the text area resizing.
+	 */
+	/*
+	 * This is necessary to keep child components the same height as the text
+	 * area.  The worse case is when the user toggles word-wrap and it changes
+	 * the height of the text area. In that case, if we listen for the
+	 * "lineWrap" property change, we get notified BEFORE the text area
+	 * decides on its new size, thus we cannot resize properly.  We listen
+	 * instead for ComponentEvents so we change size after the text area has
+	 * resized.
+	 */
+	private class TextAreaListener extends ComponentAdapter
+						implements DocumentListener, PropertyChangeListener,
+						ActiveLineRangeListener {
+
+		private boolean installed;
+
+		/**
+		 * Modifies the "active line range" that is painted in this component.
+		 *
+		 * @param e Information about the new "active line range."
+		 */
+		public void activeLineRangeChanged(ActiveLineRangeEvent e) {
+			if (e.getMin()==-1) {
+				clearActiveLineRange();
+			}
+			else {
+				setActiveLineRange(e.getMin(), e.getMax());
+			}
+		}
+
+		public void changedUpdate(DocumentEvent e) {}
+
+		public void componentResized(java.awt.event.ComponentEvent e) {
+			revalidate();
+		}
+
+		protected void handleDocumentEvent(DocumentEvent e) {
+			for (int i=0; i<getComponentCount(); i++) {
+				AbstractGutterComponent agc =
+							(AbstractGutterComponent)getComponent(i);
+				agc.handleDocumentEvent(e);
+			}
+		}
+
+		public void insertUpdate(DocumentEvent e) {
+			handleDocumentEvent(e);
+		}
+
+		public void install(RTextArea textArea) {
+			if (installed) {
+				uninstall();
+			}
+			textArea.addComponentListener(this);
+			textArea.getDocument().addDocumentListener(this);
+			textArea.addPropertyChangeListener(this);
+			if (textArea instanceof RSyntaxTextArea) {
+				RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+				rsta.addActiveLineRangeListener(this);
+				rsta.getFoldManager().addPropertyChangeListener(this);
+			}
+			installed = true;
+		}
+
+		public void propertyChange(PropertyChangeEvent e) {
+
+			String name = e.getPropertyName();
+
+			// If they change the text area's font, we need to update cell
+			// heights to match the font's height.
+			if ("font".equals(name) ||
+					RSyntaxTextArea.SYNTAX_SCHEME_PROPERTY.equals(name)) {
+				for (int i=0; i<getComponentCount(); i++) {
+					AbstractGutterComponent agc =
+								(AbstractGutterComponent)getComponent(i);
+					agc.lineHeightsChanged();
+				}
+			}
+
+			// If they toggle whether code folding is enabled...
+			else if (RSyntaxTextArea.CODE_FOLDING_PROPERTY.equals(name)) {
+				boolean foldingEnabled = ((Boolean)e.getNewValue()).
+															booleanValue();
+				if (lineNumberList!=null) { // Its size depends on folding
+					//lineNumberList.revalidate();
+					lineNumberList.updateCellWidths();
+				}
+				setFoldIndicatorEnabled(foldingEnabled);
+			}
+
+			// If code folds are updated...
+			else if (FoldManager.PROPERTY_FOLDS_UPDATED.equals(name)) {
+				repaint();
+			}
+
+		}
+
+		public void removeUpdate(DocumentEvent e) {
+			handleDocumentEvent(e);
+		}
+
+		public void uninstall() {
+			if (installed) {
+				textArea.removeComponentListener(this);
+				textArea.getDocument().removeDocumentListener(this);
+				if (textArea instanceof RSyntaxTextArea) {
+					RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+					rsta.removeActiveLineRangeListener(this);
+					rsta.getFoldManager().removePropertyChangeListener(this);
+				}
+				installed = false;
+			}
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/GutterIconInfo.java b/src/org/fife/ui/rtextarea/GutterIconInfo.java
new file mode 100644
index 0000000..e0c23fc
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/GutterIconInfo.java
@@ -0,0 +1,53 @@
+/*
+ * 02/19/2009
+ *
+ * GutterIconInfo.java - Information about an Icon in a Gutter.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import javax.swing.Icon;
+
+
+/**
+ * Information about an icon displayed in a {@link Gutter}.  Instances of this
+ * class are returned by {@link Gutter#addLineTrackingIcon(int, Icon)} and
+ * {@link Gutter#addOffsetTrackingIcon(int, Icon)}.  They can later be used
+ * in calls to {@link Gutter#removeTrackingIcon(GutterIconInfo)} to be
+ * individually removed.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see Gutter
+ */
+public interface GutterIconInfo {
+
+
+	/**
+	 * Returns the icon being rendered.
+	 *
+	 * @return The icon being rendered.
+	 */
+	public Icon getIcon();
+
+
+	/**
+	 * Returns the offset that is being tracked.  The line of this offset is
+	 * where the icon is rendered.  This offset may change as the user types
+	 * to track the new location of the marked offset.
+	 *
+	 * @return The offset being tracked.
+	 */
+	public int getMarkedOffset();
+
+
+	/**
+	 * Returns the tool tip to display when the mouse hovers over this icon.
+	 *
+	 * @return The tool tip to display.
+	 */
+	public String getToolTip();
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/IconGroup.java b/src/org/fife/ui/rtextarea/IconGroup.java
new file mode 100644
index 0000000..0e73f33
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/IconGroup.java
@@ -0,0 +1,245 @@
+/*
+ * 09/05/2004
+ *
+ * IconGroup.java - Class encapsulating images used for RTextArea actions.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.security.AccessControlException;
+import javax.imageio.ImageIO;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+
+/**
+ * This class encapsulates the location, properties, etc. of an icon set used
+ * for an instance of <code>RTextArea</code>.  If the location of the icon
+ * group is invalid in any way, any attempt to retrieve icons from an icon
+ * group will return <code>null</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ */
+public class IconGroup {
+
+	private String path;
+	private boolean separateLargeIcons;
+	private String largeIconSubDir;
+	private String extension;
+	private String name;
+	private String jarFile;
+
+	private static final String DEFAULT_EXTENSION	= "gif";
+
+
+	/**
+	 * Creates an icon set without "large versions" of the icons.
+	 *
+	 * @param name The name of the icon group.
+	 * @param path The directory containing the icon group.
+	 */
+	public IconGroup(String name, String path) {
+		this(name, path, null);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name The name of the icon group.
+	 * @param path The directory containing the icon group.
+	 * @param largeIconSubDir The subdirectory containing "large versions" of
+	 *        the icons.  If no subdirectory exists, pass in <code>null</code>.
+	 */
+	public IconGroup(String name, String path, String largeIconSubDir) {
+		this(name, path, largeIconSubDir, DEFAULT_EXTENSION);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name The name of the icon group.
+	 * @param path The directory containing the icon group.
+	 * @param largeIconSubDir The subdirectory containing "large versions" of
+	 *        the icons.  If no subdirectory exists, pass in <code>null</code>.
+	 * @param extension The extension of the icons (one of <code>gif</code>,
+	 *        <code>jpg</code>, or <code>png</code>).
+	 */
+	public IconGroup(String name, String path, String largeIconSubDir,
+											String extension) {
+		this(name, path, largeIconSubDir, extension, null);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name The name of the icon group.
+	 * @param path The directory containing the icon group.
+	 * @param largeIconSubDir The subdirectory containing "large versions" of
+	 *        the icons.  If no subdirectory exists, pass in <code>null</code>.
+	 * @param extension The extension of the icons (one of <code>gif</code>,
+	 *        <code>jpg</code>, or <code>png</code>).
+	 * @param jar The Jar file containing the icons, or <code>null</code> if
+	 *        the icons are on the local file system.  If a Jar is specified,
+	 *        the value of <code>path</code> must be a path in the Jar file.
+	 *        If this is not a valid Jar file, then no Jar file will be used,
+	 *        meaning all icons returned from this icon group will be
+	 *        <code>null</code>.
+	 */
+	public IconGroup(String name, String path, String largeIconSubDir,
+					String extension, String jar) {
+		this.name = name;
+		this.path = path;
+		if (path!=null && path.length()>0 && !path.endsWith("/")) {
+			this.path += "/";
+		}
+		this.separateLargeIcons = (largeIconSubDir!=null);
+		this.largeIconSubDir = largeIconSubDir;
+		this.extension = extension!=null ? extension : DEFAULT_EXTENSION;
+		this.jarFile = jar;
+	}
+
+
+	/**
+	 * Returns whether two icon groups are equal.
+	 *
+	 * @param o2 The object to check against.
+	 * @return Whether <code>o2</code> represents the same icons as this icon
+	 *         group.
+	 */
+	public boolean equals(Object o2) {
+		if (o2!=null && o2 instanceof IconGroup) {
+			IconGroup ig2 = (IconGroup)o2;
+			if (ig2.getName().equals(getName()) &&
+					separateLargeIcons==ig2.hasSeparateLargeIcons()) {
+				if (separateLargeIcons) {
+					if (!largeIconSubDir.equals(ig2.largeIconSubDir))
+						return false;
+				}
+				return path.equals(ig2.path);
+			}
+			// If we got here, separateLargeIcons values weren't equal.
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns the icon from this icon group with the specified name.
+	 *
+	 * @param name The name of the icon.  For example, if you want the icon
+	 * specified in <code>new.gif</code>, this value should be
+	 * <code>new</code>.
+	 * @return The icon, or <code>null</code> if it could not be found or
+	 *         loaded.
+	 * @see #getLargeIcon
+	 */
+	public Icon getIcon(String name) {
+		Icon icon = getIconImpl(path + name + "." + extension);
+		// JDK 6.0 b74 returns icons with width/height==-1 in certain error
+		// cases (new ImageIcon(url) where url is not resolved?).  We'll
+		// just return null in this case as Swing AbstractButtons throw
+		// exceptions when expected to paint an icon with width or height
+		// is less than 1.
+		if (icon!=null && (icon.getIconWidth()<1 || icon.getIconHeight()<1)) {
+			icon = null;
+		}
+		return icon;
+	}
+
+
+	/**
+	 * Does the dirty work of loading an image.
+	 *
+	 * @param iconFullPath The full path to the icon, either on the local
+	 *        file system or in the Jar file, if this icon group represents
+	 *        icons in a Jar file.
+	 * @return The icon.
+	 */
+	private Icon getIconImpl(String iconFullPath) {
+		try {
+			if (jarFile==null) {
+				// First see if it's on our classpath (e.g. an icon in
+				// RText.jar, so we'd need to use the class loader).
+				URL url = getClass().getClassLoader().
+										getResource(iconFullPath);
+				if (url!=null)
+					return new ImageIcon(url);
+				// If not, see if it's a plain file on disk.
+				BufferedImage image = ImageIO.read(new File(iconFullPath));
+				return image!=null ? new ImageIcon(image) : null;
+			}
+			else { // If it's in a Jar, create a URL and grab it.
+				URL url = new URL("jar:file:///" +
+									jarFile + "!/" + iconFullPath);
+				//System.err.println("***** " + url.toString());
+				return new ImageIcon(url);
+			}
+		} catch (AccessControlException ace) {
+			return null; // Likely in an applet or WebStart
+		} catch (IOException ioe) {
+			return null;
+		}
+	}
+
+
+	/**
+	 * Returns the large icon from this icon group with the specified name.
+	 * If this icon group does not have large icons, <code>null</code> is
+	 * returned.
+	 *
+	 * @param name The name of the icon.  For example, if you want the icon
+	 *        specified in <code>new.gif</code>, this value should be
+	 *        <code>new</code>.
+	 * @return The icon, or <code>null</code> if it could not be found or
+	 *         loaded.
+	 * @see #getLargeIcon
+	 */
+	public Icon getLargeIcon(String name) {
+		return getIconImpl(path + largeIconSubDir + "/" +
+						name + "." + extension);
+	}
+
+
+	/**
+	 * Returns the name of this icon group.
+	 *
+	 * @return This icon group's name.
+	 */
+	public String getName() {
+		return name;
+	}
+
+
+	/**
+	 * Returns whether a separate directory for the large icons exists.
+	 *
+	 * @return Whether a directory containing "large versions" ov the icons
+	 *         exists.
+	 * @see #getLargeIcon(String)
+	 */
+	public boolean hasSeparateLargeIcons() {
+		return separateLargeIcons;
+	}
+
+
+	/**
+	 * Overridden since we also override {@link #equals(Object)}, to honor
+	 * the invariant that equal objects must have equal hashcodes.  This also
+	 * keeps FindBugs happy.
+	 */
+	public int hashCode() {
+		return getName().hashCode();
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/IconRowHeader.java b/src/org/fife/ui/rtextarea/IconRowHeader.java
new file mode 100644
index 0000000..16a2642
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/IconRowHeader.java
@@ -0,0 +1,864 @@
+/*
+ * 02/17/2009
+ *
+ * IconRowHeader.java - Renders icons in the gutter.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import javax.swing.Icon;
+import javax.swing.JPanel;
+import javax.swing.ToolTipManager;
+import javax.swing.UIManager;
+import javax.swing.event.DocumentEvent;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+import org.fife.ui.rsyntaxtextarea.FoldingAwareIconRowHeader;
+
+
+/**
+ * Renders icons in the {@link Gutter}.  This can be used to visually mark
+ * lines containing syntax errors, lines with breakpoints set on them, etc.<p>
+ *
+ * This component has built-in support for displaying icons representing
+ * "bookmarks;" that is, lines a user can cycle through via F2 and Shift+F2.
+ * Bookmarked lines are toggled via Ctrl+F2, or by clicking in the icon area
+ * at the line to bookmark.  In order to enable bookmarking, you must first
+ * assign an icon to represent a bookmarked line, then actually enable the
+ * feature.  This is actually done on the parent {@link Gutter} component:<p>
+ * 
+ * <pre>
+ * Gutter gutter = scrollPane.getGutter();
+ * gutter.setBookmarkIcon(new ImageIcon("bookmark.png"));
+ * gutter.setBookmarkingEnabled(true);
+ * </pre>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see FoldingAwareIconRowHeader
+ */
+public class IconRowHeader extends AbstractGutterComponent implements MouseListener {
+
+	/**
+	 * The icons to render.
+	 */
+	protected List trackingIcons;
+
+	/**
+	 * The width of this component.
+	 */
+	protected int width;
+
+	/**
+	 * Whether this component listens for mouse clicks and toggles "bookmark"
+	 * icons on them.
+	 */
+	private boolean bookmarkingEnabled;
+
+	/**
+	 * The icon to use for bookmarks.
+	 */
+	private Icon bookmarkIcon;
+
+	/**
+	 * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+	 * each paint.
+	 */
+	protected Rectangle visibleRect;
+
+	/**
+	 * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+	 * each paint.
+	 */
+	protected Insets textAreaInsets;
+
+	/**
+	 * The first line in the active line range.
+	 */
+	protected int activeLineRangeStart;
+
+	/**
+	 * The end line in the active line range.
+	 */
+	protected int activeLineRangeEnd;
+
+	/**
+	 * The color used to highlight the active code block.
+	 */
+	private Color activeLineRangeColor;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The parent text area.
+	 */
+	public IconRowHeader(RTextArea textArea) {
+
+		super(textArea);
+		visibleRect = new Rectangle();
+		width = 16;
+		addMouseListener(this);
+		activeLineRangeStart = activeLineRangeEnd = -1;
+		setActiveLineRangeColor(null);
+
+		// Must explicitly set our background color, otherwise we inherit that
+		// of the parent Gutter.
+		updateBackground();
+
+		ToolTipManager.sharedInstance().registerComponent(this);
+
+	}
+
+
+	/**
+	 * Adds an icon that tracks an offset in the document, and is displayed
+	 * adjacent to the line numbers.  This is useful for marking things such
+	 * as source code errors.
+	 *
+	 * @param offs The offset to track.
+	 * @param icon The icon to display.  This should be small (say 16x16).
+	 * @return A tag for this icon.
+	 * @throws BadLocationException If <code>offs</code> is an invalid offset
+	 *         into the text area.
+	 * @see #removeTrackingIcon(Object)
+	 */
+	public GutterIconInfo addOffsetTrackingIcon(int offs, Icon icon)
+												throws BadLocationException {
+		return addOffsetTrackingIcon(offs, icon, null);
+	}
+
+
+	/**
+	 * Adds an icon that tracks an offset in the document, and is displayed
+	 * adjacent to the line numbers.  This is useful for marking things such
+	 * as source code errors.
+	 *
+	 * @param offs The offset to track.
+	 * @param icon The icon to display.  This should be small (say 16x16).
+	 * @param tip A tool tip for the icon.
+	 * @return A tag for this icon.
+	 * @throws BadLocationException If <code>offs</code> is an invalid offset
+	 *         into the text area.
+	 * @see #removeTrackingIcon(Object)
+	 */
+	public GutterIconInfo addOffsetTrackingIcon(int offs, Icon icon, String tip)
+												throws BadLocationException {
+		Position pos = textArea.getDocument().createPosition(offs);
+		GutterIconImpl ti = new GutterIconImpl(icon, pos, tip);
+		if (trackingIcons==null) {
+			trackingIcons = new ArrayList(1); // Usually small
+		}
+		int index = Collections.binarySearch(trackingIcons, ti);
+		if (index<0) {
+			index = -(index+1);
+		}
+		trackingIcons.add(index, ti);
+		repaint();
+		return ti;
+	}
+
+
+	/**
+	 * Clears the active line range.
+	 *
+	 * @see #setActiveLineRange(int, int)
+	 */
+	public void clearActiveLineRange() {
+		if (activeLineRangeStart!=-1 || activeLineRangeEnd!=-1) {
+			activeLineRangeStart = activeLineRangeEnd = -1;
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Returns the color used to paint the active line range, if any.
+	 *
+	 * @return The color.
+	 * @see #setActiveLineRangeColor(Color)
+	 */
+	public Color getActiveLineRangeColor() {
+		return activeLineRangeColor;
+	}
+
+
+	/**
+	 * Returns the icon to use for bookmarks.
+	 *
+	 * @return The icon to use for bookmarks.  If this is <code>null</code>,
+	 *         bookmarking is effectively disabled.
+	 * @see #setBookmarkIcon(Icon)
+	 * @see #isBookmarkingEnabled()
+	 */
+	public Icon getBookmarkIcon() {
+		return bookmarkIcon;
+	}
+
+
+	/**
+	 * Returns the bookmarks known to this gutter.
+	 *
+	 * @return The bookmarks.  If there are no bookmarks, an empty array is
+	 *         returned.
+	 */
+	public GutterIconInfo[] getBookmarks() {
+
+		List retVal = new ArrayList(1);
+
+		if (trackingIcons!=null) {
+			for (int i=0; i<trackingIcons.size(); i++) {
+				GutterIconImpl ti = getTrackingIcon(i);
+				if (ti.getIcon()==bookmarkIcon) {
+					retVal.add(ti);
+				}
+			}
+		}
+
+		GutterIconInfo[] array = new GutterIconInfo[retVal.size()];
+		return (GutterIconInfo[])retVal.toArray(array);
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	void handleDocumentEvent(DocumentEvent e) {
+		int newLineCount = textArea.getLineCount();
+		if (newLineCount!=currentLineCount) {
+			currentLineCount = newLineCount;
+			repaint();
+		}
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Dimension getPreferredSize() {
+		int h = textArea!=null ? textArea.getHeight() : 100; // Arbitrary
+		return new Dimension(width, h);
+	}
+
+
+	/**
+	 * Overridden to display the tool tip of any icons on this line.
+	 *
+	 * @param e The location the mouse is hovering over.
+	 */
+	public String getToolTipText(MouseEvent e) {
+		try {
+			int line = viewToModelLine(e.getPoint());
+			if (line>-1) {
+				GutterIconInfo[] infos = getTrackingIcons(line);
+				if (infos.length>0) {
+					// TODO: Display all messages?
+					return infos[infos.length-1].getToolTip();
+				}
+			}
+		} catch (BadLocationException ble) {
+			ble.printStackTrace(); // Never happens
+		}
+		return null;
+	}
+
+
+	protected GutterIconImpl getTrackingIcon(int index) {
+		return (GutterIconImpl)trackingIcons.get(index);
+	}
+
+
+	/**
+	 * Returns the tracking icons at the specified line.
+	 *
+	 * @param line The line.
+	 * @return The tracking icons at that line.  If there are no tracking
+	 *         icons there, this will be an empty array.
+	 * @throws BadLocationException If <code>line</code> is invalid.
+	 */
+	public GutterIconInfo[] getTrackingIcons(int line)
+								throws BadLocationException {
+
+		List retVal = new ArrayList(1);
+
+		if (trackingIcons!=null) {
+			int start = textArea.getLineStartOffset(line);
+			int end = textArea.getLineEndOffset(line);
+			if (line==textArea.getLineCount()-1) {
+				end++; // Hack
+			}
+			for (int i=0; i<trackingIcons.size(); i++) {
+				GutterIconImpl ti = getTrackingIcon(i);
+				int offs = ti.getMarkedOffset();
+				if (offs>=start && offs<end) {
+					retVal.add(ti);
+				}
+				else if (offs>=end) {
+					break; // Quit early
+				}
+			}
+		}
+
+		GutterIconInfo[] array = new GutterIconInfo[retVal.size()];
+		return (GutterIconInfo[])retVal.toArray(array);
+
+	}
+
+
+	/**
+	 * Returns whether bookmarking is enabled.
+	 *
+	 * @return Whether bookmarking is enabled.
+	 * @see #setBookmarkingEnabled(boolean)
+	 */
+	public boolean isBookmarkingEnabled() {
+		return bookmarkingEnabled;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	void lineHeightsChanged() {
+		repaint();
+	}
+
+
+	public void mouseClicked(MouseEvent e) {
+	}
+
+
+	public void mouseEntered(MouseEvent e) {
+	}
+
+
+	public void mouseExited(MouseEvent e) {
+	}
+
+
+	public void mousePressed(MouseEvent e) {
+		if (bookmarkingEnabled && bookmarkIcon!=null) {
+			try {
+				int line = viewToModelLine(e.getPoint());
+				if (line>-1) {
+					toggleBookmark(line);
+				}
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Never happens
+			}
+		}
+	}
+
+
+	public void mouseReleased(MouseEvent e) {
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected void paintComponent(Graphics g) {
+
+		if (textArea==null) {
+			return;
+		}
+
+		visibleRect = g.getClipBounds(visibleRect);
+		if (visibleRect==null) { // ???
+			visibleRect = getVisibleRect();
+		}
+		//System.out.println("IconRowHeader repainting: " + visibleRect);
+		if (visibleRect==null) {
+			return;
+		}
+
+		g.setColor(getBackground());
+		g.fillRect(0,visibleRect.y, width,visibleRect.height);
+
+		if (textArea.getLineWrap()) {
+			paintComponentWrapped(g);
+			return;
+		}
+
+		Document doc = textArea.getDocument();
+		Element root = doc.getDefaultRootElement();
+		textAreaInsets = textArea.getInsets(textAreaInsets);
+
+		// Get the first and last lines to paint.
+		int cellHeight = textArea.getLineHeight();
+		int topLine = (visibleRect.y-textAreaInsets.top)/cellHeight;
+		int bottomLine = Math.min(topLine+visibleRect.height/cellHeight+1,
+							root.getElementCount());
+
+		// Get where to start painting (top of the row).
+		// We need to be "scrolled up" up just enough for the missing part of
+		// the first line.
+		int y = topLine*cellHeight + textAreaInsets.top;
+
+		if ((activeLineRangeStart>=topLine&&activeLineRangeStart<=bottomLine) ||
+			(activeLineRangeEnd>=topLine && activeLineRangeEnd<=bottomLine) ||
+			(activeLineRangeStart<=topLine && activeLineRangeEnd>=bottomLine)) {
+
+			g.setColor(activeLineRangeColor);
+			int firstLine = Math.max(activeLineRangeStart, topLine);
+			int y1 = firstLine * cellHeight + textAreaInsets.top;
+			int lastLine = Math.min(activeLineRangeEnd, bottomLine);
+			int y2 = (lastLine+1) * cellHeight + textAreaInsets.top - 1;
+
+			int j = y1;
+			while (j<=y2) {
+				int yEnd = Math.min(y2, j+getWidth());
+				int xEnd = yEnd-j;
+				g.drawLine(0,j, xEnd,yEnd);
+				j += 2;
+			}
+
+			int i = 2;
+			while (i<getWidth()) {
+				int yEnd = y1 + getWidth() - i;
+				g.drawLine(i,y1, getWidth(),yEnd);
+				i += 2;
+			}
+
+			if (firstLine==activeLineRangeStart) {
+				g.drawLine(0,y1, getWidth(),y1);
+			}
+			if (lastLine==activeLineRangeEnd) {
+				g.drawLine(0,y2, getWidth(),y2);
+			}
+
+		}
+
+		if (trackingIcons!=null) {
+			int lastLine = bottomLine;
+			for (int i=trackingIcons.size()-1; i>=0; i--) { // Last to first
+				GutterIconInfo ti = getTrackingIcon(i);
+				int offs = ti.getMarkedOffset();
+				if (offs>=0 && offs<=doc.getLength()) {
+					int line = root.getElementIndex(offs);
+					if (line<=lastLine && line>=topLine) {
+						Icon icon = ti.getIcon();
+						if (icon!=null) {
+							int y2 = y + (line-topLine)*cellHeight;
+							y2 += (cellHeight-icon.getIconHeight())/2;
+							ti.getIcon().paintIcon(this, g, 0, y2);
+							lastLine = line-1; // Paint only 1 icon per line
+						}
+					}
+					else if (line<topLine) {
+						break;
+					}
+				}
+			}
+		}
+
+	}
+
+
+	/**
+	 * Paints icons when line wrapping is enabled.
+	 *
+	 * @param g The graphics context.
+	 */
+	private void paintComponentWrapped(Graphics g) {
+
+		// The variables we use are as follows:
+		// - visibleRect is the "visible" area of the text area; e.g.
+		// [0,100, 300,100+(lineCount*cellHeight)-1].
+		// actualTop.y is the topmost-pixel in the first logical line we
+		// paint.  Note that we may well not paint this part of the logical
+		// line, as it may be broken into many physical lines, with the first
+		// few physical lines scrolled past.  Note also that this is NOT the
+		// visible rect of this line number list; this line number list has
+		// visible rect == [0,0, insets.left-1,visibleRect.height-1].
+		// - offset (<=0) is the y-coordinate at which we begin painting when
+		// we begin painting with the first logical line.  This can be
+		// negative, signifying that we've scrolled past the actual topmost
+		// part of this line.
+
+		// The algorithm is as follows:
+		// - Get the starting y-coordinate at which to paint.  This may be
+		//   above the first visible y-coordinate as we're in line-wrapping
+		//   mode, but we always paint entire logical lines.
+		// - Paint that line's line number and highlight, if appropriate.
+		//   Increment y to be just below the are we just painted (i.e., the
+		//   beginning of the next logical line's view area).
+		// - Get the ending visual position for that line.  We can now loop
+		//   back, paint this line, and continue until our y-coordinate is
+		//   past the last visible y-value.
+
+		// We avoid using modelToView/viewToModel where possible, as these
+		// methods trigger a parsing of the line into syntax tokens, which is
+		// costly.  It's cheaper to just grab the child views' bounds.
+
+		RTextAreaUI ui = (RTextAreaUI)textArea.getUI();
+		View v = ui.getRootView(textArea).getView(0);
+//		boolean currentLineHighlighted = textArea.getHighlightCurrentLine();
+		Document doc = textArea.getDocument();
+		Element root = doc.getDefaultRootElement();
+		int lineCount = root.getElementCount();
+		int topPosition = textArea.viewToModel(
+								new Point(visibleRect.x,visibleRect.y));
+		int topLine = root.getElementIndex(topPosition);
+
+		// Compute the y at which to begin painting text, taking into account
+		// that 1 logical line => at least 1 physical line, so it may be that
+		// y<0.  The computed y-value is the y-value of the top of the first
+		// (possibly) partially-visible view.
+		Rectangle visibleEditorRect = ui.getVisibleEditorRect();
+		Rectangle r = IconRowHeader.getChildViewBounds(v, topLine,
+												visibleEditorRect);
+		int y = r.y;
+
+		int visibleBottom = visibleRect.y + visibleRect.height;
+
+		// Get the first possibly visible icon index.
+		int currentIcon = -1;
+		if (trackingIcons!=null) {
+			for (int i=0; i<trackingIcons.size(); i++) {
+				GutterIconImpl icon = getTrackingIcon(i);
+				int offs = icon.getMarkedOffset();
+				if (offs>=0 && offs<=doc.getLength()) {
+					int line = root.getElementIndex(offs);
+					if (line>=topLine) {
+						currentIcon = i;
+						break;
+					}
+				}
+			}
+		}
+
+		// Keep painting lines until our y-coordinate is past the visible
+		// end of the text area.
+		g.setColor(getForeground());
+		int cellHeight = textArea.getLineHeight();
+		while (y < visibleBottom) {
+
+			r = getChildViewBounds(v, topLine, visibleEditorRect);
+//			int lineEndY = r.y+r.height;
+
+			/*
+			// Highlight the current line's line number, if desired.
+			if (currentLineHighlighted && topLine==currentLine) {
+				g.setColor(textArea.getCurrentLineHighlightColor());
+				g.fillRect(0,y, width,lineEndY-y);
+				g.setColor(getForeground());
+			}
+			*/
+
+			// Possibly paint an icon.
+			if (currentIcon>-1) {
+				// We want to paint the last icon added for this line.
+				GutterIconImpl toPaint = null;
+				while (currentIcon<trackingIcons.size()) {
+					GutterIconImpl ti = getTrackingIcon(currentIcon);
+					int offs = ti.getMarkedOffset();
+					if (offs>=0 && offs<=doc.getLength()) {
+						int line = root.getElementIndex(offs);
+						if (line==topLine) {
+							toPaint = ti;
+						}
+						else if (line>topLine) {
+							break;
+						}
+					}
+					currentIcon++;
+				}
+				if (toPaint!=null) {
+					Icon icon = toPaint.getIcon();
+					if (icon!=null) {
+						int y2 = y + (cellHeight-icon.getIconHeight())/2;
+						icon.paintIcon(this, g, 0, y2);
+					}
+				}
+			}
+
+			// The next possible y-coordinate is just after the last line
+			// painted.
+			y += r.height;
+
+			// Update topLine (we're actually using it for our "current line"
+			// variable now).
+			topLine++;
+			if (topLine>=lineCount)
+				break;
+
+		}
+
+	}
+
+
+	/**
+	 * Removes the specified tracking icon.
+	 *
+	 * @param tag A tag for a tracking icon.
+	 * @see #removeAllTrackingIcons()
+	 * @see #addOffsetTrackingIcon(int, Icon)
+	 */
+	public void removeTrackingIcon(Object tag) {
+		if (trackingIcons!=null && trackingIcons.remove(tag)) {
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Removes all tracking icons.
+	 *
+	 * @see #removeTrackingIcon(Object)
+	 * @see #addOffsetTrackingIcon(int, Icon)
+	 */
+	public void removeAllTrackingIcons() {
+		if (trackingIcons!=null && trackingIcons.size()>0) {
+			trackingIcons.clear();
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Removes all bookmark tracking icons.
+	 */
+	private void removeBookmarkTrackingIcons() {
+		if (trackingIcons!=null) {
+			for (Iterator i=trackingIcons.iterator(); i.hasNext(); ) {
+				GutterIconImpl ti = (GutterIconImpl)i.next();
+				if (ti.getIcon()==bookmarkIcon) {
+					i.remove();
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * Highlights a range of lines in the icon area.
+	 *
+	 * @param startLine The start of the line range.
+	 * @param endLine The end of the line range.
+	 * @see #clearActiveLineRange()
+	 */
+	public void setActiveLineRange(int startLine, int endLine) {
+		if (startLine!=activeLineRangeStart ||
+				endLine!=activeLineRangeEnd) {
+			activeLineRangeStart = startLine;
+			activeLineRangeEnd = endLine;
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Sets the color to use to render active line ranges.
+	 *
+	 * @param color The color to use.  If this is null, then the default
+	 *        color is used.
+	 * @see #getActiveLineRangeColor()
+	 * @see Gutter#DEFAULT_ACTIVE_LINE_RANGE_COLOR
+	 */
+	public void setActiveLineRangeColor(Color color) {
+		if (color==null) {
+			color = Gutter.DEFAULT_ACTIVE_LINE_RANGE_COLOR;
+		}
+		if (!color.equals(activeLineRangeColor)) {
+			activeLineRangeColor = color;
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Sets the icon to use for bookmarks.  Any previous bookmark icons
+	 * are removed.
+	 *
+	 * @param icon The new bookmark icon.  If this is <code>null</code>,
+	 *        bookmarking is effectively disabled.
+	 * @see #getBookmarkIcon()
+	 * @see #isBookmarkingEnabled()
+	 */
+	public void setBookmarkIcon(Icon icon) {
+		removeBookmarkTrackingIcons();
+		bookmarkIcon = icon;
+		repaint();
+	}
+
+
+	/**
+	 * Sets whether bookmarking is enabled.  Note that a bookmarking icon
+	 * must be set via {@link #setBookmarkIcon(Icon)} before bookmarks are
+	 * truly enabled.
+	 *
+	 * @param enabled Whether bookmarking is enabled.  If this is
+	 *        <code>false</code>, any bookmark icons are removed.
+	 * @see #isBookmarkingEnabled()
+	 * @see #setBookmarkIcon(Icon)
+	 */
+	public void setBookmarkingEnabled(boolean enabled) {
+		if (enabled!=bookmarkingEnabled) {
+			bookmarkingEnabled = enabled;
+			if (!enabled) {
+				removeBookmarkTrackingIcons();
+			}
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Sets the text area being displayed.  This will clear any tracking
+	 * icons currently displayed.
+	 *
+	 * @param textArea The text area.
+	 */
+	public void setTextArea(RTextArea textArea) {
+		removeAllTrackingIcons();
+		super.setTextArea(textArea);
+	}
+
+
+	/**
+	 * Programatically toggles whether there is a bookmark for the specified
+	 * line.  If bookmarking is not enabled, this method does nothing.
+	 *
+	 * @param line The line.
+	 * @return Whether a bookmark is now at the specified line.
+	 * @throws BadLocationException If <code>line</code> is an invalid line
+	 *         number in the text area.
+	 */
+	public boolean toggleBookmark(int line) throws BadLocationException {
+
+		if (!isBookmarkingEnabled() || getBookmarkIcon()==null) {
+			return false;
+		}
+
+		GutterIconInfo[] icons = getTrackingIcons(line);
+		if (icons.length==0) {
+			int offs = textArea.getLineStartOffset(line);
+			addOffsetTrackingIcon(offs, bookmarkIcon);
+			return true;
+		}
+
+		boolean found = false;
+		for (int i=0; i<icons.length; i++) {
+			if (icons[i].getIcon()==bookmarkIcon) {
+				removeTrackingIcon(icons[i]);
+				found = true;
+				// Don't quit, in case they manipulate the document so > 1
+				// bookmark is on a single line (kind of flaky, but it
+				// works...).  If they delete all chars in the document,
+				// AbstractDocument gets a little flaky with the returned line
+				// number for viewToModel(), so this is just us trying to save
+				// face a little.
+			}
+		}
+		if (!found) {
+			int offs = textArea.getLineStartOffset(line);
+			addOffsetTrackingIcon(offs, bookmarkIcon);
+		}
+
+		return !found;
+
+	}
+
+
+	/**
+	 * Sets our background color to that of standard "panels" in this
+	 * LookAndFeel.  This is necessary because, otherwise, we'd inherit the
+	 * background color of our parent component (the Gutter).
+	 */
+	private void updateBackground() {
+		Color bg = UIManager.getColor("Panel.background");
+		if (bg==null) { // UIManager properties aren't guaranteed to exist
+			bg = new JPanel().getBackground();
+		}
+		setBackground(bg);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void updateUI() {
+		super.updateUI(); // Does nothing
+		updateBackground();
+	}
+
+
+	/**
+	 * Returns the line rendered at the specified location.
+	 *
+	 * @param p The location in this row header.
+	 * @return The corresponding line in the editor.
+	 * @throws BadLocationException ble If an error occurs.
+	 */
+	private int viewToModelLine(Point p) throws BadLocationException {
+		int offs = textArea.viewToModel(p);
+		return offs>-1 ? textArea.getLineOfOffset(offs) : -1;
+	}
+
+
+	/**
+	 * Implementation of the icons rendered.
+	 */
+	private static class GutterIconImpl implements GutterIconInfo, Comparable {
+
+		private Icon icon;
+		private Position pos;
+		private String toolTip;
+
+		public GutterIconImpl(Icon icon, Position pos, String toolTip) {
+			this.icon = icon;
+			this.pos = pos;
+			this.toolTip = toolTip;
+		}
+
+		public int compareTo(Object o) {
+			if (o instanceof GutterIconInfo) {
+				return pos.getOffset() - ((GutterIconInfo)o).getMarkedOffset();
+			}
+			return -1;
+		}
+
+		public boolean equals(Object o) {
+			return o==this;
+		}
+
+		public Icon getIcon() {
+			return icon;
+		}
+
+		public int getMarkedOffset() {
+			return pos.getOffset();
+		}
+
+		public String getToolTip() {
+			return toolTip;
+		}
+
+		public int hashCode() {
+			return icon.hashCode(); // FindBugs
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/ImageBackgroundPainterStrategy.java b/src/org/fife/ui/rtextarea/ImageBackgroundPainterStrategy.java
new file mode 100644
index 0000000..44eacc7
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/ImageBackgroundPainterStrategy.java
@@ -0,0 +1,171 @@
+/*
+ * 01/22/2005
+ *
+ * ImageBackgroundPainterStrategy.java - Renders an RTextAreaBase's
+ * background as an image.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.MediaTracker;
+import java.awt.Rectangle;
+import java.awt.image.BufferedImage;
+import java.net.URL;
+import javax.imageio.ImageIO;
+
+
+/**
+ * A strategy for painting the background of an <code>RTextAreaBase</code>
+ * as an image.  The image is always stretched to completely fill the
+ * <code>RTextAreaBase</code>.<p>
+ *
+ * You can set the scaling hint used when stretching/skewing the image
+ * to fit in the <code>RTextAreaBase</code>'s background via the
+ * <code>setScalingHint</code> method, but keep in mind the more
+ * accurate the scaling hint, the less responsive your application will
+ * be when stretching the window (as that's the only time the image's
+ * size is recalculated).
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see org.fife.ui.rtextarea.BufferedImageBackgroundPainterStrategy
+ * @see org.fife.ui.rtextarea.VolatileImageBackgroundPainterStrategy
+ */
+public abstract class ImageBackgroundPainterStrategy
+					implements BackgroundPainterStrategy {
+
+	protected MediaTracker tracker;
+
+	private RTextAreaBase textArea;
+	private Image master;
+	private int oldWidth, oldHeight;
+	private int scalingHint;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The text area using this image as its background.
+	 */
+	public ImageBackgroundPainterStrategy(RTextAreaBase textArea) {
+		this.textArea = textArea;
+		tracker = new MediaTracker(textArea);
+		scalingHint = Image.SCALE_FAST;
+	}
+
+
+	/**
+	 * Returns the text area using this strategy.
+	 *
+	 * @return The text area.
+	 */
+	public RTextAreaBase getRTextAreaBase() {
+		return textArea;
+	}
+
+
+	/**
+	 * Returns the "master" image; that is, the original, unscaled image.
+	 * When the image needs to be rescaled, scaling should be done from
+	 * this image, to prevent repeated scaling from distorting the image.
+	 *
+	 * @return The master image.
+	 */
+	public Image getMasterImage() {
+		return master;
+	}
+
+
+	/**
+	 * Returns the scaling hint being used.
+	 *
+	 * @return The scaling hint to use when scaling an image.
+	 * @see #setScalingHint
+	 */
+	public int getScalingHint() {
+		return scalingHint;
+	}
+
+
+	/**
+	 * Paints the image at the specified location and at the specified size.
+	 *
+	 * @param g The graphics context.
+	 * @param bounds The bounds in which to paint the image.  The image
+	 *        will be scaled to fit exactly in these bounds if necessary.
+	 */
+	public final void paint(Graphics g, Rectangle bounds) {
+		if (bounds.width!=oldWidth || bounds.height!=oldHeight) {
+			rescaleImage(bounds.width, bounds.height, getScalingHint());
+			oldWidth = bounds.width;
+			oldHeight = bounds.height;
+		}
+		paintImage(g, bounds.x,bounds.y);
+	}
+
+
+	/**
+	 * Paints the image at the specified location.  This method assumes
+	 * scaling has already been done, and simply paints the background
+	 * image "as-is."
+	 *
+	 * @param g The graphics context.
+	 * @param x The x-coordinate at which to paint.
+	 * @param y The y-coordinate at which to paint.
+	 */
+	protected abstract void paintImage(Graphics g, int x, int y);
+
+
+	/**
+	 * Rescales the displayed image to be the specified size.
+	 *
+	 * @param width The new width of the image.
+	 * @param height The new height of the image.
+	 * @param hint The scaling hint to use.
+	 */
+	protected abstract void rescaleImage(int width, int height,
+								int hint);
+
+
+	/**
+	 * Sets the image this background painter displays.
+	 *
+	 * @param imageURL URL of a file containing the image to display.
+	 */
+	public void setImage(URL imageURL) {
+		BufferedImage image = null;
+		try {
+			image = ImageIO.read(imageURL);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		setImage(image);
+	}
+
+	/**
+	 * Sets the image this background painter displays.
+	 *
+	 * @param image The new image to use for the background.
+	 */
+	public void setImage(Image image) {
+		master = image;
+		oldWidth = -1; // To trick us into fixing bgImage.
+	}
+
+
+	/**
+	 * Sets the scaling hint to use when scaling the image.
+	 *
+	 * @param hint The hint to apply; e.g. <code>Image.SCALE_DEFAULT</code>.
+	 * @see #getScalingHint
+	 */
+	public void setScalingHint(int hint) {
+		this.scalingHint = hint;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/LineHighlightManager.java b/src/org/fife/ui/rtextarea/LineHighlightManager.java
new file mode 100644
index 0000000..79e65ba
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/LineHighlightManager.java
@@ -0,0 +1,207 @@
+/*
+ * 02/10/2009
+ *
+ * LineHighlightManager - Manages line highlights.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Position;
+
+
+/**
+ * Manages line highlights in an <code>RTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class LineHighlightManager {
+
+	private RTextArea textArea;
+	private List lineHighlights;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The parent text area.
+	 */
+	public LineHighlightManager(RTextArea textArea) {
+		this.textArea = textArea;
+	}
+
+
+	/**
+	 * Highlights the specified line.
+	 *
+	 * @param line The line to highlight.
+	 * @param color The color to highlight with.
+	 * @return A tag for the highlight.
+	 * @throws BadLocationException If <code>line</code> is not a valid line
+	 *         number.
+	 * @see #removeLineHighlight(Object)
+	 */
+	public Object addLineHighlight(int line, Color color)
+									throws BadLocationException {
+		int offs = textArea.getLineStartOffset(line);
+		LineHighlightInfo lhi = new LineHighlightInfo(
+						textArea.getDocument().createPosition(offs), color);
+		if (lineHighlights==null) {
+			lineHighlights = new ArrayList(1);
+		}
+		int index = Collections.binarySearch(lineHighlights, lhi);
+		if (index<0) { // Common case
+			index = -(index+1);
+		}
+		lineHighlights.add(index, lhi);
+		repaintLine(lhi);
+		return lhi;
+	}
+
+
+	/**
+	 * Paints any highlighted lines in the specified line range.
+	 *
+	 * @param g The graphics context.
+	 */
+	public void paintLineHighlights(Graphics g) {
+
+		int count = lineHighlights==null ? 0 : lineHighlights.size();
+		if (count>0) {
+
+			int docLen = textArea.getDocument().getLength();
+			Rectangle vr = textArea.getVisibleRect();
+			int lineHeight = textArea.getLineHeight();
+
+			try {
+
+				for (int i=0; i<count; i++) {
+					LineHighlightInfo lhi =(LineHighlightInfo)
+													lineHighlights.get(i);
+					int offs = lhi.getOffset();
+					if (offs>=0 && offs<=docLen) {
+						int y = textArea.yForLineContaining(offs);
+						if (y>vr.y-lineHeight) {
+							if (y<vr.y+vr.height) {
+								g.setColor(lhi.getColor());
+								g.fillRect(0,y, textArea.getWidth(),lineHeight);
+							}
+							else {
+								break; // Out of visible rect
+							}
+						}
+					}
+				}
+
+			} catch (BadLocationException ble) { // Never happens
+				ble.printStackTrace();
+			}
+		}
+
+	}
+
+
+	/**
+	 * Removes all line highlights.
+	 *
+	 * @see #removeLineHighlight(Object)
+	 */
+	public void removeAllLineHighlights() {
+		if (lineHighlights!=null) {
+			lineHighlights.clear();
+			textArea.repaint();
+		}
+	}
+
+
+	/**
+	 * Removes a line highlight.
+	 *
+	 * @param tag The tag of the line highlight to remove.
+	 * @see #addLineHighlight(int, Color)
+	 */
+	public void removeLineHighlight(Object tag) {
+		if (tag instanceof LineHighlightInfo) {
+			lineHighlights.remove(tag);
+			repaintLine((LineHighlightInfo)tag);
+		}
+	}
+
+
+	/**
+	 * Repaints the line pointed to by the specified highlight information.
+	 *
+	 * @param lhi The highlight information.
+	 */
+	private void repaintLine(LineHighlightInfo lhi) {
+		int offs = lhi.getOffset();
+		// May be > length if they deleted text including the highlight
+		if (offs>=0 && offs<=textArea.getDocument().getLength()) {
+			try {
+				int y = textArea.yForLineContaining(offs);
+				if (y>-1) {
+					textArea.repaint(0, y,
+								textArea.getWidth(), textArea.getLineHeight());
+				}
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Never happens
+			}
+		}
+	}
+
+
+	/**
+	 * Information about a line highlight.
+	 */
+	private static class LineHighlightInfo implements Comparable {
+
+		private Position offs;
+		private Color color;
+
+		public LineHighlightInfo(Position offs, Color c) {
+			this.offs = offs;
+			this.color = c;
+		}
+
+		public int compareTo(Object o) {
+			if (o instanceof LineHighlightInfo) {
+				return offs.getOffset() - ((LineHighlightInfo)o).getOffset();
+			}
+			return -1;
+		}
+
+		public boolean equals(Object o) {
+			if (o==this) {
+				return true;
+			}
+			if (o instanceof LineHighlightInfo) {
+				return offs.getOffset()==((LineHighlightInfo)o).getOffset();
+			}
+			return false;
+		}
+
+		public Color getColor() {
+			return color;
+		}
+
+		public int getOffset() {
+			return offs.getOffset();
+		}
+
+		public int hashCode() {
+			return getOffset();
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/LineNumberList.java b/src/org/fife/ui/rtextarea/LineNumberList.java
new file mode 100644
index 0000000..b59f953
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/LineNumberList.java
@@ -0,0 +1,710 @@
+/*
+ * 02/11/2009
+ *
+ * LineNumberList.java - Renders line numbers in an RTextScrollPane.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.Map;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.MouseInputListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.View;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * Renders line numbers in the gutter.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class LineNumberList extends AbstractGutterComponent
+								implements MouseInputListener {
+
+	private int currentLine;	// The last line the caret was on.
+	private int lastY = -1;		// Used to check if caret changes lines when line wrap is enabled.
+	private int lastVisibleLine;// Last line index painted.
+
+	private int cellHeight;		// Height of a line number "cell" when word wrap is off.
+	private int cellWidth;		// The width used for all line number cells.
+	private int ascent;			// The ascent to use when painting line numbers.
+
+	private Map aaHints;
+
+	private int mouseDragStartOffset;
+
+	/**
+	 * Listens for events from the current text area.
+	 */
+	private Listener l;
+
+	/**
+	 * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+	 * each paint.
+	 */
+	private Insets textAreaInsets;
+
+	/**
+	 * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+	 * each paint.
+	 */
+	private Rectangle visibleRect;
+
+	/**
+	 * The index at which line numbering should start.  The default value is
+	 * <code>1</code>, but applications can change this if, for example, they
+	 * are displaying a subset of lines in a file.
+	 */
+	private int lineNumberingStartIndex;
+
+
+	/**
+	 * Constructs a new <code>LineNumberList</code> using default values for
+	 * line number color (gray) and highlighting the current line.
+	 *
+	 * @param textArea The text component for which line numbers will be
+	 *        displayed.
+	 */
+	public LineNumberList(RTextArea textArea) {
+		this(textArea, null);
+	}
+
+
+	/**
+	 * Constructs a new <code>LineNumberList</code>.
+	 *
+	 * @param textArea The text component for which line numbers will be
+	 *        displayed.
+	 * @param numberColor The color to use for the line numbers.  If this is
+	 *        <code>null</code>, gray will be used.
+	 */
+	public LineNumberList(RTextArea textArea, Color numberColor) {
+
+		super(textArea);
+
+		if (numberColor!=null) {
+			setForeground(numberColor);
+		}
+		else {
+			setForeground(Color.GRAY);
+		}
+
+		// Initialize currentLine; otherwise, the current line won't start
+		// off as highlighted.
+		currentLine = 0;
+		setLineNumberingStartIndex(1);
+
+		visibleRect = new Rectangle(); // Must be initialized
+
+		addMouseListener(this);
+		addMouseMotionListener(this);
+
+		aaHints = RSyntaxUtilities.getDesktopAntiAliasHints();
+
+	}
+
+
+	/**
+	 * Overridden to set width of this component correctly when we are first
+	 * displayed (as keying off of the RTextArea gives us (0,0) when it isn't
+	 * yet displayed.
+	 */
+	public void addNotify() {
+		super.addNotify();
+		if (textArea!=null) {
+			l.install(textArea); // Won't double-install
+		}
+		updateCellWidths();
+		updateCellHeights();
+	}
+
+
+	/**
+	 * Calculates the last line number index painted in this component.
+	 *
+	 * @return The last line number index painted in this component.
+	 */
+	private int calculateLastVisibleLineNumber() {
+		int lastLine = 0;
+		if (textArea!=null) {
+			lastLine = textArea.getLineCount()+getLineNumberingStartIndex()-1;
+		}
+		return lastLine;
+	}
+
+
+	/**
+	 * Returns the starting line's line number.  The default value is
+	 * <code>1</code>.
+	 *
+	 * @return The index
+	 * @see #setLineNumberingStartIndex(int)
+	 */
+	public int getLineNumberingStartIndex() {
+		return lineNumberingStartIndex;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Dimension getPreferredSize() {
+		int h = textArea!=null ? textArea.getHeight() : 100; // Arbitrary
+		return new Dimension(cellWidth, h);
+	}
+
+
+	/**
+	 * Returns the width of the empty border on this component's right-hand
+	 * side (or left-hand side, if the orientation is RTL).
+	 *
+	 * @return The border width.
+	 */
+	private int getRhsBorderWidth() {
+		int w = 4;
+		if (textArea instanceof RSyntaxTextArea) {
+			if (((RSyntaxTextArea)textArea).isCodeFoldingEnabled()) {
+				w = 0;
+			}
+		}
+		return w;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	void handleDocumentEvent(DocumentEvent e) {
+		int newLastLine = calculateLastVisibleLineNumber();
+		if (newLastLine!=lastVisibleLine) {
+			// Adjust the amount of space the line numbers take up,
+			// if necessary.
+			if (newLastLine/10 != lastVisibleLine/10) {
+				updateCellWidths();
+			}
+			lastVisibleLine = newLastLine;
+			repaint();
+		}
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	void lineHeightsChanged() {
+		updateCellHeights();
+	}
+
+
+	public void mouseClicked(MouseEvent e) {
+	}
+
+
+	public void mouseDragged(MouseEvent e) {
+		if (mouseDragStartOffset>-1) {
+			int pos = textArea.viewToModel(new Point(0, e.getY()));
+			if (pos>=0) { // Not -1
+				textArea.setCaretPosition(mouseDragStartOffset);
+				textArea.moveCaretPosition(pos);
+			}
+		}
+	}
+
+
+	public void mouseEntered(MouseEvent e) {
+	}
+
+
+	public void mouseExited(MouseEvent e) {
+	}
+
+
+	public void mouseMoved(MouseEvent e) {
+	}
+
+
+	public void mousePressed(MouseEvent e) {
+		if (textArea==null) {
+			return;
+		}
+		if (e.getButton()==MouseEvent.BUTTON1) {
+			int pos = textArea.viewToModel(new Point(0, e.getY()));
+			if (pos>=0) { // Not -1
+				textArea.setCaretPosition(pos);
+			}
+			mouseDragStartOffset = pos;
+		}
+		else {
+			mouseDragStartOffset = -1;
+		}
+	}
+
+
+	public void mouseReleased(MouseEvent e) {
+	}
+
+
+	/**
+	 * Paints this component.
+	 *
+	 * @param g The graphics context.
+	 */
+	protected void paintComponent(Graphics g) {
+
+		if (textArea==null) {
+			return;
+		}
+
+		visibleRect = g.getClipBounds(visibleRect);
+		if (visibleRect==null) { // ???
+			visibleRect = getVisibleRect();
+		}
+		//System.out.println("LineNumberList repainting: " + visibleRect);
+		if (visibleRect==null) {
+			return;
+		}
+
+		Color bg = getBackground();
+		if (getGutter()!=null) { // Should always be true
+			bg = getGutter().getBackground();
+		}
+		g.setColor(bg);
+		g.fillRect(0,visibleRect.y, cellWidth,visibleRect.height);
+		g.setFont(getFont());
+		if (aaHints!=null) {
+			((Graphics2D)g).addRenderingHints(aaHints);
+		}
+
+		if (textArea.getLineWrap()) {
+			paintWrappedLineNumbers(g, visibleRect);
+			return;
+		}
+
+		// Get where to start painting (top of the row), and where to paint
+		// the line number (drawString expects y==baseline).
+		// We need to be "scrolled up" just enough for the missing part of
+		// the first line.
+		int topLine = visibleRect.y/cellHeight;
+		int actualTopY = topLine*cellHeight;
+		textAreaInsets = textArea.getInsets(textAreaInsets);
+		actualTopY += textAreaInsets.top;
+		int y = actualTopY + ascent;
+
+		// Get the actual first line to paint, taking into account folding.
+		FoldManager fm = null;
+		if (textArea instanceof RSyntaxTextArea) {
+			fm = ((RSyntaxTextArea)textArea).getFoldManager();
+			topLine += fm.getHiddenLineCountAbove(topLine, true);
+		}
+		final int RHS_BORDER_WIDTH = getRhsBorderWidth();
+
+/*
+		// Highlight the current line's line number, if desired.
+		if (textArea.getHighlightCurrentLine() && currentLine>=topLine &&
+				currentLine<=bottomLine) {
+			g.setColor(textArea.getCurrentLineHighlightColor());
+			g.fillRect(0,actualTopY+(currentLine-topLine)*cellHeight,
+						cellWidth,cellHeight);
+		}
+*/
+
+		// Paint line numbers
+		g.setColor(getForeground());
+		boolean ltr = getComponentOrientation().isLeftToRight();
+		if (ltr) {
+			FontMetrics metrics = g.getFontMetrics();
+			int rhs = getWidth() - RHS_BORDER_WIDTH;
+			int line = topLine + 1;
+			while (y<visibleRect.y+visibleRect.height+ascent && line<=textArea.getLineCount()) {
+				String number = Integer.toString(line + getLineNumberingStartIndex() - 1);
+				int width = metrics.stringWidth(number);
+				g.drawString(number, rhs-width,y);
+				y += cellHeight;
+				Fold fold = fm.getFoldForLine(line-1);
+				// Skip to next line to paint, taking extra care for lines with
+				// block ends and begins together, e.g. "} else {"
+				while (fold!=null && fold.isCollapsed()) {
+					int hiddenLineCount = fold.getLineCount();
+					if (hiddenLineCount==0) {
+						// Fold parser identified a 0-line fold region... This
+						// is really a bug, but we'll handle it gracefully.
+						break;
+					}
+					line += hiddenLineCount;
+					fold = fm.getFoldForLine(line-1);
+				}
+				line++;
+			}
+		}
+		else { // rtl
+			int line = topLine + 1;
+			while (y<visibleRect.y+visibleRect.height && line<textArea.getLineCount()) {
+				String number = Integer.toString(line + getLineNumberingStartIndex() - 1);
+				g.drawString(number, RHS_BORDER_WIDTH, y);
+				y += cellHeight;
+				Fold fold = fm.getFoldForLine(line-1);
+				// Skip to next line to paint, taking extra care for lines with
+				// block ends and begins together, e.g. "} else {"
+				while (fold!=null && fold.isCollapsed()) {
+					line += fold.getLineCount();
+					fold = fm.getFoldForLine(line);
+				}
+				line++;
+			}
+		}
+
+	}
+
+
+	/**
+	 * Paints line numbers for text areas with line wrap enabled.
+	 *
+	 * @param g The graphics context.
+	 * @param visibleRect The visible rectangle of these line numbers.
+	 */
+	private void paintWrappedLineNumbers(Graphics g, Rectangle visibleRect) {
+
+		// The variables we use are as follows:
+		// - visibleRect is the "visible" area of the text area; e.g.
+		// [0,100, 300,100+(lineCount*cellHeight)-1].
+		// actualTop.y is the topmost-pixel in the first logical line we
+		// paint.  Note that we may well not paint this part of the logical
+		// line, as it may be broken into many physical lines, with the first
+		// few physical lines scrolled past.  Note also that this is NOT the
+		// visible rect of this line number list; this line number list has
+		// visible rect == [0,0, insets.left-1,visibleRect.height-1].
+		// - offset (<=0) is the y-coordinate at which we begin painting when
+		// we begin painting with the first logical line.  This can be
+		// negative, signifying that we've scrolled past the actual topmost
+		// part of this line.
+
+		// The algorithm is as follows:
+		// - Get the starting y-coordinate at which to paint.  This may be
+		//   above the first visible y-coordinate as we're in line-wrapping
+		//   mode, but we always paint entire logical lines.
+		// - Paint that line's line number and highlight, if appropriate.
+		//   Increment y to be just below the are we just painted (i.e., the
+		//   beginning of the next logical line's view area).
+		// - Get the ending visual position for that line.  We can now loop
+		//   back, paint this line, and continue until our y-coordinate is
+		//   past the last visible y-value.
+
+		// We avoid using modelToView/viewToModel where possible, as these
+		// methods trigger a parsing of the line into syntax tokens, which is
+		// costly.  It's cheaper to just grab the child views' bounds.
+
+		// Some variables we'll be using.
+		int width = getWidth();
+
+		RTextAreaUI ui = (RTextAreaUI)textArea.getUI();
+		View v = ui.getRootView(textArea).getView(0);
+		//boolean currentLineHighlighted = textArea.getHighlightCurrentLine();
+		Document doc = textArea.getDocument();
+		Element root = doc.getDefaultRootElement();
+		int lineCount = root.getElementCount();
+		int topPosition = textArea.viewToModel(
+								new Point(visibleRect.x,visibleRect.y));
+		int topLine = root.getElementIndex(topPosition);
+		FoldManager fm = ((RSyntaxTextArea)textArea).getFoldManager();
+
+		// Compute the y at which to begin painting text, taking into account
+		// that 1 logical line => at least 1 physical line, so it may be that
+		// y<0.  The computed y-value is the y-value of the top of the first
+		// (possibly) partially-visible view.
+		Rectangle visibleEditorRect = ui.getVisibleEditorRect();
+		Rectangle r = LineNumberList.getChildViewBounds(v, topLine,
+												visibleEditorRect);
+		int y = r.y;
+		final int RHS_BORDER_WIDTH = getRhsBorderWidth();
+		int rhs;
+		boolean ltr = getComponentOrientation().isLeftToRight();
+		if (ltr) {
+			rhs = width - RHS_BORDER_WIDTH;
+		}
+		else { // rtl
+			rhs = RHS_BORDER_WIDTH;
+		}
+		int visibleBottom = visibleRect.y + visibleRect.height;
+		FontMetrics metrics = g.getFontMetrics();
+
+		// Keep painting lines until our y-coordinate is past the visible
+		// end of the text area.
+		g.setColor(getForeground());
+
+		while (y < visibleBottom) {
+
+			r = LineNumberList.getChildViewBounds(v, topLine, visibleEditorRect);
+
+			/*
+			// Highlight the current line's line number, if desired.
+			if (currentLineHighlighted && topLine==currentLine) {
+				g.setColor(textArea.getCurrentLineHighlightColor());
+				g.fillRect(0,y, width,(r.y+r.height)-y);
+				g.setColor(getForeground());
+			}
+			*/
+
+			// Paint the line number.
+			int index = (topLine+1) + getLineNumberingStartIndex() - 1;
+			String number = Integer.toString(index);
+			if (ltr) {
+				int strWidth = metrics.stringWidth(number);
+				g.drawString(number, rhs-strWidth,y+ascent);
+			}
+			else {
+				int x = RHS_BORDER_WIDTH;
+				g.drawString(number, x, y+ascent);
+			}
+
+			// The next possible y-coordinate is just after the last line
+			// painted.
+			y += r.height;
+
+			// Update topLine (we're actually using it for our "current line"
+			// variable now).
+			Fold fold = fm.getFoldForLine(topLine);
+			if (fold!=null && fold.isCollapsed()) {
+				topLine += fold.getCollapsedLineCount();
+			}
+			topLine++;
+			if (topLine>=lineCount)
+				break;
+
+		}
+
+	}
+
+
+	/**
+	 * Called when this component is removed from the view hierarchy.
+	 */
+	public void removeNotify() {
+		super.removeNotify();
+		if (textArea!=null) {
+			l.uninstall(textArea);
+		}
+	}
+
+
+	/**
+	 * Repaints a single line in this list.
+	 *
+	 * @param line The line to repaint.
+	 */
+	private void repaintLine(int line) {
+		int y = textArea.getInsets().top;
+		y += line*cellHeight;
+		repaint(0,y, cellWidth,cellHeight);
+	}
+
+
+	/**
+	 * Overridden to ensure line number cell sizes are updated with the
+	 * font size change.
+	 *
+	 * @param font The new font to use for line numbers.
+	 */
+	public void setFont(Font font) {
+		super.setFont(font);
+		updateCellWidths();
+		updateCellHeights();
+	}
+
+
+	/**
+	 * Sets the starting line's line number.  The default value is
+	 * <code>1</code>.  Applications can call this method to change this value
+	 * if they are displaying a subset of lines in a file, for example.
+	 *
+	 * @param index The new index.
+	 * @see #getLineNumberingStartIndex()
+	 */
+	public void setLineNumberingStartIndex(int index) {
+		if (index!=lineNumberingStartIndex) {
+			lineNumberingStartIndex = index;
+			updateCellWidths();
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Sets the text area being displayed.
+	 *
+	 * @param textArea The text area.
+	 */
+	public void setTextArea(RTextArea textArea) {
+
+		if (l==null) {
+			l = new Listener();
+		}
+
+		if (this.textArea!=null) {
+			l.uninstall(textArea);
+		}
+
+		super.setTextArea(textArea);
+		lastVisibleLine = calculateLastVisibleLineNumber();
+
+		if (textArea!=null) {
+			l.install(textArea); // Won't double-install
+			updateCellHeights();
+			updateCellWidths();
+		}
+
+	}
+
+
+	/**
+	 * Changes the height of the cells in the JList so that they are as tall as
+	 * font. This function should be called whenever the user changes the Font
+	 * of <code>textArea</code>.
+	 */
+	private void updateCellHeights() {
+		if (textArea!=null) {
+			cellHeight = textArea.getLineHeight();
+			ascent = textArea.getMaxAscent();
+		}
+		else {
+			cellHeight = 20; // Arbitrary number.
+			ascent = 5; // Also arbitrary
+		}
+		repaint();
+	}
+
+
+	/**
+	 * Changes the width of the cells in the JList so you can see every digit
+	 * of each.
+	 */
+	void updateCellWidths() {
+
+		int oldCellWidth = cellWidth;
+		cellWidth = getRhsBorderWidth();
+
+		// Adjust the amount of space the line numbers take up, if necessary.
+		if (textArea!=null) {
+			Font font = getFont();
+			if (font!=null) {
+				FontMetrics fontMetrics = getFontMetrics(font);
+				int count = 0;
+				int lineCount = textArea.getLineCount() +
+						getLineNumberingStartIndex() - 1;
+				do {
+					lineCount = lineCount/10;
+					count++;
+				} while (lineCount >= 10);
+				cellWidth += fontMetrics.charWidth('9')*(count+1) + 3;
+			}
+		}
+
+		if (cellWidth!=oldCellWidth) { // Always true
+			revalidate();
+		}
+
+	}
+
+
+	/**
+	 * Listens for events in the text area we're interested in.
+	 */
+	private class Listener implements CaretListener, PropertyChangeListener {
+
+		private boolean installed;
+
+		public void caretUpdate(CaretEvent e) {
+
+			int dot = textArea.getCaretPosition();
+
+			// We separate the line wrap/no line wrap cases because word wrap
+			// can make a single line from the model (document) be on multiple
+			// lines on the screen (in the view); thus, we have to enhance the
+			// logic for that case a bit - we check the actual y-coordinate of
+			// the caret when line wrap is enabled.  For the no-line-wrap case,
+			// getting the line number of the caret suffices.  This increases
+			// efficiency in the no-line-wrap case.
+
+			if (textArea.getLineWrap()==false) {
+				int line = textArea.getDocument().getDefaultRootElement().
+										getElementIndex(dot);
+				if (currentLine!=line) {
+					repaintLine(line);
+					repaintLine(currentLine);
+					currentLine = line;
+				}
+			}
+			else { // lineWrap enabled; must check actual y position of caret
+				try {
+					int y = textArea.yForLineContaining(dot);
+					if (y!=lastY) {
+						lastY = y;
+						currentLine = textArea.getDocument().
+								getDefaultRootElement().getElementIndex(dot);
+						repaint(); // *Could* be optimized...
+					}
+				} catch (BadLocationException ble) {
+					ble.printStackTrace();
+				}
+			}
+
+		}
+
+		public void install(RTextArea textArea) {
+			if (!installed) {
+				//System.out.println("Installing");
+				textArea.addCaretListener(this);
+				textArea.addPropertyChangeListener(this);
+				caretUpdate(null); // Force current line highlight repaint
+				installed = true;
+			}
+		}
+
+		public void propertyChange(PropertyChangeEvent e) {
+
+			String name = e.getPropertyName();
+
+			// If they change the current line highlight in any way...
+			if (RTextArea.HIGHLIGHT_CURRENT_LINE_PROPERTY.equals(name) ||
+				RTextArea.CURRENT_LINE_HIGHLIGHT_COLOR_PROPERTY.equals(name)) {
+				repaintLine(currentLine);
+			}
+
+		}
+
+		public void uninstall(RTextArea textArea) {
+			if (installed) {
+				//System.out.println("Uninstalling");
+				textArea.removeCaretListener(this);
+				textArea.removePropertyChangeListener(this);
+				installed = false;
+			}
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/Macro.java b/src/org/fife/ui/rtextarea/Macro.java
new file mode 100644
index 0000000..e4ebbee
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/Macro.java
@@ -0,0 +1,392 @@
+/*
+ * 09/16/2004
+ *
+ * Macro.java - A macro as recorded/played back by an RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.io.EOFException;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.parsers.*;
+import javax.xml.transform.*;
+import javax.xml.transform.dom.*;
+import javax.xml.transform.stream.*;
+import org.w3c.dom.*;
+import org.xml.sax.InputSource;
+
+import org.fife.io.UnicodeReader;
+
+
+/**
+ * A macro as recorded/played back by an <code>RTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class Macro {
+
+	private String name;
+	private ArrayList macroRecords;
+
+	private static final String ROOT_ELEMENT			= "macro";
+	private static final String MACRO_NAME				= "macroName";
+	private static final String ACTION					= "action";
+	private static final String ID					= "id";
+
+	private static final String UNTITLED_MACRO_NAME		= "<Untitled>";
+
+	private static final String FILE_ENCODING			= "UTF-8";
+
+
+	/**
+	 * Constructor.
+	 */
+	public Macro() {
+		this(UNTITLED_MACRO_NAME);
+	}
+
+
+	/**
+	 * Loads a macro from a file on disk.
+	 *
+	 * @param file The file from which to load the macro.
+	 * @throws java.io.EOFException If an EOF is reached unexpectedly (i.e.,
+	 *         the file is corrupt).
+	 * @throws FileNotFoundException If the specified file does not exist, is
+	 *         a directory instead of a regular file, or otherwise cannot be
+	 *         opened.
+	 * @throws IOException If an I/O exception occurs while reading the file.
+	 * @see #saveToFile
+	 */
+	public Macro(File file) throws EOFException, FileNotFoundException,
+								IOException {
+
+		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+		DocumentBuilder db = null;
+		Document doc = null;
+		try {
+			db = dbf.newDocumentBuilder();
+			//InputSource is = new InputSource(new FileReader(file));
+			InputSource is = new InputSource(new UnicodeReader(
+								new FileInputStream(file), FILE_ENCODING));
+			is.setEncoding(FILE_ENCODING);
+			doc = db.parse(is);//db.parse(file);
+		} catch (Exception e) {
+			e.printStackTrace();
+			String desc = e.getMessage();
+			if (desc==null) {
+				desc = e.toString();
+			}
+			throw new IOException("Error parsing XML: " + desc);
+		}
+
+		macroRecords = new ArrayList();
+
+		// Traverse the XML tree.
+		boolean parsedOK = initializeFromXMLFile(doc.getDocumentElement());
+		if (parsedOK==false) {
+			name = null;
+			macroRecords.clear();
+			macroRecords = null;
+			throw new IOException("Error parsing XML!");
+		}
+
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name The name of the macro.
+	 */
+	public Macro(String name) {
+		this(name, null);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name The name of the macro.
+	 * @param records The initial records of the macro.
+	 */
+	public Macro(String name, List records) {
+		
+		this.name = name;
+
+		if (records!=null) {
+			macroRecords = new ArrayList(records.size());
+			Iterator i = records.iterator();
+			while (i.hasNext()) {
+				MacroRecord record = (MacroRecord)i.next();
+				macroRecords.add(record);
+			}
+		}
+		else {
+			macroRecords = new ArrayList(10);
+		}
+	
+	}
+
+
+	/**
+	 * Adds a macro record to this macro.
+	 *
+	 * @param record The record to add.  If <code>null</code>, nothing happens.
+	 * @see #getMacroRecords
+	 */
+	public void addMacroRecord(MacroRecord record) {
+		if (record!=null)
+			macroRecords.add(record);
+	}
+
+
+	/**
+	 * Returns the macro records that make up this macro.
+	 *
+	 * @return The macro records.
+	 * @see #addMacroRecord
+	 */
+	public List getMacroRecords() {
+		return macroRecords;
+	}
+
+
+	/**
+	 * Returns the name of this macro.
+	 *
+	 * @return The macro's name.
+	 * @see #setName
+	 */
+	public String getName() {
+		return name;
+	}
+
+
+	/**
+	 * Used in parsing an XML document containing a macro.  This method
+	 * initializes this macro with the data contained in the passed-in node.
+	 *
+	 * @param node The root node of the parsed XML document.
+	 * @return <code>true</code> if the macro initialization went okay;
+	 *         <code>false</code> if an error occurred.
+	 */
+	private boolean initializeFromXMLFile(Element root) {
+
+		/*
+		 * This method expects the XML document to be in the following format:
+		 *
+		 * <?xml version="1.0" encoding="UTF-8" ?>
+		 * <macro>
+		 *    <macroName>test</macroName>
+		 *    <action id="default-typed">abcdefg</action>
+		 *    [<action id=...>...</action>]
+		 *    ...
+		 * </macro>
+		 *
+		 */
+
+		NodeList childNodes = root.getChildNodes();
+		int count = childNodes.getLength();
+
+		for (int i=0; i<count; i++) {
+
+			Node node = childNodes.item(i);
+			int type = node.getNodeType();
+			switch (type) {
+
+				// Handle element nodes.
+				case Node.ELEMENT_NODE:
+
+					String nodeName = node.getNodeName();
+
+					if (nodeName.equals(MACRO_NAME)) {
+						NodeList childNodes2 = node.getChildNodes();
+						name = UNTITLED_MACRO_NAME;
+						if (childNodes2.getLength()>0) {
+							node = childNodes2.item(0);
+							int type2 = node.getNodeType();
+							if (type2!=Node.CDATA_SECTION_NODE &&
+									type2!=Node.TEXT_NODE) {
+								return false;
+							}
+							name = node.getNodeValue().trim();
+						}
+						//System.err.println("Macro name==" + name);
+					}
+
+					else if (nodeName.equals(ACTION)) {
+						NamedNodeMap attributes = node.getAttributes();
+						if (attributes==null || attributes.getLength()!=1)
+							return false;
+						Node node2 = attributes.item(0);
+						MacroRecord macroRecord = new MacroRecord();
+						if (!node2.getNodeName().equals(ID)) {
+							return false;
+						}
+						macroRecord.id = node2.getNodeValue();
+						NodeList childNodes2 = node.getChildNodes();
+						int length = childNodes2.getLength();
+						if (length==0) { // Could be empty "" command.
+							//System.err.println("... empty actionCommand");
+							macroRecord.actionCommand = "";
+							//System.err.println("... adding action: " + macroRecord);
+							macroRecords.add(macroRecord);
+							break;
+						}
+						else {
+							node = childNodes2.item(0);
+							int type2 = node.getNodeType();
+							if (type2!=Node.CDATA_SECTION_NODE &&
+									type2!=Node.TEXT_NODE) {
+								return false;
+							}
+							macroRecord.actionCommand = node.getNodeValue();
+							macroRecords.add(macroRecord);
+						}
+
+					}
+					break;
+
+				default:
+					break; // Skip whitespace nodes, etc.
+
+			}
+
+		}
+
+		// Everything went okay.
+		return true;
+
+	}
+
+
+	/**
+	 * Saves this macro to a text file.  This file can later be read in by
+	 * the constructor taking a <code>File</code> parameter; this is the
+	 * mechanism for saving macros.
+	 *
+	 * @param fileName The name of the file in which to save the macro.
+	 * @throws IOException If an error occurs while generating the XML for
+	 *         the output file.
+	 */
+	public void saveToFile(String fileName) throws IOException {
+
+		/*
+		 * This method writes the XML document in the following format:
+		 *
+		 * <?xml version="1.0" encoding="UTF-8" ?>
+		 * <macro>
+		 *    <macroName>test</macroName>
+		 *    <action id="default-typed">abcdefg</action>
+		 *    [<action id=...>...</action>]
+		 *    ...
+		 * </macro>
+		 *
+		 */
+
+		try {
+
+			DocumentBuilder db = DocumentBuilderFactory.newInstance().
+											newDocumentBuilder();
+			DOMImplementation impl = db.getDOMImplementation();
+
+			Document doc = impl.createDocument(null, ROOT_ELEMENT, null);
+			Element rootElement = doc.getDocumentElement();
+
+			// Write the name of the macro.
+			Element nameElement = doc.createElement(MACRO_NAME);
+			rootElement.appendChild(nameElement);
+
+			// Write all actions (the meat) in the macro.
+			int numActions = macroRecords.size();
+			for (int i=0; i<numActions; i++) {
+				MacroRecord record = (MacroRecord)macroRecords.get(i);
+				Element actionElement = doc.createElement(ACTION);
+				actionElement.setAttribute(ID, record.id);
+				if (record.actionCommand!=null &&
+						record.actionCommand.length()>0) {
+					// Remove illegal characters.  I'm no XML expert, but
+					// I'm not sure what I'm doing wrong.  If we don't
+					// strip out chars with Unicode value < 32, our
+					// generator will insert '&#<value>', which will cause
+					// our parser to barf when reading the macro back in
+					// (it says "Invalid XML character").  But why doesn't
+					// our generator tell us the character is invalid too?
+					String command = record.actionCommand;
+					for (int j=0; j<command.length(); j++) {
+						if (command.charAt(j)<32) {
+							command = command.substring(0,j);
+							if (j<command.length()-1)
+								command += command.substring(j+1);
+						}
+					}
+					Node n = doc.createCDATASection(command);
+					actionElement.appendChild(n);
+				}
+				rootElement.appendChild(actionElement);
+			}
+
+			// Dump the XML out to the file.
+			StreamResult result = new StreamResult(new File(fileName));
+			DOMSource source = new DOMSource(doc);
+			TransformerFactory transFac = TransformerFactory.newInstance();
+			Transformer transformer = transFac.newTransformer();
+			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+			transformer.setOutputProperty(OutputKeys.ENCODING, FILE_ENCODING);
+			transformer.transform(source, result);
+
+		} catch (RuntimeException re) {
+			throw re; // Keep FindBugs happy.
+		} catch (Exception e) {
+			throw new IOException("Error generating XML!");
+		}
+
+	}
+
+
+	/**
+	 * Sets the name of this macro.
+	 *
+	 * @param name The new name for the macro.
+	 * @see #getName
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+
+
+	/**
+	 * A "record" of a macro is a single action in the macro (corresponding to
+	 * a key type and some action in the editor, such as a letter inserted into
+	 * the document, scrolling one page down, selecting the current line,
+	 * etc.).
+	 */
+	static class MacroRecord {
+
+		public String id;
+		public String actionCommand;
+
+		public MacroRecord() {
+			this(null, null);
+		}
+
+		public MacroRecord(String id, String actionCommand) {
+			this.id = id;
+			this.actionCommand = actionCommand;
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RDocument.java b/src/org/fife/ui/rtextarea/RDocument.java
new file mode 100644
index 0000000..3b61b00
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RDocument.java
@@ -0,0 +1,65 @@
+/*
+ * 06/30/2012
+ *
+ * RDocument.java - Document class used by RTextAreas.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import javax.swing.text.BadLocationException;
+import javax.swing.text.GapContent;
+import javax.swing.text.PlainDocument;
+
+
+/**
+ * The document implementation used by instances of <code>RTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RDocument extends PlainDocument {
+
+
+	/**
+	 * Constructor.
+	 */
+	public RDocument() {
+		super(new RGapContent());
+	}
+
+
+	/**
+	 * Returns the character in the document at the specified offset.
+	 *
+	 * @param offset The offset of the character.
+	 * @return The character.
+	 * @throws BadLocationException If the offset is invalid.
+	 */
+	public char charAt(int offset) throws BadLocationException {
+		return ((RGapContent)getContent()).charAt(offset);
+	}
+
+
+	/**
+	 * Document content that provides fast access to individual characters.
+	 */
+	private static class RGapContent extends GapContent {
+
+		public char charAt(int offset) throws BadLocationException {
+			if (offset<0 || offset>=length()) {
+				throw new BadLocationException("Invalid offset", offset);
+			}
+			int g0 = getGapStart();
+			char[] array = (char[]) getArray();
+			if (offset<g0) { // below gap
+				return array[offset];
+			}
+			return array[getGapEnd() + offset - g0]; // above gap
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RDocumentCharSequence.java b/src/org/fife/ui/rtextarea/RDocumentCharSequence.java
new file mode 100644
index 0000000..5cd912e
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RDocumentCharSequence.java
@@ -0,0 +1,118 @@
+/*
+ * 06/30/2012
+ *
+ * RDocumentCharSequence.java - Iterator over a portion of an RTextArea's
+ * document.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import javax.swing.text.BadLocationException;
+
+
+/**
+ * Allows iterating over a portion of an <code>RDocument</code>.  This is of
+ * course not thread-safe, so should only be used on the EDT or with external
+ * synchronization.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class RDocumentCharSequence implements CharSequence {
+
+	private RDocument doc;
+	private int start;
+	private int end;
+
+
+	/**
+	 * Creates a <code>CharSequence</code> representing the text in a document
+	 * from the specified offset to the end of that document.
+	 *
+	 * @param doc The document.
+	 * @param start The starting offset in the document, inclusive.
+	 */
+	public RDocumentCharSequence(RDocument doc, int start) {
+		this(doc, start, doc.getLength());
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param doc The document.
+	 * @param start The starting offset in the document, inclusive.
+	 * @param end the ending offset in the document, exclusive.
+	 */
+	public RDocumentCharSequence(RDocument doc, int start, int end) {
+		this.doc = doc;
+		this.start = start;
+		this.end = end;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public char charAt(int index) {
+		if (index<0 || index>=length()) {
+			throw new IndexOutOfBoundsException("Index " + index +
+					" is not in range [0-" + length() + ")");
+		}
+		try {
+			return doc.charAt(start+index);
+		} catch (BadLocationException ble) {
+			throw new IndexOutOfBoundsException(ble.toString());
+		}
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int length() {
+		return end - start;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public CharSequence subSequence(int start, int end) {
+		if (start<0) {
+			throw new IndexOutOfBoundsException("start must be >= 0 (" +
+					start + ")");
+		}
+		else if (end<0) {
+			throw new IndexOutOfBoundsException("end must be >= 0 (" +
+					end + ")");
+		}
+		else if (end>length()) {
+			throw new IndexOutOfBoundsException("end must be <= " +
+					length() + " (" + end + ")");
+		}
+		else if (start>end) {
+			throw new IndexOutOfBoundsException("start (" + start +
+					") cannot be > end (" + end + ")");
+		}
+		int newStart = this.start + start;
+		int newEnd = this.start + end;
+		return new RDocumentCharSequence(doc, newStart, newEnd);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String toString() {
+		try {
+			return doc.getText(start, length());
+		} catch (BadLocationException ble) { // Never happens
+			ble.printStackTrace();
+			return "";
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RTADefaultInputMap.java b/src/org/fife/ui/rtextarea/RTADefaultInputMap.java
new file mode 100644
index 0000000..f85c40a
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RTADefaultInputMap.java
@@ -0,0 +1,151 @@
+/*
+ * 08/19/2004
+ *
+ * RTADefaultInputMap.java - The default input map for RTextAreas.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Toolkit;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.InputMap;
+import javax.swing.KeyStroke;
+import javax.swing.text.DefaultEditorKit;
+
+
+/**
+ * The default input map for an <code>RTextArea</code>.  For the most part it is
+ * exactly that the one for a <code>JTextArea</code>, but it adds a few things.
+ * Currently, the new key bindings include:
+ * <ul>
+ *   <li>HOME key toggles between first character on line and first non-
+ *       whitespace character on line.
+ *   <li>INSERT key toggles between insert and overwrite modes.
+ *   <li>Ctrl+DELETE key deletes all text between the caret and the end of the
+ *       current line.
+ *   <li>Ctrl+Shift+Up and Ctrl+Shift+Down move the current line up and
+ *       down, respectively.
+ *   <li>Ctrl+J joins lines.
+ *   <li>Ctrl+Z is undo and Ctrl+Y is redo.
+ *   <li>Ctrl+Up and Ctrl+Down shift the visible area of the text area up and
+ *       down one line, respectively.
+ *   <li>F2 and Shift+F2 moves to the next and previous bookmarks,
+ *       respectively.
+ *   <li>Ctrl+F2 toggles whether a bookmark is on the current line.
+ *   <li>etc.
+ * </ul>
+ */
+public class RTADefaultInputMap extends InputMap {
+
+
+	/**
+	 * Constructs the default input map for an <code>RTextArea</code>.
+	 */
+	public RTADefaultInputMap() {
+
+		super();
+
+		int defaultModifier = getDefaultModifier();
+		//int ctrl = InputEvent.CTRL_MASK;
+		int alt = InputEvent.ALT_MASK;
+		int shift = InputEvent.SHIFT_MASK;
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME,   0),					DefaultEditorKit.beginLineAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME,   shift),					DefaultEditorKit.selectionBeginLineAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME,   defaultModifier),			DefaultEditorKit.beginAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME,   defaultModifier|shift),	DefaultEditorKit.selectionBeginAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_END,    0),					DefaultEditorKit.endLineAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_END,    shift),					DefaultEditorKit.selectionEndLineAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_END,    defaultModifier),			DefaultEditorKit.endAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_END,    defaultModifier|shift),	DefaultEditorKit.selectionEndAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,   0),					DefaultEditorKit.backwardAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,   shift),					DefaultEditorKit.selectionBackwardAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,   defaultModifier),			DefaultEditorKit.previousWordAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,   defaultModifier|shift),	DefaultEditorKit.selectionPreviousWordAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,   0),					DefaultEditorKit.downAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,   shift),					DefaultEditorKit.selectionDownAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,   defaultModifier),			RTextAreaEditorKit.rtaScrollDownAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,   alt),	RTextAreaEditorKit.rtaLineDownAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,  0),					DefaultEditorKit.forwardAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,  shift),					DefaultEditorKit.selectionForwardAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,  defaultModifier),			DefaultEditorKit.nextWordAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,  defaultModifier|shift),	DefaultEditorKit.selectionNextWordAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,     0),					DefaultEditorKit.upAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,     shift),					DefaultEditorKit.selectionUpAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,     defaultModifier),			RTextAreaEditorKit.rtaScrollUpAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,     alt),	RTextAreaEditorKit.rtaLineUpAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,0),					DefaultEditorKit.pageUpAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,shift),					RTextAreaEditorKit.rtaSelectionPageUpAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,defaultModifier|shift), 	RTextAreaEditorKit.rtaSelectionPageLeftAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,0),					DefaultEditorKit.pageDownAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,shift),				RTextAreaEditorKit.rtaSelectionPageDownAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,defaultModifier|shift),	RTextAreaEditorKit.rtaSelectionPageRightAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_CUT,    0),					DefaultEditorKit.cutAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_COPY,   0),					DefaultEditorKit.copyAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_PASTE,  0),					DefaultEditorKit.pasteAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_X,      defaultModifier),			DefaultEditorKit.cutAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_C,      defaultModifier),			DefaultEditorKit.copyAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_V,      defaultModifier),			DefaultEditorKit.pasteAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0),					DefaultEditorKit.deleteNextCharAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, shift),					DefaultEditorKit.cutAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, defaultModifier),			RTextAreaEditorKit.rtaDeleteRestOfLineAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, 0),					RTextAreaEditorKit.rtaToggleTextModeAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, shift),					DefaultEditorKit.pasteAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, defaultModifier),			DefaultEditorKit.copyAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_A,      defaultModifier),			DefaultEditorKit.selectAllAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_D,      defaultModifier),			RTextAreaEditorKit.rtaDeleteLineAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_J,      defaultModifier),			RTextAreaEditorKit.rtaJoinLinesAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, shift),				DefaultEditorKit.deletePrevCharAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, defaultModifier),		RTextAreaEditorKit.rtaDeletePrevWordAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB,    0),					DefaultEditorKit.insertTabAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,  0),					DefaultEditorKit.insertBreakAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,  shift),					DefaultEditorKit.insertBreakAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, defaultModifier),		RTextAreaEditorKit.rtaDumbCompleteWordAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_Z,      defaultModifier),			RTextAreaEditorKit.rtaUndoAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_Y,      defaultModifier),			RTextAreaEditorKit.rtaRedoAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_F2,		0),							RTextAreaEditorKit.rtaNextBookmarkAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_F2,		shift),						RTextAreaEditorKit.rtaPrevBookmarkAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_F2,		defaultModifier),			RTextAreaEditorKit.rtaToggleBookmarkAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_K,		defaultModifier|shift),		RTextAreaEditorKit.rtaPrevOccurrenceAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_K,		defaultModifier),			RTextAreaEditorKit.rtaNextOccurrenceAction);
+
+		/* NOTE:  Currently, macros aren't part of the default input map for */
+		/* RTextArea, as they display their own popup windows, etc. which    */
+		/* may or may not clash with the application in which the RTextArea  */
+		/* resides.  You can add the macro actions yourself into an          */
+		/* application if you want.  They may become standard in the future  */
+		/* if I can find a way to implement them that I like.                */
+		/*
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_R,      defaultModifier|shift),	RTextAreaEditorKit.rtaBeginRecordingMacroAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_S,      defaultModifier|shift),	RTextAreaEditorKit.rtaEndRecordingMacroAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_M,      defaultModifier|shift),	RTextAreaEditorKit.rtaPlaybackLastMacroAction);
+		*/
+
+	}
+
+
+	/**
+	 * Returns the default modifier key for a system.  For example, on Windows
+	 * this would be the CTRL key (<code>InputEvent.CTRL_MASK</code>).
+	 *
+	 * @return The default modifier key.
+	 */
+	protected static final int getDefaultModifier() {
+		return Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
+	}
+
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RTATextTransferHandler.java b/src/org/fife/ui/rtextarea/RTATextTransferHandler.java
new file mode 100644
index 0000000..24f5a4a
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RTATextTransferHandler.java
@@ -0,0 +1,480 @@
+/*
+ * 07/29/2004
+ *
+ * RTATextTransferHandler.java - Handles the transfer of data to/from an
+ * RTextArea via drag-and-drop.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.datatransfer.*;
+import java.awt.im.InputContext;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringBufferInputStream;
+import java.io.StringReader;
+import javax.swing.*;
+import javax.swing.text.*;
+
+
+/**
+ * Handles the transfer of data to/from an <code>RTextArea</code> via
+ * drag-and-drop.  This class is pretty much ripped off from a subclass of
+ * <code>BasicTextUI</code>.  In the future, it will include the ability to
+ * drag-and-drop files into <code>RTextArea</code>s (i.e., the text will be
+ * inserted into the text area).<p>
+ * 
+ * The main reason this class is kept around is so we can subclass it.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class RTATextTransferHandler extends TransferHandler {
+
+	private JTextComponent exportComp;
+	private boolean shouldRemove;
+	private int p0;
+	private int p1;
+	private boolean withinSameComponent;
+
+
+	/**
+	 * Try to find a flavor that can be used to import a Transferable to a
+	 * specified text component.  
+	 * The set of usable flavors are tried in the following order:
+	 * <ol>
+	 *     <li>First, an attempt is made to find a flavor matching the content
+	 *         tyep of the EditorKit for the component.
+	 *     <li>Second, an attempt to find a text/plain flavor is made.
+	 *     <li>Third, an attempt to find a flavor representing a String
+	 *         reference in the same VM is made.
+	 *     <li>Lastly, DataFlavor.stringFlavor is searched for.
+	 * </ol>
+	 *
+	 * @param flavors The flavors to check if c will accept them.
+	 * @param c The text component to see whether it will accept any of the
+	 *        specified data flavors as input.
+	 */
+	 protected DataFlavor getImportFlavor(DataFlavor[] flavors,
+	 								JTextComponent c) {
+
+		DataFlavor refFlavor = null;
+		DataFlavor stringFlavor = null;
+            
+		for (int i = 0; i < flavors.length; i++) {
+
+			String mime = flavors[i].getMimeType();
+			if (mime.startsWith("text/plain")) {
+				return flavors[i];
+			}
+			else if (refFlavor == null
+				&& mime.startsWith("application/x-java-jvm-local-objectref")
+				&& flavors[i].getRepresentationClass() == String.class)
+			{
+				refFlavor = flavors[i];
+			}
+			else if (stringFlavor==null &&
+				flavors[i].equals(DataFlavor.stringFlavor))
+			{
+				stringFlavor = flavors[i];
+			}
+
+		}
+
+		if (refFlavor != null)
+			return refFlavor;
+		else if (stringFlavor != null)
+			return stringFlavor;
+
+		return null;
+
+	}
+
+
+	/**
+	 * Import the given stream data into the text component.
+	 */
+	protected void handleReaderImport(Reader in, JTextComponent c)
+							throws BadLocationException, IOException {
+
+		char[] buff = new char[1024];
+		int nch;
+		boolean lastWasCR = false;
+		int last;
+		StringBuffer sbuff = null;
+                
+		// Read in a block at a time, mapping \r\n to \n, as well as single
+		// \r to \n.
+		while ((nch = in.read(buff, 0, buff.length)) != -1) {
+
+			if (sbuff == null) {
+				sbuff = new StringBuffer(nch);
+                   }
+			last = 0;
+
+			for (int counter = 0; counter < nch; counter++) {
+
+				switch (buff[counter]) {
+					case '\r':
+						if (lastWasCR) {
+							if (counter == 0)
+								sbuff.append('\n');
+							else
+								buff[counter - 1] = '\n';
+						}
+						else
+							lastWasCR = true;
+						break;
+					case '\n':
+						if (lastWasCR) {
+							if (counter > (last + 1))
+								sbuff.append(buff, last, counter - last - 1);
+							// else nothing to do, can skip \r, next write will
+							// write \n
+							lastWasCR = false;
+							last = counter;
+						}
+						break;
+					default:
+						if (lastWasCR) {
+							if (counter == 0)
+								sbuff.append('\n');
+							else
+								buff[counter - 1] = '\n';
+							lastWasCR = false;
+						}
+						break;
+
+				} // End fo switch (buff[counter]).
+
+			} // End of for (int counter = 0; counter < nch; counter++).
+
+			if (last < nch) {
+				if (lastWasCR) {
+					if (last < (nch - 1))
+						sbuff.append(buff, last, nch - last - 1);
+				}
+					else
+					sbuff.append(buff, last, nch - last);
+			}
+
+		} // End of while ((nch = in.read(buff, 0, buff.length)) != -1).
+
+		if (withinSameComponent) {
+			((RTextArea)c).beginAtomicEdit();
+		}
+
+		if (lastWasCR)
+			sbuff.append('\n');
+		c.replaceSelection(sbuff != null ? sbuff.toString() : "");
+
+	}
+
+
+	/**
+	 * This is the type of transfer actions supported by the source.  Some
+	 * models are not mutable, so a transfer operation of COPY only should
+	 * be advertised in that case.
+	 * 
+	 * @param c  The component holding the data to be transfered.  This
+	 *  argument is provided to enable sharing of TransferHandlers by
+	 *  multiple components.
+	 * @return If the text component is editable, COPY_OR_MOVE is returned,
+	 *         otherwise just COPY is allowed.
+	 */
+	public int getSourceActions(JComponent c) {
+		if (((JTextComponent)c).isEditable())
+			return COPY_OR_MOVE;
+		else
+			return COPY;
+	}
+
+
+	/**
+	 * Create a Transferable to use as the source for a data transfer.
+	 *
+	 * @param comp  The component holding the data to be transfered.  This
+	 *  argument is provided to enable sharing of TransferHandlers by
+	 *  multiple components.
+	 * @return  The representation of the data to be transfered. 
+	 *  
+	 */
+	protected Transferable createTransferable(JComponent comp) {
+		exportComp = (JTextComponent)comp;
+		shouldRemove = true;
+		p0 = exportComp.getSelectionStart();
+		p1 = exportComp.getSelectionEnd();
+		return (p0 != p1) ? (new TextTransferable(exportComp, p0, p1)) : null;
+	}
+
+
+	/**
+	 * This method is called after data has been exported.  This method should
+	 * remove the data that was transfered if the action was MOVE.
+	 *
+	 * @param source The component that was the source of the data.
+	 * @param data   The data that was transferred or possibly null
+     *               if the action is <code>NONE</code>.
+	 * @param action The actual action that was performed.  
+	 */
+	protected void exportDone(JComponent source, Transferable data, int action) {
+		// only remove the text if shouldRemove has not been set to
+		// false by importData and only if the action is a move
+		if (shouldRemove && action == MOVE) {
+			TextTransferable t = (TextTransferable)data;
+			t.removeText();
+			if (withinSameComponent) {
+				((RTextArea)source).endAtomicEdit();
+				withinSameComponent = false;
+			}
+		}
+		exportComp = null;
+	}
+
+
+	/**
+	 * This method causes a transfer to a component from a clipboard or a 
+	 * DND drop operation.  The Transferable represents the data to be
+	 * imported into the component.  
+	 *
+	 * @param comp  The component to receive the transfer.  This
+	 *  argument is provided to enable sharing of TransferHandlers by
+	 *  multiple components.
+	 * @param t The data to import
+	 * @return <code>true</code> iff the data was inserted into the component.
+	 */
+	public boolean importData(JComponent comp, Transferable t) {
+
+		JTextComponent c = (JTextComponent)comp;
+		withinSameComponent = c==exportComp;
+
+		// if we are importing to the same component that we exported from
+		// then don't actually do anything if the drop location is inside
+		// the drag location and set shouldRemove to false so that exportDone
+		// knows not to remove any data
+		if (withinSameComponent && c.getCaretPosition()>=p0 && c.getCaretPosition()<=p1) {
+			shouldRemove = false;
+			return true;
+		}
+
+		boolean imported = false;
+		DataFlavor importFlavor = getImportFlavor(t.getTransferDataFlavors(), c);
+		if (importFlavor != null) {
+			try {
+				InputContext ic = c.getInputContext();
+				if (ic != null)
+					ic.endComposition();
+				Reader r = importFlavor.getReaderForText(t);
+				handleReaderImport(r, c);
+				imported = true;
+			} catch (UnsupportedFlavorException ufe) {
+				ufe.printStackTrace();
+			} catch (BadLocationException ble) {
+				ble.printStackTrace();
+			} catch (IOException ioe) {
+				ioe.printStackTrace();
+			}
+		}
+
+		return imported;
+
+	}
+
+	/**
+	 * This method indicates if a component would accept an import of the
+	 * given set of data flavors prior to actually attempting to import it. 
+	 *
+	 * @param comp The component to receive the transfer.  This argument is
+	 *        provided to enable sharing of TransferHandlers by multiple
+	 *        components.
+	 * @param flavors The data formats available.
+	 * @return <code>true</code> iff the data can be inserted.
+	 */
+	public boolean canImport(JComponent comp, DataFlavor[] flavors) {
+		JTextComponent c = (JTextComponent)comp;
+		if (!(c.isEditable() && c.isEnabled()))
+			return false;
+		return (getImportFlavor(flavors, c) != null);
+	}
+
+
+	/**
+	 * A possible implementation of the Transferable interface for RTextAreas.
+	 */
+	static class TextTransferable implements Transferable {
+
+		Position p0;
+		Position p1;
+		JTextComponent c;
+
+		protected String plainData;
+
+		private static DataFlavor[] stringFlavors;
+		private static DataFlavor[] plainFlavors;
+
+		TextTransferable(JTextComponent c, int start, int end) {
+			this.c = c;
+			Document doc = c.getDocument();
+			try {
+				p0 = doc.createPosition(start);
+				p1 = doc.createPosition(end);
+				plainData = c.getSelectedText();
+			} catch (BadLocationException ble) {
+			}
+		}
+
+		/**
+		 * Fetch the data in a text/plain format.
+		 */
+		protected String getPlainData() {
+			return plainData;
+		}
+
+		/**
+		 * Returns an object which represents the data to be transferred.  The class 
+		 * of the object returned is defined by the representation class of the flavor.
+		 *
+		 * @param flavor the requested flavor for the data
+		 * @see DataFlavor#getRepresentationClass
+		 * @exception IOException                if the data is no longer available
+		 *              in the requested flavor.
+		 * @exception UnsupportedFlavorException if the requested data flavor is
+		 *              not supported.
+		 */
+		public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
+			if (isPlainFlavor(flavor)) {
+				String data = getPlainData();
+				data = (data == null) ? "" : data;
+				if (String.class.equals(flavor.getRepresentationClass())) {
+					return data;
+				} else if (Reader.class.equals(flavor.getRepresentationClass())) {
+					return new StringReader(data);
+				} else if (InputStream.class.equals(flavor.getRepresentationClass())) {
+					return new StringBufferInputStream(data);
+				}
+				// fall through to unsupported
+			} else if (isStringFlavor(flavor)) {
+				String data = getPlainData();
+				data = (data == null) ? "" : data;
+				return data;
+			}
+			throw new UnsupportedFlavorException(flavor);
+		}
+
+		/**
+		 * Returns an array of DataFlavor objects indicating the flavors the data 
+		 * can be provided in.  The array should be ordered according to preference
+		 * for providing the data (from most richly descriptive to least descriptive).
+		 *
+		 * @return an array of data flavors in which this data can be transferred
+		 */
+		public DataFlavor[] getTransferDataFlavors() {
+
+			int plainCount = (isPlainSupported()) ? plainFlavors.length: 0;
+			int stringCount = (isPlainSupported()) ? stringFlavors.length : 0;
+			int totalCount = plainCount + stringCount;
+			DataFlavor[] flavors = new DataFlavor[totalCount];
+	
+			// fill in the array
+			int pos = 0;
+			if (plainCount > 0) {
+				System.arraycopy(plainFlavors, 0, flavors, pos, plainCount);
+				pos += plainCount;
+			}
+			if (stringCount > 0) {
+				System.arraycopy(stringFlavors, 0, flavors, pos, stringCount);
+				//pos += stringCount;
+			}
+
+			return flavors;
+
+		}
+
+		/**
+		 * Returns whether or not the specified data flavor is supported for
+		 * this object.
+		 * @param flavor the requested flavor for the data
+		 * @return boolean indicating whether or not the data flavor is supported
+		 */
+		public boolean isDataFlavorSupported(DataFlavor flavor) {
+			DataFlavor[] flavors = getTransferDataFlavors();
+			for (int i = 0; i < flavors.length; i++) {
+				if (flavors[i].equals(flavor))
+					return true;
+			}
+			return false;
+		}
+
+		/**
+		 * Returns whether or not the specified data flavor is an plain flavor that
+		 * is supported.
+		 * @param flavor the requested flavor for the data
+		 * @return boolean indicating whether or not the data flavor is supported
+		 */
+		protected boolean isPlainFlavor(DataFlavor flavor) {
+			DataFlavor[] flavors = plainFlavors;
+			for (int i = 0; i < flavors.length; i++) {
+				if (flavors[i].equals(flavor))
+					return true;
+			}
+			return false;
+		}
+
+		/**
+		 * Should the plain text flavors be offered?  If so, the method
+		 * getPlainData should be implemented to provide something reasonable.
+		 */
+		protected boolean isPlainSupported() {
+			return plainData != null;
+		}
+
+		/**
+		 * Returns whether or not the specified data flavor is a String flavor that
+		 * is supported.
+		 * @param flavor the requested flavor for the data
+		 * @return boolean indicating whether or not the data flavor is supported
+		 */
+		protected boolean isStringFlavor(DataFlavor flavor) {
+			DataFlavor[] flavors = stringFlavors;
+			for (int i = 0; i < flavors.length; i++) {
+				if (flavors[i].equals(flavor))
+					return true;
+			}
+			return false;
+		}
+
+		void removeText() {
+			if ((p0 != null) && (p1 != null) && (p0.getOffset() != p1.getOffset())) {
+				try {
+					Document doc = c.getDocument();
+					doc.remove(p0.getOffset(), p1.getOffset() - p0.getOffset());
+				} catch (BadLocationException e) {
+				}
+			}
+		}
+
+		// Initialization of supported flavors.
+		static {
+			try {
+
+				plainFlavors = new DataFlavor[3];
+				plainFlavors[0] = new DataFlavor("text/plain;class=java.lang.String");
+				plainFlavors[1] = new DataFlavor("text/plain;class=java.io.Reader");
+				plainFlavors[2] = new DataFlavor("text/plain;charset=unicode;class=java.io.InputStream");
+
+				stringFlavors = new DataFlavor[2];
+				stringFlavors[0] = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType+";class=java.lang.String");
+				stringFlavors[1] = DataFlavor.stringFlavor;
+ 
+			} catch (ClassNotFoundException cle) {
+				System.err.println("Error initializing org.fife.ui.RTATextTransferHandler");
+			}
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RTextArea.java b/src/org/fife/ui/rtextarea/RTextArea.java
new file mode 100644
index 0000000..a22cf6a
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RTextArea.java
@@ -0,0 +1,1707 @@
+/*
+ * 11/14/2003
+ *
+ * RTextArea.java - An extension of JTextArea that adds many features.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.ComponentOrientation;
+import java.awt.Graphics;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.FocusEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.awt.print.PageFormat;
+import java.awt.print.Printable;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Reader;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.InputMap;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.event.CaretEvent;
+import javax.swing.plaf.TextUI;
+import javax.swing.text.AbstractDocument;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+import javax.swing.text.DefaultEditorKit;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Highlighter;
+import javax.swing.text.Segment;
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+
+import org.fife.print.RPrintUtilities;
+import org.fife.ui.rtextarea.Macro.MacroRecord;
+
+
+/**
+ * An extension of <code>JTextArea</code> that adds the following features:
+ * <ul>
+ *    <li>Insert/Overwrite modes (can be toggled via the Insert key)
+ *    <li>A right-click popup menu with standard editing options
+ *    <li>Macro support
+ *    <li>"Mark all" functionality.
+ *    <li>A way to change the background to an image (gif/png/jpg)
+ *    <li>Highlight the current line (can be toggled)
+ *    <li>An easy way to print its text (implements Printable)
+ *    <li>Hard/soft (emulated with spaces) tabs
+ *    <li>Fixes a bug with setTabSize
+ *    <li>Other handy new methods
+ * </ul>
+ * NOTE:  If the background for an <code>RTextArea</code> is set to a color,
+ * its opaque property is set to <code>true</code> for performance reasons.  If
+ * the background is set to an image, then the opaque property is set to
+ * <code>false</code>.  This slows things down a little, but if it didn't happen
+ * then we would see garbage on-screen when the user scrolled through a document
+ * using the arrow keys (not the page-up/down keys though).  You should never
+ * have to set the opaque property yourself; it is always done for you.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RTextArea extends RTextAreaBase
+								implements Printable, Serializable {
+
+	/**
+	 * Constant representing insert mode.
+	 *
+	 * @see #setCaretStyle(int, int)
+	 */
+	public static final int INSERT_MODE				= 0;
+
+	/**
+	 * Constant representing overwrite mode.
+	 *
+	 * @see #setCaretStyle(int, int)
+	 */
+	public static final int OVERWRITE_MODE				= 1;
+
+	/**
+	 * The property fired when the "mark all" color changes.
+	 */
+	public static final String MARK_ALL_COLOR_PROPERTY	= "RTA.markAllColor";
+
+	/*
+	 * Constants for all actions.
+	 */
+	private static final int MIN_ACTION_CONSTANT	= 0;
+	public static final int COPY_ACTION				= 0;
+	public static final int CUT_ACTION				= 1;
+	public static final int DELETE_ACTION			= 2;
+	public static final int PASTE_ACTION			= 3;
+	public static final int REDO_ACTION				= 4;
+	public static final int SELECT_ALL_ACTION		= 5;
+	public static final int UNDO_ACTION				= 6;
+	private static final int MAX_ACTION_CONSTANT	= 6;
+
+	private static final Color DEFAULT_MARK_ALL_COLOR		= Color.ORANGE;
+
+	/**
+	 * The current text mode ({@link #INSERT_MODE} or {@link #OVERWRITE_MODE}).
+	 */
+	private int textMode;
+
+	// All macros are shared across all RTextAreas.
+	private static boolean recordingMacro;		// Whether we're recording a macro.
+	private static Macro currentMacro;
+
+	/**
+	 * This text area's popup menu.
+	 */
+	private JPopupMenu popupMenu;
+
+	private JMenuItem undoMenuItem;
+	private JMenuItem redoMenuItem;
+	private JMenuItem cutMenuItem;
+	private JMenuItem pasteMenuItem;
+	private JMenuItem deleteMenuItem;
+
+	/**
+	 * Whether the popup menu has been created.
+	 */
+	private boolean popupMenuCreated;
+
+	/**
+	 * The text last searched for via Ctrl+K or Ctrl+Shift+K.
+	 */
+	private static String selectedOccurrenceText;
+
+	/**
+	 * Can return tool tips for this text area.  Subclasses can install a
+	 * supplier as a means of adding custom tool tips without subclassing
+	 * <tt>RTextArea</tt>.  {@link #getToolTipText()} checks this supplier
+	 * before calling the super class's version.
+	 */
+	private ToolTipSupplier toolTipSupplier;
+
+	private static RecordableTextAction cutAction;
+	private static RecordableTextAction copyAction;
+	private static RecordableTextAction pasteAction;
+	private static RecordableTextAction deleteAction;
+	private static RecordableTextAction undoAction;
+	private static RecordableTextAction redoAction;
+	private static RecordableTextAction selectAllAction;
+
+	private static IconGroup iconGroup;		// Info on icons for actions.
+
+	private transient RUndoManager undoManager;
+
+	private transient LineHighlightManager lineHighlightManager;
+
+	private ArrayList markAllHighlights;		// Highlights from "mark all".
+	private String markedWord;				// Expression marked in "mark all."
+	private ChangeableHighlightPainter markAllHighlightPainter;
+
+	private int[] carets;		// Index 0=>insert caret, 1=>overwrite.
+
+	private static final String MSG	= "org.fife.ui.rtextarea.RTextArea";
+
+
+	/**
+	 * Constructor.
+	 */
+	public RTextArea() {
+		init(INSERT_MODE);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param doc The document for the editor.
+	 */
+	public RTextArea(AbstractDocument doc) {
+		super(doc);
+		init(INSERT_MODE);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The initial text to display.
+	 */
+	public RTextArea(String text) {
+		super(text);
+		init(INSERT_MODE);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RTextArea(int rows, int cols) {
+		super(rows, cols);
+		init(INSERT_MODE);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The initial text to display.
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RTextArea(String text, int rows, int cols) {
+		super(text, rows, cols);
+		init(INSERT_MODE);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param doc The document for the editor.
+	 * @param text The initial text to display.
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RTextArea(AbstractDocument doc, String text, int rows, int cols) {
+		super(doc, text, rows, cols);
+		init(INSERT_MODE);
+	}
+
+
+	/**
+	 * Creates a new <code>RTextArea</code>.
+	 *
+	 * @param textMode Either <code>INSERT_MODE</code> or
+	 *        <code>OVERWRITE_MODE</code>.
+	 */
+	public RTextArea(int textMode) {
+		init(textMode);
+	}
+
+
+	/**
+	 * Adds an action event to the current macro.  This shouldn't be called
+	 * directly, as it is called by the actions themselves.
+	 *
+	 * @param id The ID of the recordable text action.
+	 * @param actionCommand The "command" of the action event passed to it.
+	 */
+	static synchronized void addToCurrentMacro(String id,
+											String actionCommand) {
+		currentMacro.addMacroRecord(new Macro.MacroRecord(id, actionCommand));
+	}
+
+
+	/**
+	 * Adds a line highlight.
+	 *
+	 * @param line The line to highlight.  This is zero-based.
+	 * @param color The color to highlight the line with.
+	 * @throws BadLocationException If <code>line</code> is an invalid line
+	 *         number.
+	 * @see #removeLineHighlight(Object)
+	 * @see #removeAllLineHighlights()
+	 */
+	public Object addLineHighlight(int line, Color color)
+										throws BadLocationException {
+		if (lineHighlightManager==null) {
+			lineHighlightManager = new LineHighlightManager(this);
+		}
+		return lineHighlightManager.addLineHighlight(line, color);
+	}
+
+
+	/**
+	 * Begins an "atomic edit."  All text editing operations between this call
+	 * and the next call to <tt>endAtomicEdit()</tt> will be treated as a
+	 * single operation by the undo manager.<p>
+	 *
+	 * Using this method should be done with great care.  You should probably
+	 * wrap the call to <tt>endAtomicEdit()</tt> in a <tt>finally</tt> block:
+	 *
+	 * <pre>
+	 * textArea.beginAtomicEdit();
+	 * try {
+	 *    // Do editing
+	 * } finally {
+	 *    textArea.endAtomicEdit();
+	 * }
+	 * </pre>
+	 *
+	 * @see #endAtomicEdit()
+	 */
+	public void beginAtomicEdit() {
+		undoManager.beginInternalAtomicEdit();
+	}
+
+
+	/**
+	 * Begins recording a macro.  After this method is called, all input/caret
+	 * events, etc. are recorded until <code>endMacroRecording</code> is
+	 * called.  If this method is called but the text component is already
+	 * recording a macro, nothing happens (but the macro keeps recording).
+	 *
+	 * @see #isRecordingMacro()
+	 * @see #endRecordingMacro()
+	 */
+	public static synchronized void beginRecordingMacro() {
+		if (isRecordingMacro()) {
+			//System.err.println("Macro already being recorded!");
+			return;
+		}
+		//JOptionPane.showMessageDialog(this, "Now recording a macro");
+		if (currentMacro!=null)
+			currentMacro = null; // May help gc?
+		currentMacro = new Macro();
+		recordingMacro = true;
+	}
+
+
+	/**
+	 * Tells whether an undo is possible
+	 * 
+	 * @see #canRedo()
+	 * @see #undoLastAction()
+	 */
+	public boolean canUndo() {
+		return undoManager.canUndo();
+	}
+
+
+	/**
+	 * Tells whether a redo is possible
+	 * 
+	 * @see #canUndo()
+	 * @see #redoLastAction()
+	 */
+	public boolean canRedo() {
+		return undoManager.canRedo();
+	}
+
+
+	/**
+	 * Clears any "mark all" highlights, if any.
+	 *
+	 * @see #markAll
+	 * @see #getMarkAllHighlightColor
+	 * @see #setMarkAllHighlightColor
+	 */
+	public void clearMarkAllHighlights() {
+		Highlighter h = getHighlighter();
+		if (h!=null && markAllHighlights!=null) {
+			int count = markAllHighlights.size();
+			for (int i=0; i<count; i++)
+				h.removeHighlight(markAllHighlights.get(i));
+			markAllHighlights.clear();
+		}
+		markedWord = null;
+		repaint();
+	}
+
+
+	/**
+	 * Configures the popup menu for this text area.  This method is called
+	 * right before it is displayed, so a hosting application can do any
+	 * custom configuration (configuring actions, adding/removing items, etc.).
+	 * <p>
+	 *
+	 * The default implementation does nothing.<p>
+	 * 
+	 * If you set the popup menu via {@link #setPopupMenu(JPopupMenu)}, you
+	 * will want to override this method, especially if you removed any of the
+	 * menu items in the default popup menu.
+	 *
+	 * @param popupMenu The popup menu.  This will never be <code>null</code>.
+	 * @see #createPopupMenu()
+	 * @see #setPopupMenu(JPopupMenu)
+	 */
+	protected void configurePopupMenu(JPopupMenu popupMenu) {
+
+		boolean canType = isEditable() && isEnabled();
+
+		// Since the user can customize the popup menu, these actions may not
+		// have been created.
+		if (undoMenuItem!=null) {
+			undoMenuItem.setEnabled(undoAction.isEnabled() && canType);
+			redoMenuItem.setEnabled(redoAction.isEnabled() && canType);
+			cutMenuItem.setEnabled(cutAction.isEnabled() && canType);
+			pasteMenuItem.setEnabled(pasteAction.isEnabled() && canType);
+			deleteMenuItem.setEnabled(deleteAction.isEnabled() && canType);
+		}
+
+	}
+
+
+	/**
+	 * Creates the default implementation of the model to be used at
+	 * construction if one isn't explicitly given. A new instance of RDocument
+	 * is returned.
+	 *
+	 * @return The default document.
+	 */
+	protected Document createDefaultModel() {
+		return new RDocument();
+	}
+
+	/**
+	 * Returns the caret event/mouse listener for <code>RTextArea</code>s.
+	 *
+	 * @return The caret event/mouse listener.
+	 */
+	protected RTAMouseListener createMouseListener() {
+		return new RTextAreaMutableCaretEvent(this);
+	}
+
+
+	/**
+	 * Creates the right-click popup menu. Subclasses can override this method
+	 * to replace or augment the popup menu returned.
+	 *
+	 * @return The popup menu.
+	 * @see #setPopupMenu(JPopupMenu)
+	 * @see #configurePopupMenu(JPopupMenu)
+	 * @see #createPopupMenuItem(Action)
+	 */
+	protected JPopupMenu createPopupMenu() {
+		JPopupMenu menu = new JPopupMenu();
+		menu.add(undoMenuItem = createPopupMenuItem(undoAction));
+		menu.add(redoMenuItem = createPopupMenuItem(redoAction));
+		menu.addSeparator();
+		menu.add(cutMenuItem = createPopupMenuItem(cutAction));
+		menu.add(createPopupMenuItem(copyAction));
+		menu.add(pasteMenuItem = createPopupMenuItem(pasteAction));
+		menu.add(deleteMenuItem = createPopupMenuItem(deleteAction));
+		menu.addSeparator();
+		menu.add(createPopupMenuItem(selectAllAction));
+		return menu;
+	}
+
+
+	/**
+	 * Creates the actions used in the popup menu and retrievable by
+	 * {@link #getAction(int)}.
+	 * TODO: Remove these horrible hacks and move localizing of actions into
+	 * the editor kits, where it should be!  The context menu should contain
+	 * actions from the editor kits.
+	 */
+	private static void createPopupMenuActions() {
+
+		// Create actions for right-click popup menu.
+		// 1.5.2004/pwy: Replaced the CTRL_MASK with the cross-platform version...
+		int mod = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
+		ResourceBundle msg = ResourceBundle.getBundle(MSG);
+
+		cutAction = new RTextAreaEditorKit.CutAction();
+		cutAction.setProperties(msg, "Action.Cut");
+		cutAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, mod));
+		copyAction = new RTextAreaEditorKit.CopyAction();
+		copyAction.setProperties(msg, "Action.Copy");
+		copyAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, mod));
+		pasteAction = new RTextAreaEditorKit.PasteAction();
+		pasteAction.setProperties(msg, "Action.Paste");
+		pasteAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, mod));
+		deleteAction = new RTextAreaEditorKit.DeleteNextCharAction();
+		deleteAction.setProperties(msg, "Action.Delete");
+		deleteAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
+		undoAction = new RTextAreaEditorKit.UndoAction();
+		undoAction.setProperties(msg, "Action.Undo");
+		undoAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, mod));
+		redoAction = new RTextAreaEditorKit.RedoAction();
+		redoAction.setProperties(msg, "Action.Redo");
+		redoAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, mod));
+		selectAllAction = new RTextAreaEditorKit.SelectAllAction();
+		selectAllAction.setProperties(msg, "Action.SelectAll");
+		selectAllAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, mod));
+
+	}
+
+
+	/**
+	 * Creates and configures a menu item for used in the popup menu.
+	 *
+	 * @param a The action for the menu item.
+	 * @return The menu item.
+	 * @see #createPopupMenu()
+	 */
+	protected JMenuItem createPopupMenuItem(Action a) {
+		JMenuItem item = new JMenuItem(a) {
+			public void setToolTipText(String text) {
+				// Ignore!  Actions (e.g. undo/redo) set this when changing
+				// their text due to changing enabled state.
+			}
+		};
+		item.setAccelerator(null);
+		return item;
+	}
+
+
+	/**
+	 * Returns the a real UI to install on this text area.
+	 *
+	 * @return The UI.
+	 */
+	protected RTextAreaUI createRTextAreaUI() {
+		return new RTextAreaUI(this);
+	}
+
+
+	/**
+	 * Creates a string of space characters of the specified size.
+	 *
+	 * @param size The number of spaces.
+	 * @return The string of spaces.
+	 */
+	private final String createSpacer(int size) {
+		StringBuffer sb = new StringBuffer();
+		for (int i=0; i<size; i++) {
+			sb.append(' ');
+		}
+		return sb.toString();
+	}
+
+
+	/**
+	 * Creates an undo manager for use in this text area.
+	 *
+	 * @return The undo manager.
+	 */
+	protected RUndoManager createUndoManager() {
+		return new RUndoManager(this);
+	}
+
+
+	/**
+	 * Removes all undoable edits from this document's undo manager.  This
+	 * method also makes the undo/redo actions disabled.
+	 */
+	/*
+	 * NOTE:  For some reason, it appears I have to create an entirely new
+	 *        <code>undoManager</code> for undo/redo to continue functioning
+	 *        properly; if I don't, it only ever lets you do one undo.  Not
+	 *        too sure why this is...
+	 */
+	public void discardAllEdits() {
+		undoManager.discardAllEdits();
+		getDocument().removeUndoableEditListener(undoManager);
+		undoManager = createUndoManager();
+		getDocument().addUndoableEditListener(undoManager);
+		undoManager.updateActions();
+	}
+
+
+	/**
+	 * Completes an "atomic" edit.
+	 *
+	 * @see #beginAtomicEdit()
+	 */
+	public void endAtomicEdit() {
+		undoManager.endInternalAtomicEdit();
+	}
+
+
+	/**
+	 * Ends recording a macro.  If this method is called but the text component
+	 * is not recording a macro, nothing happens.
+	 *
+	 * @see #isRecordingMacro()
+	 * @see #beginRecordingMacro()
+	 */
+	/*
+	 * FIXME:  This should throw an exception if we're not recording a macro.
+	 */
+	public static synchronized void endRecordingMacro() {
+		if (!isRecordingMacro()) {
+			//System.err.println("Not recording a macro!");
+			return;
+		}
+		recordingMacro = false;
+	}
+
+
+	/**
+	 * Notifies all listeners that a caret change has occurred.
+	 *
+	 * @param e The caret event.
+	 */
+	protected void fireCaretUpdate(CaretEvent e) {
+
+		// Decide whether we need to repaint the current line background.
+		possiblyUpdateCurrentLineHighlightLocation();
+
+		// Now, if there is a highlighted region of text, allow them to cut
+		// and copy.
+		if (e!=null && e.getDot()!=e.getMark()) {// && !cutAction.isEnabled()) {
+			cutAction.setEnabled(true);
+			copyAction.setEnabled(true);
+		}
+
+		// Otherwise, if there is no highlighted region, don't let them cut
+		// or copy.  The condition here should speed things up, because this
+		// way, we will only enable the actions the first time the selection
+		// becomes nothing.
+		else if (cutAction.isEnabled()) {
+			cutAction.setEnabled(false);
+			copyAction.setEnabled(false);
+		}
+
+		super.fireCaretUpdate(e);
+
+	}
+
+
+	/**
+	 * Removes the "Ctrl+H <=> Backspace" behavior that Java shows, for some
+	 * odd reason...
+	 */
+	private void fixCtrlH() {
+		InputMap inputMap = getInputMap();
+		KeyStroke char010 = KeyStroke.getKeyStroke("typed \010");
+		InputMap parent = inputMap;
+		while (parent != null) {
+			parent.remove(char010);
+			parent = parent.getParent();
+		}
+		KeyStroke backspace = KeyStroke.getKeyStroke("BACK_SPACE");
+		inputMap.put(backspace, DefaultEditorKit.deletePrevCharAction);
+	}
+
+
+	/**
+	 * Provides a way to gain access to the editor actions on the right-click
+	 * popup menu.  This way you can make toolbar/menu bar items use the actual
+	 * actions used by all <code>RTextArea</code>s, so that icons stay
+	 * synchronized and you don't have to worry about enabling/disabling them
+	 * yourself.<p>
+	 * Keep in mind that these actions are shared across all instances of
+	 * <code>RTextArea</code>, so a change to any action returned by this
+	 * method is global across all <code>RTextArea</code> editors in your
+	 * application.
+	 *
+	 * @param action The action to retrieve, such as {@link #CUT_ACTION}.
+	 *        If the action name is invalid, <code>null</code> is returned.
+	 * @return The action, or <code>null</code> if an invalid action is
+	 *         requested.
+	 */
+	public static RecordableTextAction getAction(int action) {
+		if (action<MIN_ACTION_CONSTANT || action>MAX_ACTION_CONSTANT)
+			return null;
+		switch (action) {
+			case COPY_ACTION:
+				return copyAction;
+			case CUT_ACTION:
+				return cutAction;
+			case DELETE_ACTION:
+				return deleteAction;
+			case PASTE_ACTION:
+				return pasteAction;
+			case REDO_ACTION:
+				return redoAction;
+			case SELECT_ALL_ACTION:
+				return selectAllAction;
+			case UNDO_ACTION:
+				return undoAction;
+		}
+		return null;
+	}
+
+
+	/**
+	 * Returns the macro currently stored in this <code>RTextArea</code>.
+	 * Since macros are shared, all <code>RTextArea</code>s in the currently-
+	 * running application are using this macro.
+	 *
+	 * @return The current macro, or <code>null</code> if no macro has been
+	 *         recorded/loaded.
+	 * @see #loadMacro(Macro)
+	 */
+	public static synchronized Macro getCurrentMacro() {
+		return currentMacro;
+	}
+
+
+	/**
+	 * Returns the default color used for "mark all."
+	 *
+	 * @return The color.
+	 * @see #getMarkAllHighlightColor()
+	 * @see #setMarkAllHighlightColor(Color)
+	 */
+	public static final Color getDefaultMarkAllHighlightColor() {
+		return DEFAULT_MARK_ALL_COLOR;
+	}
+
+
+	/**
+	 * Returns the icon group being used for the actions of this text area.
+	 *
+	 * @return The icon group.
+	 * @see #setIconGroup(IconGroup)
+	 */
+	public static IconGroup getIconGroup() {
+		return iconGroup;
+	}
+
+
+	/**
+	 * Returns the line highlight manager.
+	 *
+	 * @return The line highlight manager.  This may be <code>null</code>.
+	 */
+	LineHighlightManager getLineHighlightManager() {
+		return lineHighlightManager;
+	}
+
+
+	/**
+	 * Returns the color used in "mark all."
+	 *
+	 * @return The color.
+	 * @see #setMarkAllHighlightColor(Color)
+	 */
+	public Color getMarkAllHighlightColor() {
+		return (Color)markAllHighlightPainter.getPaint();
+	}
+
+
+	/**
+	 * Returns the maximum ascent of all fonts used in this text area.  In
+	 * the case of a standard <code>RTextArea</code>, this is simply the
+	 * ascent of the current font.<p>
+	 *
+	 * This value could be useful, for example, to implement a line-numbering
+	 * scheme.
+	 *
+	 * @return The ascent of the current font.
+	 */
+	public int getMaxAscent() {
+		return getFontMetrics(getFont()).getAscent();
+	}
+
+
+	/**
+	 * Returns the popup menu for this component, lazily creating it if
+	 * necessary.
+	 *
+	 * @return The popup menu.
+	 * @see #createPopupMenu()
+	 * @see #setPopupMenu(JPopupMenu)
+	 */
+	public JPopupMenu getPopupMenu() {
+		if (!popupMenuCreated) {
+			popupMenu = createPopupMenu();
+			if (popupMenu!=null) {
+				ComponentOrientation orientation = ComponentOrientation.
+										getOrientation(Locale.getDefault());
+				popupMenu.applyComponentOrientation(orientation);
+			}
+			popupMenuCreated = true;
+		}
+		return popupMenu;
+	}
+
+
+	/**
+	 * Returns the text last selected and used in a Ctrl+K operation.
+	 *
+	 * @return The text, or <code>null</code> if none.
+	 * @see #setSelectedOccurrenceText(String)
+	 */
+	public static String getSelectedOccurrenceText() {
+		return selectedOccurrenceText;
+	}
+
+
+	/**
+	 * Returns the text mode this editor pane is currently in.
+	 *
+	 * @return Either {@link #INSERT_MODE} or {@link #OVERWRITE_MODE}.
+	 * @see #setTextMode(int)
+	 */
+	public final int getTextMode() {
+		return textMode;
+	}
+
+
+	/**
+	 * Returns the tool tip supplier.
+	 *
+	 * @return The tool tip supplier, or <code>null</code> if one isn't
+	 *         installed.
+	 * @see #setToolTipSupplier(ToolTipSupplier)
+	 */
+	public ToolTipSupplier getToolTipSupplier() {
+		return toolTipSupplier;
+	}
+
+
+	/**
+	 * Returns the tooltip to display for a mouse event at the given
+	 * location.  This method is overridden to check for a
+	 * {@link ToolTipSupplier}; if there is one installed, it is queried for
+	 * tool tip text before using the super class's implementation of this
+	 * method.
+	 *
+	 * @param e The mouse event.
+	 * @return The tool tip text, or <code>null</code> if none.
+	 * @see #getToolTipSupplier()
+	 * @see #setToolTipSupplier(ToolTipSupplier)
+	 */
+	public String getToolTipText(MouseEvent e) {
+		String tip = null;
+		if (getToolTipSupplier()!=null) {
+			tip = getToolTipSupplier().getToolTipText(this, e);
+		}
+		return tip!=null ? tip : super.getToolTipText();
+	}
+
+
+	/**
+	 * Does the actual dirty-work of replacing the selected text in this
+	 * text area (i.e., in its document).  This method provides a hook for
+	 * subclasses to handle this in a different way.
+	 *
+	 * @param content The content to add.
+	 */
+	protected void handleReplaceSelection(String content) {
+		// Call into super to handle composed text (1.5+ only though).
+		super.replaceSelection(content);
+	}
+
+
+	/**
+	 * Initializes this text area.
+	 *
+	 * @param textMode The text mode.
+	 */
+	private void init(int textMode) {
+
+		// NOTE: Our actions are created here instead of in a static block
+		// so they are only created when the first RTextArea is instantiated,
+		// not before.  There have been reports of users calling static getters
+		// (e.g. RSyntaxTextArea.getDefaultBracketMatchBGColor()) which would
+		// cause these actions to be created and (possibly) incorrectly
+		// localized, if they were in a static block.
+		if (cutAction==null) {
+			createPopupMenuActions();
+		}
+
+		// Install the undo manager.
+		undoManager = createUndoManager();
+		getDocument().addUndoableEditListener(undoManager);
+
+		// Set the defaults for various stuff.
+		Color markAllHighlightColor = getDefaultMarkAllHighlightColor();
+		markAllHighlightPainter = new ChangeableHighlightPainter(
+										markAllHighlightColor);
+		setMarkAllHighlightColor(markAllHighlightColor);
+		carets = new int[2];
+		setCaretStyle(INSERT_MODE, ConfigurableCaret.THICK_VERTICAL_LINE_STYLE);
+		setCaretStyle(OVERWRITE_MODE, ConfigurableCaret.BLOCK_STYLE);
+		setDragEnabled(true);			// Enable drag-and-drop.
+
+		// Set values for stuff the user passed in.
+		setTextMode(textMode); // carets array must be initialized first!
+
+		// Fix the odd "Ctrl+H <=> Backspace" Java behavior.
+		fixCtrlH();
+
+	}
+
+
+	/**
+	 * Returns whether or not a macro is being recorded.
+	 *
+	 * @return Whether or not a macro is being recorded.
+	 * @see #beginRecordingMacro()
+	 * @see #endRecordingMacro()
+	 */
+	public static synchronized boolean isRecordingMacro() {
+		return recordingMacro;
+	}
+
+
+	/**
+	 * Loads a macro to be used by all <code>RTextArea</code>s in the current
+	 * application.
+	 *
+	 * @param macro The macro to load.
+	 * @see #getCurrentMacro()
+	 */
+	public static synchronized void loadMacro(Macro macro) {
+		currentMacro = macro;
+	}
+
+
+	/**
+	 * Marks all instances of the specified text in this text area.
+	 *
+	 * @param toMark The text to mark.
+	 * @param matchCase Whether the match should be case-sensitive.
+	 * @param wholeWord Whether the matches should be surrounded by spaces
+	 *        or tabs.
+	 * @param regex Whether <code>toMark</code> is a Java regular expression.
+	 * @return The number of matches marked.
+	 * @see #clearMarkAllHighlights
+	 * @see #getMarkAllHighlightColor
+	 * @see #setMarkAllHighlightColor
+	 */
+	public int markAll(String toMark, boolean matchCase, boolean wholeWord,
+					boolean regex) {
+		Highlighter h = getHighlighter();
+		int numMarked = 0;
+		if (toMark!=null && !toMark.equals(markedWord) && h!=null) {
+			if (markAllHighlights!=null)
+				clearMarkAllHighlights();
+			else
+				markAllHighlights = new ArrayList(10);
+			int caretPos = getCaretPosition();
+			markedWord = toMark;
+			setCaretPosition(0);
+			SearchContext context = new SearchContext();
+			context.setSearchFor(toMark);
+			context.setMatchCase(matchCase);
+			context.setRegularExpression(regex);
+			context.setSearchForward(true);
+			context.setWholeWord(wholeWord);
+			boolean found = SearchEngine.find(this, context);
+			while (found) {
+				int start = getSelectionStart();
+				int end = getSelectionEnd();
+				try {
+					markAllHighlights.add(h.addHighlight(start, end,
+										markAllHighlightPainter));
+				} catch (BadLocationException ble) {
+					ble.printStackTrace();
+				}
+				numMarked++;
+				found = SearchEngine.find(this, context);
+			}
+			setCaretPosition(caretPos);
+			repaint();
+		}
+		return numMarked;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void paste() {
+		// Treat paste operations as atomic, otherwise the removal and
+		// insertion are treated as two separate undo-able operations.
+		beginAtomicEdit();
+		try {
+			super.paste();
+		} finally {
+			endAtomicEdit();
+		}
+	}
+
+
+	/**
+	 * "Plays back" the last recorded macro in this text area.
+	 */
+	public synchronized void playbackLastMacro() {
+		if (currentMacro!=null) {
+			Action[] actions = getActions();
+			int numActions = actions.length;
+			List macroRecords = currentMacro.getMacroRecords();
+			int num = macroRecords.size();
+			if (num>0) {
+				undoManager.beginInternalAtomicEdit();
+				try {
+					for (int i=0; i<num; i++) {
+						MacroRecord record = (MacroRecord)macroRecords.get(i);
+						for (int j=0; j<numActions; j++) {
+							if ((actions[j] instanceof RecordableTextAction) &&
+								record.id.equals(
+								((RecordableTextAction)actions[j]).getMacroID())) {
+								actions[j].actionPerformed(
+									new ActionEvent(this,
+												ActionEvent.ACTION_PERFORMED,
+												record.actionCommand));
+								break;
+							}
+						}
+					}
+				} finally {
+					undoManager.endInternalAtomicEdit();
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * Method called when it's time to print this badboy (the old-school,
+	 * AWT way).
+	 *
+	 * @param g The context into which the page is drawn.
+	 * @param pageFormat The size and orientation of the page being drawn.
+	 * @param pageIndex The zero based index of the page to be drawn.
+	 */
+	public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
+		return RPrintUtilities.printDocumentWordWrap(g, this, getFont(), pageIndex, pageFormat, getTabSize());
+	}
+
+
+	/**
+	 * We override this method because the super version gives us an entirely
+	 * new <code>Document</code>, thus requiring us to re-attach our Undo
+	 * manager.  With this version we just replace the text.
+	 */
+	public void read(Reader in, Object desc) throws IOException {
+
+		RTextAreaEditorKit kit = (RTextAreaEditorKit)getUI().getEditorKit(this);
+		setText(null);
+		Document doc = getDocument();
+		if (desc != null)
+			doc.putProperty(Document.StreamDescriptionProperty, desc);
+		try {
+			// NOTE:  Resets the "line separator" property.
+			kit.read(in, doc, 0);
+		} catch (BadLocationException e) {
+			throw new IOException(e.getMessage());
+		}
+
+	}
+
+
+	/**
+	 * De-serializes a text area.
+	 *
+	 * @param s The stream to read from.
+	 * @throws ClassNotFoundException
+	 * @throws IOException
+	 */
+	private void readObject(ObjectInputStream s)
+						throws ClassNotFoundException, IOException {
+
+		s.defaultReadObject();
+
+		// UndoManagers cannot be serialized without Exceptions.  See
+		// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4275892
+		undoManager = createUndoManager();
+		getDocument().addUndoableEditListener(undoManager);
+
+		lineHighlightManager = null; // Keep FindBugs happy.
+
+	}
+
+
+	/**
+	 * Attempt to redo the last action.
+	 *
+	 * @see #undoLastAction()
+	 */
+	public void redoLastAction() {
+		// NOTE:  The try/catch block shouldn't be necessary...
+		try {
+			if (undoManager.canRedo())
+				undoManager.redo();
+		} catch (CannotRedoException cre) {
+			cre.printStackTrace();
+		}
+	}
+
+
+	/**
+	 * Removes all line highlights.
+	 *
+	 * @see #removeLineHighlight(Object)
+	 */
+	public void removeAllLineHighlights() {
+		if (lineHighlightManager!=null) {
+			lineHighlightManager.removeAllLineHighlights();
+		}
+	}
+
+
+	/**
+	 * Removes a line highlight.
+	 *
+	 * @param tag The tag of the line highlight to remove.
+	 * @see #removeAllLineHighlights()
+	 * @see #addLineHighlight(int, Color)
+	 */
+	public void removeLineHighlight(Object tag) {
+		if (lineHighlightManager!=null) {
+			lineHighlightManager.removeLineHighlight(tag);
+		}
+	}
+
+
+	/**
+	 * Replaces text from the indicated start to end position with the
+	 * new text specified.  Does nothing if the model is null.  Simply
+	 * does a delete if the new string is null or empty.
+	 * <p>
+	 * This method is thread safe, although most Swing methods
+	 * are not.<p>
+	 * This method is overridden so that our Undo manager remembers it as a
+	 * single operation (it has trouble with this, especially for
+	 * <code>RSyntaxTextArea</code> and the "auto-indent" feature).
+	 *
+	 * @param str the text to use as the replacement
+	 * @param start the start position >= 0
+	 * @param end the end position >= start
+	 * @exception IllegalArgumentException  if part of the range is an
+	 *  invalid position in the model
+	 * @see #insert(String, int)
+	 * @see #replaceRange(String, int, int)
+	 */
+	public void replaceRange(String str, int start, int end) {
+		if (end < start)
+			throw new IllegalArgumentException("end before start");
+		Document doc = getDocument();
+		if (doc != null) {
+			try {
+				// Without this, in some cases we'll have to do two undos
+				// for one logical operation (for example, try editing a
+				// Java source file in an RSyntaxTextArea, and moving a line
+				// with text already on it down via Enter.  Without this
+				// line, doing a single "undo" moves all later text up,
+				// but the first line moved down isn't there!  Doing a
+				// second undo puts it back.
+				undoManager.beginInternalAtomicEdit();
+				((AbstractDocument)doc).replace(start, end - start,
+                               		                     str, null);
+			} catch (BadLocationException e) {
+				throw new IllegalArgumentException(e.getMessage());
+			} finally {
+				undoManager.endInternalAtomicEdit();
+			}
+		}
+    }
+
+
+	/**
+	 * This method overrides <code>JTextComponent</code>'s
+	 * <code>replaceSelection</code>, so that if <code>textMode</code> is
+	 * {@link #OVERWRITE_MODE}, it actually overwrites.
+	 *
+	 * @param text The content to replace the selection with.
+	 */
+	public void replaceSelection(String text) {
+
+		// It's legal for null to be used here...
+		if (text==null) {
+			handleReplaceSelection(text);
+			return;
+		}
+
+		if (getTabsEmulated()) {
+			int firstTab = text.indexOf('\t');
+			if (firstTab>-1) {
+				int docOffs = getSelectionStart();
+				try {
+					text = replaceTabsWithSpaces(text, docOffs, firstTab);
+				} catch (BadLocationException ble) { // Never happens
+					ble.printStackTrace();
+				}
+			}
+		}
+
+		// If the user wants to overwrite text...
+		if (textMode==OVERWRITE_MODE && !"\n".equals(text)) {
+
+			Caret caret = getCaret();
+			int caretPos = caret.getDot();
+			Document doc = getDocument();
+			Element map = doc.getDefaultRootElement();
+			int curLine = map.getElementIndex(caretPos);
+			int lastLine = map.getElementCount() - 1;
+
+			try {
+
+				// If we're not at the end of a line, select the characters
+				// that will be overwritten (otherwise JTextArea will simply
+				// insert in front of them).
+				int curLineEnd = getLineEndOffset(curLine);
+				if (caretPos==caret.getMark() && caretPos!=curLineEnd) {
+					if (curLine==lastLine)
+						caretPos = Math.min(caretPos+text.length(), curLineEnd);
+					else
+						caretPos = Math.min(caretPos+text.length(), curLineEnd-1);
+					caret.moveDot(caretPos);//moveCaretPosition(caretPos);
+				}
+
+			} catch (BadLocationException ble) { // Never happens
+				UIManager.getLookAndFeel().provideErrorFeedback(this);
+				ble.printStackTrace();
+			}
+
+		} // End of if (textMode==OVERWRITE_MODE).
+
+		// Now, actually do the inserting/replacing.  Our undoManager will
+		// take care of remembering the remove/insert as atomic if we are in
+		// overwrite mode.
+		handleReplaceSelection(text);
+
+	}
+
+
+	private static StringBuffer repTabsSB;
+	private static Segment repTabsSeg = new Segment();
+	/**
+	 * Replaces all instances of the tab character in <code>text</code> with
+	 * the number of spaces equivalent to a tab in this text area.<p>
+	 *
+	 * This method should only be called from thread-safe methods, such as
+	 * {@link #replaceSelection(String)}.
+	 *
+	 * @param text The <code>java.lang.String</code> in which to replace tabs
+	 *        with spaces.  This has already been verified to have at least
+	 *        one tab character in it.
+	 * @param docOffs The offset in the document at which the text is being
+	 *        inserted.
+	 * @param firstTab The offset into <code>text</code> of the first tab.  Assumed
+	 *        to be >= 0.
+	 * @return A <code>String</code> just like <code>text</code>, but with
+	 *         spaces instead of tabs.
+	 */
+	private final String replaceTabsWithSpaces(String text, int docOffs, int firstTab)
+			throws BadLocationException {
+
+		int tabSize = getTabSize();
+
+		// Get how many chars into the current line we are
+		Document doc = getDocument();
+		Element root = doc.getDefaultRootElement();
+		int lineIndex = root.getElementIndex(docOffs);
+		Element line = root.getElement(lineIndex);
+		int lineStart = line.getStartOffset();
+		int charCount = docOffs - lineStart;
+
+		// Figure out how many chars into the "current tab" we are
+		if (charCount>0) {
+			doc.getText(lineStart, charCount, repTabsSeg);
+			charCount = 0;
+			for (int i=0; i<repTabsSeg.count; i++) {
+				char ch = repTabsSeg.array[repTabsSeg.offset + i];
+				if (ch=='\t') {
+					charCount = 0;
+				}
+				else {
+					charCount = (charCount + 1) % tabSize;
+				}
+			}
+		}
+
+		// Common case: The user's entering a single tab (pressed the tab key).
+		if (text.length()==1) {
+			return createSpacer(tabSize - charCount);
+		}
+
+		// Otherwise, there may be more than one tab.
+
+		if (repTabsSB==null) {
+			repTabsSB = new StringBuffer();
+		}
+		repTabsSB.setLength(0);
+		char[] array = text.toCharArray();
+		int lastPos = 0;
+		int offsInLine = charCount; // Accurate enough for our start
+		for (int pos=firstTab; pos<array.length; pos++) {
+			char ch = array[pos];
+			switch (ch) {
+				case '\t':
+					if (pos>lastPos) {
+						repTabsSB.append(array, lastPos, pos-lastPos);
+					}
+					int thisTabSize = tabSize - (offsInLine%tabSize);
+					repTabsSB.append(createSpacer(thisTabSize));
+					lastPos = pos + 1;
+					offsInLine = 0;
+					break;
+				case '\n':
+					offsInLine = 0;
+					break;
+				default:
+					offsInLine++;
+					break;
+			}
+		}
+		if (lastPos<array.length) {
+			repTabsSB.append(array, lastPos, array.length-lastPos);
+		}
+
+		return repTabsSB.toString();
+
+	}
+
+
+
+	/**
+	 * Sets the properties of one of the actions this text area owns.
+	 *
+	 * @param action The action to modify; for example, {@link #CUT_ACTION}.
+	 * @param name The new name for the action.
+	 * @param mnemonic The new mnemonic for the action.
+	 * @param accelerator The new accelerator key for the action.
+	 */
+	public static void setActionProperties(int action, String name,
+							char mnemonic, KeyStroke accelerator) {
+		setActionProperties(action, name, new Integer(mnemonic), accelerator);
+	}
+
+
+	/**
+	 * Sets the properties of one of the actions this text area owns.
+	 *
+	 * @param action The action to modify; for example, {@link #CUT_ACTION}.
+	 * @param name The new name for the action.
+	 * @param mnemonic The new mnemonic for the action.
+	 * @param accelerator The new accelerator key for the action.
+	 */
+	public static void setActionProperties(int action, String name,
+							Integer mnemonic, KeyStroke accelerator) {
+
+		Action tempAction = null;
+
+		switch (action) {
+			case CUT_ACTION:
+				tempAction = cutAction;
+				break;
+			case COPY_ACTION:
+				tempAction = copyAction;
+				break;
+			case PASTE_ACTION:
+				tempAction = pasteAction;
+				break;
+			case DELETE_ACTION:
+				tempAction = deleteAction;
+				break;
+			case SELECT_ALL_ACTION:
+				tempAction = selectAllAction;
+				break;
+			case UNDO_ACTION:
+			case REDO_ACTION:
+			default:
+				return;
+		}
+
+		tempAction.putValue(Action.NAME, name);
+		tempAction.putValue(Action.SHORT_DESCRIPTION, name);
+		tempAction.putValue(Action.ACCELERATOR_KEY, accelerator);
+		tempAction.putValue(Action.MNEMONIC_KEY, mnemonic);
+
+	}
+
+
+	/**
+	 * Sets the caret to use in this text area.  It is strongly encouraged to
+	 * use {@link ConfigurableCaret}s (which is used by default), or a
+	 * subclass, since they know how to render themselves differently when the
+	 * user toggles between insert and overwrite modes.
+	 *
+	 * @param caret The caret to use.  If this is not an instance of
+	 *        <code>ConfigurableCaret</code>, an exception is thrown.
+	 * @throws IllegalArgumentException If the specified caret is not an
+	 *         <code>ConfigurableCaret</code>.
+	 * @see #setCaretStyle(int, int)
+	 */
+	public void setCaret(Caret caret) {
+		super.setCaret(caret);
+		if (carets!=null && // Called by setUI() before carets is initialized
+				caret instanceof ConfigurableCaret) {
+			((ConfigurableCaret)caret).setStyle(carets[getTextMode()]);
+		}
+	}
+
+
+	/**
+	 * Sets the style of caret used when in insert or overwrite mode.
+	 *
+	 * @param mode Either {@link #INSERT_MODE} or {@link #OVERWRITE_MODE}.
+	 * @param style The style for the caret (such as
+	 *        {@link ConfigurableCaret#VERTICAL_LINE_STYLE}).
+	 * @see org.fife.ui.rtextarea.ConfigurableCaret
+	 */
+	public void setCaretStyle(int mode, int style) {
+		style = (style>=ConfigurableCaret.MIN_STYLE &&
+					style<=ConfigurableCaret.MAX_STYLE ?
+						style : ConfigurableCaret.THICK_VERTICAL_LINE_STYLE);
+		carets[mode] = style;
+		if (mode==getTextMode() && getCaret() instanceof ConfigurableCaret) {
+			// Will repaint the caret if necessary.
+			((ConfigurableCaret)getCaret()).setStyle(style);
+		}
+	}
+
+
+	/**
+	 * Sets the document used by this text area.
+	 *
+	 * @param document The new document to use.
+	 * @throws IllegalArgumentException If the document is not an instance of
+	 *         {@link RDocument}.
+	 */
+	public void setDocument(Document document) {
+		if (!(document instanceof RDocument)) {
+			throw new IllegalArgumentException("RTextArea requires " +
+				"instances of RDocument for its document");
+		}
+		if (undoManager!=null) { // First time through, undoManager==null
+			Document old = getDocument();
+			if (old!=null) {
+				old.removeUndoableEditListener(undoManager);
+			}
+		}
+		super.setDocument(document);
+		if (undoManager!=null) {
+			document.addUndoableEditListener(undoManager);
+			discardAllEdits();
+		}
+	}
+
+
+	/**
+	 * Sets the path in which to find images to associate with the editor's
+	 * actions.  The path MUST contain the following images (with the
+	 * appropriate extension as defined by the icon group):<br>
+	 * <ul>
+	 *   <li>cut</li>
+	 *   <li>copy</li>
+	 *   <li>paste</li>
+	 *   <li>delete</li>
+	 *   <li>undo</li>
+	 *   <li>redo</li>
+	 *   <li>selectall</li>
+	 * </ul>
+	 * If any of the above images don't exist, the corresponding action will
+	 * not have an icon.
+	 *
+	 * @param group The icon group to load.
+	 * @see #getIconGroup()
+	 */
+	public static synchronized void setIconGroup(IconGroup group) {
+		Icon icon = group.getIcon("cut");
+		cutAction.putValue(Action.SMALL_ICON, icon);
+		icon = group.getIcon("copy");
+		copyAction.putValue(Action.SMALL_ICON, icon);
+		icon = group.getIcon("paste");
+		pasteAction.putValue(Action.SMALL_ICON, icon);
+		icon = group.getIcon("delete");
+		deleteAction.putValue(Action.SMALL_ICON, icon);
+		icon = group.getIcon("undo");
+		undoAction.putValue(Action.SMALL_ICON, icon);
+		icon = group.getIcon("redo");
+		redoAction.putValue(Action.SMALL_ICON, icon);
+		icon = group.getIcon("selectall");
+		selectAllAction.putValue(Action.SMALL_ICON, icon);
+		iconGroup = group;
+	}
+
+
+	/**
+	 * Sets the color used for "mark all."  This fires a property change of
+	 * type {@link #MARK_ALL_COLOR_PROPERTY}.
+	 *
+	 * @param color The color to use for "mark all."
+	 * @see #getMarkAllHighlightColor()
+	 */
+	public void setMarkAllHighlightColor(Color color) {
+		Color old = (Color)markAllHighlightPainter.getPaint();
+		if (old!=null && !old.equals(color)) {
+			markAllHighlightPainter.setPaint(color);
+			if (markedWord!=null)
+				repaint();	// Repaint if words are highlighted.
+			firePropertyChange(MARK_ALL_COLOR_PROPERTY, old, color);
+		}
+	}
+
+
+	/**
+	 * Sets the popup menu used by this text area.<p>
+	 * 
+	 * If you set the popup menu with this method, you'll want to consider also
+	 * overriding {@link #configurePopupMenu(JPopupMenu)}, especially if you
+	 * removed any of the default menu items.
+	 *
+	 * @param popupMenu The popup menu.  If this is <code>null</code>, no
+	 *        popup menu will be displayed.
+	 * @see #getPopupMenu()
+	 * @see #configurePopupMenu(JPopupMenu)
+	 */
+	public void setPopupMenu(JPopupMenu popupMenu) {
+		this.popupMenu = popupMenu;
+		popupMenuCreated = true;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setRoundedSelectionEdges(boolean rounded) {
+		if (getRoundedSelectionEdges()!=rounded) {
+			markAllHighlightPainter.setRoundedEdges(rounded);
+			super.setRoundedSelectionEdges(rounded); // Fires event.
+		}
+	}
+
+
+	/**
+	 * Sets the text last selected/Ctrl+K'd in an <code>RTextArea</code>.
+	 * This text will be searched for in subsequent Ctrl+K/Ctrl+Shift+K
+	 * actions (Cmd+K on OS X).<p>
+	 *
+	 * Since the selected occurrence actions are built into RTextArea,
+	 * applications usually do not have to call this method directly, but can
+	 * choose to do so if they wish (for example, if they wish to set this
+	 * value when the user does a search via a Find dialog).
+	 *
+	 * @param text The selected text.
+	 * @see #getSelectedOccurrenceText()
+	 */
+	public static void setSelectedOccurrenceText(String text) {
+		selectedOccurrenceText = text;
+	}
+
+
+	/**
+	 * Sets the text mode for this editor pane.  If the currently installed
+	 * caret is an instance of {@link ConfigurableCaret}, it will be
+	 * automatically updated to render itself appropriately for the new text
+	 * mode.
+	 *
+	 * @param mode Either {@link #INSERT_MODE} or {@link #OVERWRITE_MODE}.
+	 * @see #getTextMode()
+	 */
+	public void setTextMode(int mode) {
+
+		if (mode!=INSERT_MODE && mode!=OVERWRITE_MODE)
+			mode = INSERT_MODE;
+
+		if (textMode != mode) {
+			Caret caret = getCaret();
+			if (caret instanceof ConfigurableCaret) {
+				((ConfigurableCaret)caret).setStyle(carets[mode]);
+			}
+			textMode = mode;
+		}
+
+	}
+
+
+	/**
+	 * Sets the tool tip supplier.
+	 *
+	 * @param supplier The new tool tip supplier, or <code>null</code> if
+	 *        there is to be no supplier.
+	 * @see #getToolTipSupplier()
+	 */
+	public void setToolTipSupplier(ToolTipSupplier supplier) {
+		this.toolTipSupplier = supplier;
+	}
+
+
+	/**
+	 * Sets the UI used by this text area.  This is overridden so only the
+	 * right-click popup menu's UI is updated.  The look and feel of an
+	 * <code>RTextArea</code> is independent of the Java Look and Feel, and so
+	 * this method does not change the text area itself.  Subclasses (such as
+	 * <code>RSyntaxTextArea</code> can call <code>setRTextAreaUI</code> if
+	 * they wish to install a new UI.
+	 *
+	 * @param ui This parameter is ignored.
+	 */
+	public final void setUI(TextUI ui) {
+
+		// Update the popup menu's ui.
+		if (popupMenu!=null) {
+			SwingUtilities.updateComponentTreeUI(popupMenu);
+		}
+
+		// Set things like selection color, selected text color, etc. to
+		// laf defaults (if values are null or UIResource instances).
+		RTextAreaUI rtaui = (RTextAreaUI)getUI();
+		if (rtaui!=null) {
+			rtaui.installDefaults();
+		}
+
+	}
+
+
+	/**
+	 * Attempt to undo an "action" done in this text area.
+	 *
+	 * @see #redoLastAction()
+	 */
+	public void undoLastAction() {
+		// NOTE: that the try/catch block shouldn't be necessary...
+		try {
+			if (undoManager.canUndo())
+				undoManager.undo();
+		}
+		catch (CannotUndoException cre) {
+			cre.printStackTrace();
+		}
+	}
+
+	/**
+	 * Serializes this text area.
+	 *
+	 * @param s The stream to write to.
+	 * @throws IOException If an IO error occurs.
+	 */
+	private void writeObject(ObjectOutputStream s) throws IOException {
+
+		// UndoManagers cannot be serialized without Exceptions.  See
+		// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4275892
+		getDocument().removeUndoableEditListener(undoManager);
+		s.defaultWriteObject();
+		getDocument().addUndoableEditListener(undoManager);
+
+	}
+
+
+	/**
+	 * Modified from <code>MutableCaretEvent</code> in
+	 * <code>JTextComponent</code> so that mouse events get fired when the user
+	 * is selecting text with the mouse as well.  This class also displays the
+	 * popup menu when the user right-clicks in the text area.
+	 */
+	protected class RTextAreaMutableCaretEvent extends RTAMouseListener {
+
+		protected RTextAreaMutableCaretEvent(RTextArea textArea) {
+			super(textArea);
+		}
+
+		public void focusGained(FocusEvent e) {
+			Caret c = getCaret();
+			boolean enabled = c.getDot()!=c.getMark();
+			cutAction.setEnabled(enabled);
+			copyAction.setEnabled(enabled);
+			undoManager.updateActions(); // To reflect this text area.
+		}
+
+		public void focusLost(FocusEvent e) {
+		}
+
+		public void mouseDragged(MouseEvent e) {
+			if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) != 0) {
+				Caret caret = getCaret();
+				dot = caret.getDot();
+				mark = caret.getMark();
+				fireCaretUpdate(this);
+			}
+		}
+
+		public void mousePressed(MouseEvent e) {
+			// WORKAROUND:  Since JTextComponent only updates the caret
+			// location on mouse clicked and released, we'll do it on dragged
+			// events when the left mouse button is clicked.
+			if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) != 0) {
+				Caret caret = getCaret();
+				dot = caret.getDot();
+				mark = caret.getMark();
+				fireCaretUpdate(this);
+			}
+		}
+
+		public void mouseReleased(MouseEvent e) {
+			if ((e.getModifiers()&MouseEvent.BUTTON3_MASK)!=0)
+				showPopup(e);
+		}
+
+		/**
+		 * Shows a popup menu with cut, copy, paste, etc. options if the
+		 * user clicked the right button.
+		 *
+		 * @param e The mouse event that caused this method to be called.
+		 */
+		private void showPopup(MouseEvent e) {
+			JPopupMenu popupMenu = getPopupMenu();
+			if (popupMenu!=null) {
+				configurePopupMenu(popupMenu);
+				popupMenu.show(e.getComponent(), e.getX(), e.getY());
+			}
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RTextAreaBase.java b/src/org/fife/ui/rtextarea/RTextAreaBase.java
new file mode 100644
index 0000000..e934bda
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RTextAreaBase.java
@@ -0,0 +1,1179 @@
+/*
+ * 04/07/2005
+ *
+ * RTextAreaBase.java - The base class for an RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.AWTEvent;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.Rectangle;
+import java.awt.event.ComponentEvent;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import javax.swing.JTextArea;
+import javax.swing.event.CaretEvent;
+import javax.swing.plaf.ColorUIResource;
+import javax.swing.plaf.TextUI;
+import javax.swing.text.AbstractDocument;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+import javax.swing.text.StyleContext;
+
+
+/**
+ * This is the base class for <code>RTextArea</code>; basically it's just an
+ * extension of <code>javax.swing.JTextArea</code> adding a bunch of properties.
+ * <p>
+ *
+ * This class is only supposed to be overridden by <code>RTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ */
+abstract class RTextAreaBase extends JTextArea {
+
+	public static final String BACKGROUND_IMAGE_PROPERTY			= "background.image";
+	public static final String CURRENT_LINE_HIGHLIGHT_COLOR_PROPERTY	= "RTA.currentLineHighlightColor";
+	public static final String CURRENT_LINE_HIGHLIGHT_FADE_PROPERTY	= "RTA.currentLineHighlightFade";
+	public static final String HIGHLIGHT_CURRENT_LINE_PROPERTY		= "RTA.currentLineHighlight";
+	public static final String ROUNDED_SELECTION_PROPERTY			= "RTA.roundedSelection";
+
+	private boolean tabsEmulatedWithSpaces;		// If true, tabs will be expanded to spaces.
+
+	private boolean highlightCurrentLine;		// If true, the current line is highlighted.
+	private Color currentLineColor;			// The color used to highlight the current line.
+	private boolean marginLineEnabled;			// If true, paint a "margin line."
+	private Color marginLineColor;			// The color used to paint the margin line.
+	private int marginLineX;				// The x-location of the margin line.
+	private int marginSizeInChars;			// How many 'm' widths the margin line is over.
+	private boolean fadeCurrentLineHighlight;	// "Fade effect" for current line highlight.
+	private boolean roundedSelectionEdges;
+	private int previousCaretY;
+int currentCaretY;							// Used to know when to rehighlight current line.
+
+	private BackgroundPainterStrategy backgroundPainter;	// Paints the background.
+
+	private RTAMouseListener mouseListener;
+
+	private static final Color DEFAULT_CARET_COLOR				= new ColorUIResource(255,51,51);
+	private static final Color DEFAULT_CURRENT_LINE_HIGHLIGHT_COLOR	= new Color(255,255,170);
+	private static final Color DEFAULT_MARGIN_LINE_COLOR			= new Color(255,224,224);
+	private static final int DEFAULT_TAB_SIZE					= 4;
+	private static final int DEFAULT_MARGIN_LINE_POSITION			= 80;
+
+
+	/**
+	 * Constructor.
+	 */
+	public RTextAreaBase() {
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param doc The document for the editor.
+	 */
+	public RTextAreaBase(AbstractDocument doc) {
+		super(doc);
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The initial text to display.
+	 */
+	public RTextAreaBase(String text) {
+		super(text);
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RTextAreaBase(int rows, int cols) {
+		super(rows, cols);
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The initial text to display.
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RTextAreaBase(String text, int rows, int cols) {
+		super(text, rows, cols);
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param doc The document for the editor.
+	 * @param text The initial text to display.
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RTextAreaBase(AbstractDocument doc, String text, int rows,
+							int cols) {
+		super(doc, text, rows, cols);
+		init();
+	}
+
+
+	/**
+	 * Adds listeners that listen for changes to the current line, so we can
+	 * update our "current line highlight."  This is needed only because of an
+	 * apparent difference between the JRE 1.4.2 and 1.5.0 (needed on 1.4.2,
+	 * not needed on 1.5.0).
+	 */
+	protected void addCurrentLineHighlightListeners() {
+		boolean add = true;
+		MouseMotionListener[] mouseMotionListeners = getMouseMotionListeners();
+		for (int i=0; i<mouseMotionListeners.length; i++) {
+			if (mouseMotionListeners[i]==mouseListener) {
+				add = false;
+				break;
+			}
+		}
+		if (add==true) {
+			//System.err.println("Adding mouse motion listener!");
+			addMouseMotionListener(mouseListener);
+		}
+		MouseListener[] mouseListeners = getMouseListeners();
+		for (int i=0; i<mouseListeners.length; i++) {
+			if (mouseListeners[i]==mouseListener) {
+				add = false;
+				break;
+			}
+		}
+		if (add==true) {
+			//System.err.println("Adding mouse listener!");
+			addMouseListener(mouseListener);
+		}
+	}
+
+
+	/*
+	 * TODO: Figure out why RTextArea doesn't work with RTL orientation!
+	 */
+//	public void applyComponentOrientation(ComponentOrientation orientation) {
+//		super.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
+//	}
+
+
+	/**
+	 * Converts all instances of a number of spaces equal to a tab size
+	 * into a tab in this text area.
+	 *
+	 * @see #convertTabsToSpaces
+	 * @see #getTabsEmulated
+	 * @see #setTabsEmulated
+	 */
+	public void convertSpacesToTabs() {
+
+		// FIXME:  This is inefficient and will yield an OutOfMemoryError if
+		// done on a large document.  We should scan 1 line at a time and
+		// replace; it'll be slower but safer.
+
+		int caretPosition = getCaretPosition();
+		int tabSize = getTabSize();
+		String tabInSpaces = "";
+		for (int i=0; i<tabSize; i++)
+			tabInSpaces += " ";
+		String text = getText();
+		setText(text.replaceAll(tabInSpaces, "\t"));
+		int newDocumentLength = getDocument().getLength();
+
+		// Place the caret back in its proper position.
+		if (caretPosition<newDocumentLength)
+			setCaretPosition(caretPosition);
+		else
+			setCaretPosition(newDocumentLength-1);
+
+	}
+
+
+	/**
+	 * Converts all instances of a tab into a number of spaces equivalent
+	 * to a tab in this text area.
+	 *
+	 * @see #convertSpacesToTabs
+	 * @see #getTabsEmulated
+	 * @see #setTabsEmulated
+	 */
+	public void convertTabsToSpaces() {
+
+		// FIXME:  This is inefficient and will yield an OutOfMemoryError if
+		// done on a large document.  We should scan 1 line at a time and
+		// replace; it'll be slower but safer.
+
+		int caretPosition = getCaretPosition();
+		int tabSize = getTabSize();
+		StringBuffer tabInSpaces = new StringBuffer();
+		for (int i=0; i<tabSize; i++)
+			tabInSpaces.append(' ');
+		String text = getText();
+		setText(text.replaceAll("\t", tabInSpaces.toString()));
+
+		// Put caret back at same place in document.
+		setCaretPosition(caretPosition);
+
+	}
+
+
+	/**
+	 * Returns the caret event/mouse listener for <code>RTextArea</code>s.
+	 *
+	 * @return The caret event/mouse listener.
+	 */
+	protected abstract RTAMouseListener createMouseListener();
+
+
+	/**
+	 * Returns the a real UI to install on this text component.  Subclasses
+	 * can override this method to return an extended version of
+	 * <code>RTextAreaUI</code>.
+	 *
+	 * @return The UI.
+	 */
+	protected abstract RTextAreaUI createRTextAreaUI();
+
+
+	/**
+	 * Forces the current line highlight to be repainted.  This hack is
+	 * necessary for those situations when the view (appearance) changes
+	 * but the caret's location hasn't (and thus the current line highlight
+	 * coordinates won't get changed).  Examples of this are when
+	 * word wrap is toggled and when syntax styles are changed in an
+	 * <code>RSyntaxTextArea</code>.
+	 */
+	protected void forceCurrentLineHighlightRepaint() {
+		// Check isShowing() to prevent BadLocationException
+		// in constructor if linewrap is set to true.
+		if (isShowing()) {
+			// Changing previousCaretY makes us sure to get a repaint.
+			previousCaretY = -1;
+			// Trick it into checking for the need to repaint by firing
+			// a false caret event.
+			fireCaretUpdate(mouseListener);
+		}
+	}
+
+
+	/**
+	 * Returns the <code>java.awt.Color</code> used as the background color for
+	 * this text area.  If a <code>java.awt.Image</code> image is currently
+	 * being used instead, <code>null</code> is returned.
+	 *
+	 * @return The current background color, or <code>null</code> if an image
+	 *         is currently the background.
+	 */
+	public final Color getBackground() {
+		Object bg = getBackgroundObject();
+		return (bg instanceof Color) ? (Color)bg : null;
+	}
+
+	/**
+	 * Returns the image currently used for the background.
+	 * If the current background is currently a <code>java.awt.Color</code> and
+	 * not a <code>java.awt.Image</code>, then <code>null</code> is returned.
+	 *
+	 * @return A <code>java.awt.Image</code> used for the background, or
+	 *         <code>null</code> if the background is not an image.
+	 * @see #setBackgroundImage
+	 */
+	public final Image getBackgroundImage() {
+		Object bg = getBackgroundObject();
+		return (bg instanceof Image) ? (Image)bg : null;
+	}
+
+
+	/**
+	 * Returns the <code>Object</code> representing the background for all
+	 * documents in this tabbed pane; either a <code>java.awt.Color</code> or a
+	 * <code>java.lang.Image</code> containing the image used as the background
+	 * for this text area.
+	 *
+	 * @return The <code>Object</code> used for the background.
+	 * @see #setBackgroundObject(Object newBackground)
+	 */
+	public final Object getBackgroundObject() {
+		if (backgroundPainter==null)
+			return null;
+		return (backgroundPainter instanceof ImageBackgroundPainterStrategy) ?
+			(Object)((ImageBackgroundPainterStrategy)backgroundPainter).
+					getMasterImage() :
+			(Object)((ColorBackgroundPainterStrategy)backgroundPainter).
+					getColor();
+	}
+
+
+	/**
+	 * Gets the line number that the caret is on.
+	 *
+	 * @return The zero-based line number that the caret is on.
+	 */
+	public final int getCaretLineNumber() {
+		try {
+			return getLineOfOffset(getCaretPosition());
+		} catch (BadLocationException ble) {
+			return 0; // Never happens
+		}
+	}
+
+
+	/**
+	 * Gets the position from the beginning of the current line that the caret
+	 * is on.
+	 *
+	 * @return The zero-based position from the beginning of the current line
+	 *         that the caret is on.
+	 */
+	public final int getCaretOffsetFromLineStart() {
+		try {
+			int pos = getCaretPosition();
+			return pos - getLineStartOffset(getLineOfOffset(pos));
+		} catch (BadLocationException ble) {
+			return 0; // Never happens
+		}
+	}
+
+
+	/**
+	 * Returns the color being used to highlight the current line.  Note that
+	 * if highlighting the current line is turned off, you will not be seeing
+	 * this highlight.
+	 *
+	 * @return The color being used to highlight the current line.
+	 * @see #getHighlightCurrentLine()
+	 * @see #setHighlightCurrentLine(boolean)
+	 * @see #setCurrentLineHighlightColor
+	 */
+	public Color getCurrentLineHighlightColor() {
+		return currentLineColor;
+	}
+
+
+	/**
+	 * Returns the default caret color.
+	 *
+	 * @return The default caret color.
+	 */
+	public static final Color getDefaultCaretColor() {
+		return DEFAULT_CARET_COLOR;
+	}
+
+
+	/**
+	 * Returns the "default" color for highlighting the current line.  Note
+	 * that this color was chosen only because it looks nice (to me) against a
+	 * white background.
+	 *
+	 * @return The default color for highlighting the current line.
+	 */
+	public static final Color getDefaultCurrentLineHighlightColor() {
+		return DEFAULT_CURRENT_LINE_HIGHLIGHT_COLOR;
+	}
+
+
+	/**
+	 * Returns the default font for text areas.
+	 *
+	 * @return The default font.
+	 */
+	public static final Font getDefaultFont() {
+
+		// Use StyleContext to get a composite font for better Asian language
+		// support; see Sun bug S282887.
+		StyleContext sc = StyleContext.getDefaultStyleContext();
+		Font font = null;
+
+		if (isOSX()) {
+			// Snow Leopard (1.6) uses Menlo as default monospaced font,
+			// pre-Snow Leopard used Monaco.
+			font = sc.getFont("Menlo", Font.PLAIN, 12);
+			if (!"Menlo".equals(font.getFamily())) {
+				font = sc.getFont("Monaco", Font.PLAIN, 12);
+				if (!"Monaco".equals(font.getFamily())) { // Shouldn't happen
+					font = sc.getFont("Monospaced", Font.PLAIN, 13);
+				}
+			}
+		}
+		else {
+			// Consolas added in Vista, used by VS2010+.
+			font = sc.getFont("Consolas", Font.PLAIN, 13);
+			if (!"Consolas".equals(font.getFamily())) {
+				font = sc.getFont("Monospaced", Font.PLAIN, 13);
+			}
+		}
+
+		//System.out.println(font.getFamily() + ", " + font.getName());
+		return font;
+
+	}
+
+
+	/**
+	 * Returns the default foreground color for text in this text area.
+	 *
+	 * @return The default foreground color.
+	 */
+	public static final Color getDefaultForeground() {
+		return Color.BLACK;
+	}
+
+
+	/**
+	 * Returns the default color for the margin line.
+	 *
+	 * @return The default margin line color.
+	 * @see #getMarginLineColor()
+	 * @see #setMarginLineColor(Color)
+	 */
+	public static final Color getDefaultMarginLineColor() {
+		return DEFAULT_MARGIN_LINE_COLOR;
+	}
+
+
+	/**
+	 * Returns the default margin line position.
+	 *
+	 * @return The default margin line position.
+	 * @see #getMarginLinePosition
+	 * @see #setMarginLinePosition
+	 */
+	public static final int getDefaultMarginLinePosition() {
+		return DEFAULT_MARGIN_LINE_POSITION;
+	}
+
+
+	/**
+	 * Returns the default tab size, in spaces.
+	 *
+	 * @return The default tab size.
+	 */
+	public static final int getDefaultTabSize() {
+		return DEFAULT_TAB_SIZE;
+	}
+
+
+	/**
+	 * Returns whether the current line highlight is faded.
+	 *
+	 * @return Whether the current line highlight is faded.
+	 * @see #setFadeCurrentLineHighlight
+	 */
+	public boolean getFadeCurrentLineHighlight() {
+		return fadeCurrentLineHighlight;
+	}
+
+
+	/**
+	 * Returns whether or not the current line is highlighted.
+	 *
+	 * @return Whether or the current line is highlighted.
+	 * @see #setHighlightCurrentLine(boolean)
+	 * @see #getCurrentLineHighlightColor
+	 * @see #setCurrentLineHighlightColor
+	 */
+	public boolean getHighlightCurrentLine() {
+		return highlightCurrentLine;
+	}
+
+
+	/**
+	 * Returns the offset of the last character of the line that the caret is
+	 * on.
+	 *
+	 * @return The last offset of the line that the caret is currently on.
+	 */
+	public final int getLineEndOffsetOfCurrentLine() {
+		try {
+			return getLineEndOffset(getCaretLineNumber());
+		} catch (BadLocationException ble) {
+			return 0; // Never happens
+		}
+	}
+
+
+	/**
+	 * Returns the height of a line of text in this text area.
+	 *
+	 * @return The height of a line of text.
+	 */
+	public int getLineHeight() {
+		return getRowHeight();
+	}
+
+
+	/**
+	 * Returns the offset of the first character of the line that the caret is
+	 * on.
+	 *
+	 * @return The first offset of the line that the caret is currently on.
+	 */
+	public final int getLineStartOffsetOfCurrentLine() {
+		try {
+			return getLineStartOffset(getCaretLineNumber());
+		} catch (BadLocationException ble) {
+			return 0; // Never happens
+		}
+	}
+
+
+	/**
+	 * Returns the color used to paint the margin line.
+	 *
+	 * @return The margin line color.
+	 * @see #setMarginLineColor(Color)
+	 */
+	public Color getMarginLineColor() {
+		return marginLineColor;
+	}
+
+
+	/**
+	 * Returns the margin line position (in pixels) from the left-hand side of
+	 * the text area.
+	 *
+	 * @return The margin line position.
+	 * @see #getDefaultMarginLinePosition
+	 * @see #setMarginLinePosition
+	 */
+	public int getMarginLinePixelLocation() {
+		return marginLineX;
+	}
+
+
+	/**
+	 * Returns the margin line position (which is the number of 'm' widths in
+	 * the current font the margin line is over).
+	 *
+	 * @return The margin line position.
+	 * @see #getDefaultMarginLinePosition
+	 * @see #setMarginLinePosition
+	 */
+	public int getMarginLinePosition() {
+		return marginSizeInChars;
+	}
+
+
+	/**
+	 * Returns whether selection edges are rounded in this text area.
+	 *
+	 * @return Whether selection edges are rounded.
+	 * @see #setRoundedSelectionEdges(boolean)
+	 */
+	public boolean getRoundedSelectionEdges() {
+		return roundedSelectionEdges;
+	}
+
+
+	/**
+	 * Returns whether or not tabs are emulated with spaces (i.e., "soft"
+	 * tabs).
+	 *
+	 * @return <code>true</code> if tabs are emulated with spaces;
+	 *         <code>false</code> if they aren't.
+	 * @see #setTabsEmulated
+	 */
+	public boolean getTabsEmulated() {
+		return tabsEmulatedWithSpaces;
+	}
+
+
+	/**
+	 * Initializes this text area.
+	 */
+	private void init() {
+
+		// Sets the UI.  Note that setUI() is overridden in RTextArea to only
+		// update the popup menu; this method must be called to set the real
+		// UI.  This is done because the look and feel of an RTextArea is
+		// independent of the installed Java look and feels.
+		setRTextAreaUI(createRTextAreaUI());
+
+		// So we get notified when the component is resized.
+		enableEvents(AWTEvent.COMPONENT_EVENT_MASK|AWTEvent.KEY_EVENT_MASK);
+
+		// Defaults for various properties.
+		setHighlightCurrentLine(true);
+		setCurrentLineHighlightColor(getDefaultCurrentLineHighlightColor());
+		setMarginLineEnabled(false);
+		setMarginLineColor(getDefaultMarginLineColor());
+		setMarginLinePosition(getDefaultMarginLinePosition());
+		setBackgroundObject(Color.WHITE);
+		setWrapStyleWord(true);// We only support wrapping at word boundaries.
+		setTabSize(5);
+		setForeground(Color.BLACK);
+		setTabsEmulated(false);
+
+		// Stuff needed by the caret listener below.
+		previousCaretY = currentCaretY = getInsets().top;
+
+		// Stuff to highlight the current line.
+		mouseListener = createMouseListener();
+		// Also acts as a focus listener so we can update our shared actions
+		// (cut, copy, etc. on the popup menu).
+		addFocusListener(mouseListener);
+		addCurrentLineHighlightListeners();
+
+	}
+
+
+	/**
+	 * Returns whether or not the margin line is being painted.
+	 *
+	 * @return Whether or not the margin line is being painted.
+	 * @see #setMarginLineEnabled
+	 */
+	public boolean isMarginLineEnabled() {
+		return marginLineEnabled;
+	}
+
+
+	/**
+	 * Returns whether the OS we're running on is OS X.
+	 *
+	 * @return Whether the OS we're running on is OS X.
+	 */
+	public static boolean isOSX() {
+		// Recommended at:
+		// http://developer.apple.com/mac/library/technotes/tn2002/tn2110.html
+		String osName = System.getProperty("os.name").toLowerCase();
+		return osName.startsWith("mac os x");
+	}
+
+
+	/**
+	 * Paints the text area.
+	 *
+	 * @param g The graphics context with which to paint.
+	 */
+	protected void paintComponent(Graphics g) {
+
+		//long startTime = System.currentTimeMillis();
+
+		backgroundPainter.paint(g, getVisibleRect());
+
+		// Paint the main part of the text area.
+		TextUI ui = getUI();
+		if (ui != null) {
+			// Not allowed to modify g, so make a copy.
+			Graphics scratchGraphics = g.create();
+			try {
+				ui.update(scratchGraphics, this);
+			} finally {
+				scratchGraphics.dispose();
+			}
+		}
+
+		//long endTime = System.currentTimeMillis();
+		//System.err.println(endTime-startTime);
+
+	}
+
+
+	/**
+	 * Updates the current line highlight location.
+	 */
+	protected void possiblyUpdateCurrentLineHighlightLocation() {
+
+		int width = getWidth();
+		int lineHeight = getLineHeight();
+		int dot = getCaretPosition();
+
+		// If we're wrapping lines we need to check the actual y-coordinate
+		// of the caret, not just the line number, since a single logical
+		// line can span multiple physical lines.
+		if (getLineWrap()) {
+			try {
+				Rectangle temp = modelToView(dot);
+				if (temp!=null) {
+					currentCaretY = temp.y;
+				}
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Should never happen.
+			}
+		}
+
+		// No line wrap - we can simply check the line number (quicker).
+		else {
+//			Document doc = getDocument();
+//			if (doc!=null) {
+//				Element map = doc.getDefaultRootElement();
+//				int caretLine = map.getElementIndex(dot);
+//				Rectangle alloc = ((RTextAreaUI)getUI()).
+//											getVisibleEditorRect();
+//				if (alloc!=null)
+//					currentCaretY = alloc.y + caretLine*lineHeight;
+//			}
+// Modified for code folding requirements
+try {
+	Rectangle temp = modelToView(dot);
+	if (temp!=null) {
+		currentCaretY = temp.y;
+	}
+} catch (BadLocationException ble) {
+	ble.printStackTrace(); // Should never happen.
+}
+		}
+
+		// Repaint current line (to fill in entire highlight), and old line
+		// (to erase entire old highlight) if necessary.  Always repaint
+		// current line in case selection is added or removed.
+		repaint(0,currentCaretY, width,lineHeight);
+		if (previousCaretY!=currentCaretY) {
+			repaint(0,previousCaretY, width,lineHeight);
+		}
+
+		previousCaretY = currentCaretY;
+
+	}
+
+
+	/**
+	 * Overridden so we can tell when the text area is resized and update the
+	 * current-line highlight, if necessary (i.e., if it is enabled and if
+	 * lineWrap is enabled.
+	 *
+	 * @param e The component event about to be sent to all registered
+	 *        <code>ComponentListener</code>s.
+	 */
+	protected void processComponentEvent(ComponentEvent e) {
+
+		// In line wrap mode, resizing the text area means that the caret's
+		// "line" could change - not to a different logical line, but a
+		// different physical one.  So, here we force a repaint of the current
+		// line's highlight if necessary.
+		if (e.getID()==ComponentEvent.COMPONENT_RESIZED &&
+				getLineWrap()==true && getHighlightCurrentLine()) {
+			previousCaretY = -1;  // So we are sure to repaint.
+			fireCaretUpdate(mouseListener);
+		}
+
+		super.processComponentEvent(e);
+
+	}
+
+
+	/**
+	 * Sets the background color of this text editor.  Note that this is
+	 * equivalent to calling <code>setBackgroundObject(bg)</code>.
+	 *
+	 * NOTE:  the opaque property is set to <code>true</code> when the
+	 * background is set to a color (by this method).  When an image is used
+	 * for the background, opaque is set to false.  This is because
+	 * we perform better when setOpaque is true, but if we use an
+	 * image for the background when opaque is true, we get on-screen
+	 * garbage when the user scrolls via the arrow keys.  Thus we
+	 * need setOpaque to be false in that case.<p>
+	 * You never have to change the opaque property yourself; it is always done
+	 * for you.
+	 *
+	 * @param bg The color to use as the background color.
+	 */
+	public void setBackground(Color bg) {
+		Object oldBG = getBackgroundObject();
+		if (oldBG instanceof Color) { // Just change color of strategy.
+			((ColorBackgroundPainterStrategy)backgroundPainter).
+						setColor(bg);
+		}
+		else { // Was an image painter...
+			backgroundPainter = new ColorBackgroundPainterStrategy(bg);
+		}
+		setOpaque(true);
+		firePropertyChange("background", oldBG, bg);
+		repaint();
+	}
+
+
+	/**
+	 * Sets this image as the background image.  This method fires a
+	 * property change event of type {@link #BACKGROUND_IMAGE_PROPERTY}.<p>
+	 *
+	 * NOTE:  the opaque property is set to <code>true</code> when the
+	 * background is set to a color.  When an image is used for the
+	 * background (by this method), opaque is set to false.  This is because
+	 * we perform better when setOpaque is true, but if we use an
+	 * image for the background when opaque is true, we get on-screen
+	 * garbage when the user scrolls via the arrow keys.  Thus we
+	 * need setOpaque to be false in that case.<p>
+	 * You never have to change the opaque property yourself; it is always done
+	 * for you.
+	 *
+	 * @param image The image to use as this text area's background.
+	 * @see #getBackgroundImage
+	 */
+	public void setBackgroundImage(Image image) {
+		Object oldBG = getBackgroundObject();
+		if (oldBG instanceof Image) { // Just change image being displayed.
+			((BufferedImageBackgroundPainterStrategy)backgroundPainter).
+					setImage(image);
+		}
+		else { // Was a color strategy...
+			BufferedImageBackgroundPainterStrategy strategy =
+				new BufferedImageBackgroundPainterStrategy(this);
+			strategy.setImage(image);
+			backgroundPainter = strategy;
+		}
+		setOpaque(false);
+		firePropertyChange(BACKGROUND_IMAGE_PROPERTY, oldBG, image);
+		repaint();
+	}
+
+
+	/**
+	 * Makes the background into this <code>Object</code>.
+	 *
+	 * @param newBackground The <code>java.awt.Color</code> or
+	 *        <code>java.awt.Image</code> object. If <code>newBackground</code>
+	 *        is not either of these, the background is set to plain white.
+	 */
+	public void setBackgroundObject(Object newBackground) {
+		if (newBackground instanceof Color) {
+			setBackground((Color)newBackground);
+		}
+		else if (newBackground instanceof Image) {
+			setBackgroundImage((Image)newBackground);
+		}
+		else {
+			setBackground(Color.WHITE);
+		}
+
+	}
+
+
+	/*
+	 * TODO: Figure out why RTextArea doesn't work with RTL (e.g. Arabic)
+	 * and fix it!
+	 */
+//	public void setComponentOrientation(ComponentOrientation o) {
+//		if (!o.isLeftToRight()) {
+//			o = ComponentOrientation.LEFT_TO_RIGHT;
+//		}
+//		super.setComponentOrientation(o);
+//	}
+
+
+	/**
+	 * Sets the color to use to highlight the current line.  Note that if
+	 * highlighting the current line is turned off, you will not be able to
+	 * see this highlight.  This method fires a property change of type
+	 * {@link #CURRENT_LINE_HIGHLIGHT_COLOR_PROPERTY}.
+	 *
+	 * @param color The color to use to highlight the current line.
+	 * @throws NullPointerException if <code>color</code> is <code>null</code>.
+	 * @see #getHighlightCurrentLine()
+	 * @see #setHighlightCurrentLine(boolean)
+	 * @see #getCurrentLineHighlightColor
+	 */
+	public void setCurrentLineHighlightColor(Color color) {
+		if (color==null)
+			throw new NullPointerException();
+		if (!color.equals(currentLineColor)) {
+			Color old = currentLineColor;
+			currentLineColor = color;
+			firePropertyChange(CURRENT_LINE_HIGHLIGHT_COLOR_PROPERTY,
+							old, color);
+		}
+	}
+
+
+	/**
+	 * Sets whether the current line highlight should have a "fade" effect.
+	 * This method fires a property change event of type
+	 * <code>CURRENT_LINE_HIGHLIGHT_FADE_PROPERTY</code>.
+	 *
+	 * @param fade Whether the fade effect should be enabled.
+	 * @see #getFadeCurrentLineHighlight
+	 */
+	public void setFadeCurrentLineHighlight(boolean fade) {
+		if (fade!=fadeCurrentLineHighlight) {
+			fadeCurrentLineHighlight = fade;
+			if (getHighlightCurrentLine())
+				forceCurrentLineHighlightRepaint();
+			firePropertyChange(CURRENT_LINE_HIGHLIGHT_FADE_PROPERTY,
+							!fade, fade);
+		}
+	}
+
+
+	/**
+	 * Sets the font for this text area.  This is overridden only so that we
+	 * can update the size of the "current line highlight" and the location of
+	 * the "margin line," if necessary.
+	 *
+	 * @param font The font to use for this text component.
+	 */
+	public void setFont(Font font) {
+		super.setFont(font);
+		updateMarginLineX();
+		if (highlightCurrentLine)
+			possiblyUpdateCurrentLineHighlightLocation();
+	}
+
+
+	/**
+	 * Sets whether or not the current line is highlighted.  This method
+	 * fires a property change of type {@link #HIGHLIGHT_CURRENT_LINE_PROPERTY}.
+	 *
+	 * @param highlight Whether or not to highlight the current line.
+	 * @see #getHighlightCurrentLine()
+	 * @see #getCurrentLineHighlightColor
+	 * @see #setCurrentLineHighlightColor
+	 */
+	public void setHighlightCurrentLine(boolean highlight) {
+		if (highlight!=highlightCurrentLine) {
+			highlightCurrentLine = highlight;
+			firePropertyChange(HIGHLIGHT_CURRENT_LINE_PROPERTY,
+							!highlight, highlight);
+			repaint(); // Repaint entire width of line.
+		}
+	}
+
+
+	/**
+	 * Sets whether or not word wrap is enabled.  This is overridden so that
+	 * the "current line highlight" gets updated if it needs to be.
+	 *
+	 * @param wrap Whether or not word wrap should be enabled.
+	 */
+	public void setLineWrap(boolean wrap) {
+		super.setLineWrap(wrap);
+		forceCurrentLineHighlightRepaint();
+	}
+
+
+	/**
+	 * Sets the color used to paint the margin line.
+	 *
+	 * @param color The new margin line color.
+	 * @see #getDefaultMarginLineColor()
+	 * @see #getMarginLineColor()
+	 */
+	public void setMarginLineColor(Color color) {
+		marginLineColor = color;
+		if (marginLineEnabled) {
+			Rectangle visibleRect = getVisibleRect();
+			repaint(marginLineX,visibleRect.y, 1,visibleRect.height);
+		}
+	}
+
+
+	/**
+	 * Enables or disables the margin line.
+	 *
+	 * @param enabled Whether or not the margin line should be enabled.
+	 * @see #isMarginLineEnabled
+	 */
+	public void setMarginLineEnabled(boolean enabled) {
+		if (enabled!=marginLineEnabled) {
+			marginLineEnabled = enabled;
+			if (marginLineEnabled) {
+				Rectangle visibleRect = getVisibleRect();
+				repaint(marginLineX,visibleRect.y, 1,visibleRect.height);
+			}
+		}
+	}
+
+
+	/**
+	 * Sets the number of 'm' widths the margin line is over.
+	 *
+	 * @param size The margin size.
+	 * #see #getDefaultMarginLinePosition
+	 * @see #getMarginLinePosition
+	 */
+	public void setMarginLinePosition(int size) {
+		marginSizeInChars = size;
+		if (marginLineEnabled) {
+			Rectangle visibleRect = getVisibleRect();
+			repaint(marginLineX,visibleRect.y, 1,visibleRect.height);
+			updateMarginLineX();
+			repaint(marginLineX,visibleRect.y, 1,visibleRect.height);
+		}
+	}
+
+
+	/**
+	 * Sets whether the edges of selections are rounded in this text area.
+	 * This method fires a property change of type
+	 * {@link #ROUNDED_SELECTION_PROPERTY}.
+	 *
+	 * @param rounded Whether selection edges should be rounded.
+	 * @see #getRoundedSelectionEdges()
+	 */
+	public void setRoundedSelectionEdges(boolean rounded) {
+		if (roundedSelectionEdges!=rounded) {
+			roundedSelectionEdges = rounded;
+			Caret c = getCaret();
+			if (c instanceof ConfigurableCaret) {
+				((ConfigurableCaret)c).setRoundedSelectionEdges(rounded);
+				if (c.getDot()!=c.getMark()) { // e.g., there's is a selection
+					repaint();
+				}
+			}
+			firePropertyChange(ROUNDED_SELECTION_PROPERTY, !rounded,
+											rounded);
+		}
+	}
+
+
+	/**
+	 * Sets the UI for this <code>RTextArea</code>.  Note that, for instances
+	 * of <code>RTextArea</code>, <code>setUI</code> only updates the popup
+	 * menu; this is because <code>RTextArea</code>s' look and feels are
+	 * independent of the Java Look and Feel.  This method is here so
+	 * subclasses can set a UI (subclass of <code>RTextAreaUI</code>) if they
+	 * have to.
+	 *
+	 * @param ui The new UI.
+	 * @see #setUI
+	 */
+	protected void setRTextAreaUI(RTextAreaUI ui) {
+
+		super.setUI(ui);
+
+		// Workaround as setUI makes the text area opaque, even if we don't
+		// want it to be.
+		setOpaque(getBackgroundObject() instanceof Color);
+
+	}
+
+
+	/**
+	 * Changes whether or not tabs should be emulated with spaces (i.e., soft
+	 * tabs).  Note that this affects all tabs inserted AFTER this call, not
+	 * tabs already in the document.  For that, see
+	 * {@link #convertTabsToSpaces} and {@link #convertSpacesToTabs}.
+	 *
+	 * @param areEmulated Whether or not tabs should be emulated with spaces.
+	 * @see #convertSpacesToTabs
+	 * @see #convertTabsToSpaces
+	 * @see #getTabsEmulated
+	 */
+	public void setTabsEmulated(boolean areEmulated) {
+		tabsEmulatedWithSpaces = areEmulated;
+	}
+
+
+	/**
+	 * Workaround, since in JDK1.4 it appears that <code>setTabSize()</code>
+	 * doesn't work for a <code>JTextArea</code> unless you use the constructor
+	 * specifying the number of rows and columns...<p>
+	 * Sets the number of characters to expand tabs to. This will be multiplied
+	 * by the maximum advance for variable width fonts. A PropertyChange event
+	 * ("tabSize") is fired when the tab size changes.
+	 *
+	 * @param size Number of characters to expand to.
+	 */
+	public void setTabSize(int size) {
+		super.setTabSize(size);
+		boolean b = getLineWrap();
+		setLineWrap(!b);
+		setLineWrap(b);
+	}
+
+
+	/**
+	 * This is here so subclasses such as <code>RSyntaxTextArea</code> that
+	 * have multiple fonts can define exactly what it means, for example, for
+	 * the margin line to be "80 characters" over.
+	 */
+	protected void updateMarginLineX() {
+		marginLineX = getFontMetrics(getFont()).charWidth('m') *
+												marginSizeInChars;
+	}
+
+
+	/**
+	 * Returns the y-coordinate of the specified line.
+	 *
+	 * @param line The line number.
+	 * @return The y-coordinate of the top of the line, or <code>-1</code> if
+	 *         this text area doesn't yet have a positive size or the line is
+	 *         hidden (i.e. from folding).
+	 * @throws BadLocationException If <code>line</code> isn't a valid line
+	 *         number for this document.
+	 */
+	public int yForLine(int line) throws BadLocationException {
+		return ((RTextAreaUI)getUI()).yForLine(line);
+	}
+
+
+	/**
+	 * Returns the y-coordinate of the line containing an offset.
+	 *
+	 * @param offs The offset info the document.
+	 * @return The y-coordinate of the top of the offset, or <code>-1</code> if
+	 *         this text area doesn't yet have a positive size or the line is
+	 *         hidden (i.e. from folding).
+	 * @throws BadLocationException If <code>offs</code> isn't a valid offset
+	 *         into the document.
+	 */
+	public int yForLineContaining(int offs) throws BadLocationException {
+		return ((RTextAreaUI)getUI()).yForLineContaining(offs);
+	}
+
+
+	protected class RTAMouseListener extends CaretEvent implements
+					MouseListener, MouseMotionListener, FocusListener {
+
+		RTAMouseListener(RTextAreaBase textArea) {
+			super(textArea);
+		}
+
+		public void focusGained(FocusEvent e) {}
+		public void focusLost(FocusEvent e) {}
+		public void mouseDragged(MouseEvent e) {}
+		public void mouseMoved(MouseEvent e) {}
+		public void mouseClicked(MouseEvent e) {}
+		public void mousePressed(MouseEvent e) {}
+		public void mouseReleased(MouseEvent e) {}
+		public void mouseEntered(MouseEvent e) {}
+		public void mouseExited(MouseEvent e) {}
+
+		public int getDot() {
+			return dot;
+		}
+
+		public int getMark() {
+			return mark;
+		}
+
+		protected int dot;
+		protected int mark;
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RTextAreaEditorKit.java b/src/org/fife/ui/rtextarea/RTextAreaEditorKit.java
new file mode 100644
index 0000000..526fcc5
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RTextAreaEditorKit.java
@@ -0,0 +1,2582 @@
+/*
+ * 08/13/2004
+ *
+ * RTextAreaEditorKit.java - The editor kit used by RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.io.*;
+import java.text.BreakIterator;
+import java.text.DateFormat;
+import java.util.Date;
+import javax.swing.*;
+import javax.swing.text.*;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
+
+
+/**
+ * An extension of <code>DefaultEditorKit</code> that adds functionality found
+ * in <code>RTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+// FIXME:  Replace Utilities calls with custom versions (in RSyntaxUtilities) to
+// cut down on all of the modelToViews, as each call causes
+// a getTokenList => expensive!
+public class RTextAreaEditorKit extends DefaultEditorKit {
+
+	/**
+	 * The name of the action that begins recording a macro.
+	 */
+	public static final String rtaBeginRecordingMacroAction	= "RTA.BeginRecordingMacroAction";
+
+	/**
+	 * The name of the action to decrease the font size.
+	 */
+	public static final String rtaDecreaseFontSizeAction		= "RTA.DecreaseFontSizeAction";
+
+	/**
+	 * The name of the action that deletes the current line.
+	 */
+	public static final String rtaDeleteLineAction			= "RTA.DeleteLineAction";
+
+	/**
+	 * The name of the action to delete the word before the caret.
+	 */
+	public static final String rtaDeletePrevWordAction		= "RTA.DeletePrevWordAction";
+
+	/**
+	 * The name of the action taken to delete the remainder of the line (from
+	 * the caret position to the end of the line).
+	 */
+	public static final String rtaDeleteRestOfLineAction		= "RTA.DeleteRestOfLineAction";
+
+	/**
+	 * The name of the action that completes the word at the caret position
+	 * with the last word in the document that starts with the text up to the
+	 * caret.
+	 */
+	public static final String rtaDumbCompleteWordAction		= "RTA.DumbCompleteWordAction";
+
+	/**
+	 * The name of the action that ends recording a macro.
+	 */
+	public static final String rtaEndRecordingMacroAction		= "RTA.EndRecordingMacroAction";
+
+	/**
+	 * The name of the action to increase the font size.
+	 */
+	public static final String rtaIncreaseFontSizeAction		= "RTA.IncreaseFontSizeAction";
+
+	/**
+	 * The name of the action that inverts the case of the current selection.
+	 */
+	public static final String rtaInvertSelectionCaseAction	= "RTA.InvertCaseAction";
+
+	/**
+	 * The name of the action to join two lines.
+	 */
+	public static final String rtaJoinLinesAction			= "RTA.JoinLinesAction";
+
+	/**
+	 * Action to move a line down.
+	 */
+	public static final String rtaLineDownAction				= "RTA.LineDownAction";
+
+	/**
+	 * Action to move a line up.
+	 */
+	public static final String rtaLineUpAction				= "RTA.LineUpAction";
+
+	/**
+	 * The name of the action to make the current selection lower-case.
+	 */
+	public static final String rtaLowerSelectionCaseAction		= "RTA.LowerCaseAction";
+
+	/**
+	 * Action to select the next occurrence of the selected text.
+	 */
+	public static final String rtaNextOccurrenceAction		= "RTA.NextOccurrenceAction";
+
+	/**
+     * Action to select the previous occurrence of the selected text.
+	 */
+	public static final String rtaPrevOccurrenceAction		= "RTA.PrevOccurrenceAction";
+
+	/**
+	 * Action to jump to the next bookmark.
+	 */
+	public static final String rtaNextBookmarkAction		= "RTA.NextBookmarkAction";
+
+	/**
+	 * Action to jump to the previous bookmark.
+	 */
+	public static final String rtaPrevBookmarkAction		= "RTA.PrevBookmarkAction";
+
+	/**
+	 * The name of the action that "plays back" the last macro.
+	 */
+	public static final String rtaPlaybackLastMacroAction		= "RTA.PlaybackLastMacroAction";
+
+	/**
+	 * The name of the action for "redoing" the last action undone.
+	 */
+	public static final String rtaRedoAction				= "RTA.RedoAction";
+
+	/**
+	 * The name of the action to scroll the text area down one line
+	 * without changing the caret's position.
+	 */
+	public static final String rtaScrollDownAction			= "RTA.ScrollDownAction";
+
+	/**
+	 * The name of the action to scroll the text area up one line
+	 * without changing the caret's position.
+	 */
+	public static final String rtaScrollUpAction				= "RTA.ScrollUpAction";
+
+	/**
+	 * The name of the action for "paging up" with the selection.
+	 */
+	public static final String rtaSelectionPageUpAction		= "RTA.SelectionPageUpAction";
+
+	/**
+	 * The name of the action for "paging down" with the selection.
+	 */
+	public static final String rtaSelectionPageDownAction		= "RTA.SelectionPageDownAction";
+
+	/**
+	 * The name of the action for "paging left" with the selection.
+	 */
+	public static final String rtaSelectionPageLeftAction		= "RTA.SelectionPageLeftAction";
+
+	/**
+	 * The name of the action for "paging right" with the selection.
+	 */
+	public static final String rtaSelectionPageRightAction		= "RTA.SelectionPageRightAction";
+
+	/**
+	 * The name of the action for inserting a time/date stamp.
+	 */
+	public static final String rtaTimeDateAction				= "RTA.TimeDateAction";
+
+	/**
+	 * Toggles whether the current line has a bookmark, if this text area
+	 * is in an {@link RTextScrollPane}.
+	 */
+	public static final String rtaToggleBookmarkAction		= "RTA.ToggleBookmarkAction";
+
+	/**
+	 * The name of the action taken when the user hits the Insert key (thus
+	 * toggling between insert and overwrite modes).
+	 */
+	public static final String rtaToggleTextModeAction		= "RTA.ToggleTextModeAction";
+
+	/**
+	 * The name of the action for "undoing" the last action done.
+	 */
+	public static final String rtaUndoAction				= "RTA.UndoAction";
+
+	/**
+	 * The name of the action for unselecting any selected text in the text
+	 * area.
+	 */
+	public static final String rtaUnselectAction				= "RTA.UnselectAction";
+
+	/**
+	 * The name of the action for making the current selection upper-case.
+	 */
+	public static final String rtaUpperSelectionCaseAction		= "RTA.UpperCaseAction";
+
+	/**
+	 * The actions that <code>RTextAreaEditorKit</code> adds to those of
+	 * the default editor kit.
+	 */
+	private static final RecordableTextAction[] defaultActions = {
+		new BeginAction(beginAction, false), 
+		new BeginAction(selectionBeginAction, true), 
+		new BeginLineAction(beginLineAction, false),  
+		new BeginLineAction(selectionBeginLineAction, true),  
+		new BeginRecordingMacroAction(),
+		new BeginWordAction(beginWordAction, false),
+		new BeginWordAction(selectionBeginWordAction, true),
+		new CopyAction(),
+		new CutAction(),
+		new DefaultKeyTypedAction(),
+		new DeleteLineAction(),
+		new DeleteNextCharAction(),
+		new DeletePrevCharAction(),
+		new DeletePrevWordAction(),
+		new DeleteRestOfLineAction(),
+		new DumbCompleteWordAction(),
+		new EndAction(endAction, false),
+		new EndAction(selectionEndAction, true),
+		new EndLineAction(endLineAction, false),
+		new EndLineAction(selectionEndLineAction, true),
+		new EndRecordingMacroAction(),
+		new EndWordAction(endWordAction, false),
+		new EndWordAction(endWordAction, true),
+		new InsertBreakAction(),
+		new InsertContentAction(),
+		new InsertTabAction(),
+		new InvertSelectionCaseAction(),
+		new JoinLinesAction(),
+		new LowerSelectionCaseAction(),
+		new LineMoveAction(rtaLineUpAction, -1),
+		new LineMoveAction(rtaLineDownAction, 1),
+		new NextBookmarkAction(rtaNextBookmarkAction, true),
+		new NextBookmarkAction(rtaPrevBookmarkAction, false),
+		new NextVisualPositionAction(forwardAction, false, SwingConstants.EAST),
+		new NextVisualPositionAction(backwardAction, false, SwingConstants.WEST),
+		new NextVisualPositionAction(selectionForwardAction, true, SwingConstants.EAST),
+		new NextVisualPositionAction(selectionBackwardAction, true, SwingConstants.WEST),
+		new NextVisualPositionAction(upAction, false, SwingConstants.NORTH),
+		new NextVisualPositionAction(downAction, false, SwingConstants.SOUTH),
+		new NextVisualPositionAction(selectionUpAction, true, SwingConstants.NORTH),
+		new NextVisualPositionAction(selectionDownAction, true, SwingConstants.SOUTH),
+        new NextOccurrenceAction(rtaNextOccurrenceAction),
+        new PreviousOccurrenceAction(rtaPrevOccurrenceAction),
+		new NextWordAction(nextWordAction, false),
+		new NextWordAction(selectionNextWordAction, true),
+		new PageAction(rtaSelectionPageLeftAction, true, true), 
+		new PageAction(rtaSelectionPageRightAction, false, true),
+		new PasteAction(),
+		new PlaybackLastMacroAction(),
+		new PreviousWordAction(previousWordAction, false),  
+		new PreviousWordAction(selectionPreviousWordAction, true),
+		new RedoAction(),
+		new ScrollAction(rtaScrollUpAction, -1),
+		new ScrollAction(rtaScrollDownAction, 1),
+		new SelectAllAction(),
+		new SelectLineAction(),
+		new SelectWordAction(),
+		new SetReadOnlyAction(),
+		new SetWritableAction(),
+		new ToggleBookmarkAction(),
+		new ToggleTextModeAction(),
+		new UndoAction(),
+		new UnselectAction(),
+		new UpperSelectionCaseAction(),
+		new VerticalPageAction(pageUpAction, -1, false), 
+		new VerticalPageAction(pageDownAction, 1, false),
+		new VerticalPageAction(rtaSelectionPageUpAction, -1, true), 
+		new VerticalPageAction(rtaSelectionPageDownAction, 1, true)
+	};
+
+	/**
+	 * The amount of characters read at a time when reading a file.
+	 */
+	private static final int READBUFFER_SIZE	= 32768;
+
+
+	/**
+	 * Constructor.
+	 */
+	public RTextAreaEditorKit() {
+		super();
+	}
+
+
+	/**
+	 * Creates an icon row header to use in the gutter for a text area.
+	 *
+	 * @param textArea The text area.
+	 * @return The icon row header.
+	 */
+	public IconRowHeader createIconRowHeader(RTextArea textArea) {
+		return new IconRowHeader(textArea);
+	}
+
+
+	/**
+	 * Creates a line number list to use in the gutter for a text area.
+	 *
+	 * @param textArea The text area.
+	 * @return The line number list.
+	 */
+	public LineNumberList createLineNumberList(RTextArea textArea) {
+		return new LineNumberList(textArea);
+	}
+
+
+	/**
+	 * Fetches the set of commands that can be used
+	 * on a text component that is using a model and
+	 * view produced by this kit.
+	 *
+	 * @return the command list
+	 */ 
+	public Action[] getActions() {
+		return defaultActions;
+	}
+
+
+	/**
+	 * Inserts content from the given stream, which will be 
+	 * treated as plain text.  This method is overridden merely
+	 * so we can increase the number of characters read at a time.
+	 * 
+	 * @param in  The stream to read from
+	 * @param doc The destination for the insertion.
+	 * @param pos The location in the document to place the
+	 *   content >= 0.
+	 * @exception IOException on any I/O error
+	 * @exception BadLocationException if pos represents an invalid
+	 *   location within the document.
+	*/
+	public void read(Reader in, Document doc, int pos) 
+				throws IOException, BadLocationException {
+
+		char[] buff = new char[READBUFFER_SIZE];
+		int nch;
+		boolean lastWasCR = false;
+		boolean isCRLF = false;
+		boolean isCR = false;
+		int last;
+		boolean wasEmpty = (doc.getLength() == 0);
+
+		// Read in a block at a time, mapping \r\n to \n, as well as single
+		// \r's to \n's. If a \r\n is encountered, \r\n will be set as the
+		// newline string for the document, if \r is encountered it will
+		// be set as the newline character, otherwise the newline property
+		// for the document will be removed.
+		while ((nch = in.read(buff, 0, buff.length)) != -1) {
+			last = 0;
+			for (int counter = 0; counter < nch; counter++) {
+				switch (buff[counter]) {
+					case '\r':
+						if (lastWasCR) {
+							isCR = true;
+							if (counter == 0) {
+								doc.insertString(pos, "\n", null);
+								pos++;
+							}
+							else {
+								buff[counter - 1] = '\n';
+							}
+						}
+						else {
+							lastWasCR = true;
+						}
+						break;
+					case '\n':
+						if (lastWasCR) {
+							if (counter > (last + 1)) {
+								doc.insertString(pos, new String(buff, last,
+												counter - last - 1), null);
+								pos += (counter - last - 1);
+							}
+							// else nothing to do, can skip \r, next write will
+							// write \n
+							lastWasCR = false;
+							last = counter;
+							isCRLF = true;
+						}
+						break;
+					default:
+						if (lastWasCR) {
+							isCR = true;
+							if (counter == 0) {
+								doc.insertString(pos, "\n", null);
+								pos++;
+							}
+							else {
+								buff[counter - 1] = '\n';
+							}
+							lastWasCR = false;
+						}
+						break;
+				} // End of switch (buff[counter]).
+			} // End of for (int counter = 0; counter < nch; counter++).
+
+			if (last < nch) {
+				if(lastWasCR) {
+					if (last < (nch - 1)) {
+						doc.insertString(pos, new String(buff, last,
+										nch - last - 1), null);
+						pos += (nch - last - 1);
+					}
+				}
+				else {
+					doc.insertString(pos, new String(buff, last,
+									nch - last), null);
+					pos += (nch - last);
+				}
+			}
+
+		} // End of while ((nch = in.read(buff, 0, buff.length)) != -1).
+
+		if (lastWasCR) {
+			doc.insertString(pos, "\n", null);
+			isCR = true;
+		}
+
+		if (wasEmpty) {
+			if (isCRLF) {
+				doc.putProperty(EndOfLineStringProperty, "\r\n");
+			}
+			else if (isCR) {
+				doc.putProperty(EndOfLineStringProperty, "\r");
+			}
+			else {
+				doc.putProperty(EndOfLineStringProperty, "\n");
+			}
+		}
+
+	}
+
+
+	/**
+	 * Creates a beep.
+	 */
+	public static class BeepAction extends RecordableTextAction {
+
+		public BeepAction() {
+			super(beepAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+		}
+
+		public final String getMacroID() {
+			return beepAction;
+		}
+
+	}
+
+
+	/**
+	 * Moves the caret to the beginning of the document.
+	 */
+	public static class BeginAction extends RecordableTextAction {
+
+ 		private boolean select;
+
+		public BeginAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (select)
+				textArea.moveCaretPosition(0);
+			else
+				textArea.setCaretPosition(0);
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Toggles the position of the caret between the beginning of the line,
+	 * and the first non-whitespace character on the line.
+	 */
+	public static class BeginLineAction extends RecordableTextAction {
+
+ 		private Segment currentLine = new Segment(); // For speed.
+ 		private boolean select;
+
+		public BeginLineAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			int newPos = 0;
+
+			try {
+
+				// Is line wrap enabled?
+				if (textArea.getLineWrap()) {
+					int offs = textArea.getCaretPosition();
+					// TODO:  Replace Utilities call with custom version
+					// to cut down on all of the modelToViews, as each call
+					// causes TokenList => expensive!
+					int begOffs = Utilities.getRowStart(textArea, offs);
+					// TODO: line wrap doesn't currently toggle between
+					// the first non-whitespace char and the actual start
+					// of the line line the no-line-wrap version does.
+					newPos = begOffs;
+				}
+
+				// No line wrap - optimized for performance!
+				else {
+
+					// We use the elements instead of calling
+					// getLineOfOffset(), etc. to speed things up just a
+					// tad (i.e. micro-optimize).
+					int caretPosition = textArea.getCaretPosition();
+					Document document = textArea.getDocument();
+					Element map = document.getDefaultRootElement();
+					int currentLineNum = map.getElementIndex(caretPosition);
+					Element currentLineElement = map.getElement(currentLineNum);
+					int currentLineStart = currentLineElement.getStartOffset();
+					int currentLineEnd = currentLineElement.getEndOffset();
+					int count = currentLineEnd - currentLineStart;
+					if (count>0) { // If there are chars in the line...
+						document.getText(currentLineStart, count, currentLine);
+						int firstNonWhitespace = getFirstNonWhitespacePos();
+						firstNonWhitespace = currentLineStart +
+								(firstNonWhitespace - currentLine.offset);
+						if (caretPosition!=firstNonWhitespace) {
+							newPos = firstNonWhitespace;
+						}
+						else {
+							newPos = currentLineStart;
+						}
+					}
+					else { // Empty line (at end of the document only).
+						newPos = currentLineStart;
+					}
+
+				}
+
+				if (select) {
+					textArea.moveCaretPosition(newPos);
+				}
+				else {
+					textArea.setCaretPosition(newPos);
+				}
+				//e.consume();
+
+			} catch (BadLocationException ble) {
+				/* Shouldn't ever happen. */
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				ble.printStackTrace();
+			}
+
+		}
+
+		private final int getFirstNonWhitespacePos() {
+			int offset = currentLine.offset;
+			int end = offset + currentLine.count - 1;
+			int pos = offset;
+			char[] array = currentLine.array;
+			char currentChar = array[pos];
+			while ((currentChar=='\t' || currentChar==' ') && (++pos<end))
+				currentChar = array[pos];
+			return pos;
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action that begins recording a macro.
+	 */
+	public static class BeginRecordingMacroAction extends RecordableTextAction {
+
+ 
+		public BeginRecordingMacroAction() {
+			super(rtaBeginRecordingMacroAction);
+		}
+
+		public BeginRecordingMacroAction(String name, Icon icon,
+					String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RTextArea.beginRecordingMacro();
+		}
+
+		public boolean isRecordable() {
+			return false; // Never record the recording of a macro!
+		}
+
+		public final String getMacroID() {
+			return rtaBeginRecordingMacroAction;
+		}
+
+	}
+
+
+	/**
+	 * Positions the caret at the beginning of the word.
+	 */
+	protected static class BeginWordAction extends RecordableTextAction {
+
+ 		private boolean select;
+
+		protected BeginWordAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			try {
+				int offs = textArea.getCaretPosition();
+				int begOffs = getWordStart(textArea, offs);
+				if (select)
+					textArea.moveCaretPosition(begOffs);
+				else
+					textArea.setCaretPosition(begOffs);
+			} catch (BadLocationException ble) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+		protected int getWordStart(RTextArea textArea, int offs)
+										throws BadLocationException {
+			return Utilities.getWordStart(textArea, offs);
+		}
+
+	}
+
+
+	/**
+	 * Action for copying text.
+	 */
+	public static class CopyAction extends RecordableTextAction {
+
+ 
+		public CopyAction() {
+			super(DefaultEditorKit.copyAction);
+		}
+
+		public CopyAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			textArea.copy();
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.copyAction;
+		}
+
+	}
+
+
+	/**
+	 * Action for cutting text.
+	 */
+	public static class CutAction extends RecordableTextAction {
+
+		public CutAction() {
+			super(DefaultEditorKit.cutAction);
+		}
+
+		public CutAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			textArea.cut();
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.cutAction;
+		}
+
+	}
+
+
+	/**
+	 * Action for decreasing the font size.
+	 */
+	public static class DecreaseFontSizeAction extends RecordableTextAction {
+
+ 
+		protected float decreaseAmount;
+
+		protected static final float MINIMUM_SIZE	= 2.0f;
+
+		public DecreaseFontSizeAction() {
+			super(rtaDecreaseFontSizeAction);
+			initialize();
+		}
+
+		public DecreaseFontSizeAction(String name, Icon icon, String desc,
+							Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+			initialize();
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			Font font = textArea.getFont();
+			float oldSize = font.getSize2D();
+			float newSize = oldSize - decreaseAmount;
+			if (newSize>=MINIMUM_SIZE) {
+				// Shrink by decreaseAmount.
+				font = font.deriveFont(newSize);
+				textArea.setFont(font);
+			}
+			else if (oldSize>MINIMUM_SIZE) {
+				// Can't shrink by full decreaseAmount, but can shrink a
+				// little bit.
+				font = font.deriveFont(MINIMUM_SIZE);
+				textArea.setFont(font);
+			}
+			else {
+				// Our font size must be at or below MINIMUM_SIZE.
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return rtaDecreaseFontSizeAction;
+		}
+
+		protected void initialize() {
+			decreaseAmount = 1.0f;
+		}
+
+	}
+
+
+	/**
+	 * The action to use when no actions in the input/action map meet the key
+	 * pressed.  This is actually called from the keymap I believe.
+	 */
+	public static class DefaultKeyTypedAction extends RecordableTextAction {
+
+		private Action delegate;
+
+		public DefaultKeyTypedAction() {
+			super(DefaultEditorKit.defaultKeyTypedAction, null, null, null,
+					null);
+			delegate = new DefaultEditorKit.DefaultKeyTypedAction();
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			// DefaultKeyTypedAction *is* different across different JVM's
+			// (at least the OSX implementation must be different - Alt+Numbers
+			// inputs symbols such as '[', '{', etc., which is a *required*
+			// feature on MacBooks running with non-English input, such as
+			// German or Swedish Pro).  So we can't just copy the
+			// implementation, we must delegate to it.
+			delegate.actionPerformed(e);
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.defaultKeyTypedAction;
+		}
+
+	}
+
+
+	/**
+	 * Deletes the current line(s).
+	 */
+	public static class DeleteLineAction extends RecordableTextAction {
+
+		public DeleteLineAction() {
+			super(RTextAreaEditorKit.rtaDeleteLineAction, null, null, null,
+						null);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			int selStart = textArea.getSelectionStart();
+			int selEnd   = textArea.getSelectionEnd();
+
+			try {
+
+				int line1     = textArea.getLineOfOffset(selStart);
+				int startOffs = textArea.getLineStartOffset(line1);
+				int line2     = textArea.getLineOfOffset(selEnd);
+				int endOffs   = textArea.getLineEndOffset(line2);
+
+				// Don't remove the last line if no actual chars are selected
+				if (line2>line1) {
+					if (selEnd==textArea.getLineStartOffset(line2)) {
+						endOffs = selEnd;
+					}
+				}
+
+				textArea.replaceRange(null, startOffs, endOffs);
+
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Never happens
+			}
+
+		}
+
+		public final String getMacroID() {
+			return RTextAreaEditorKit.rtaDeleteLineAction;
+		}
+
+	}
+
+
+	/**
+	 * Deletes the character of content that follows the current caret
+	 * position.
+	 */
+	public static class DeleteNextCharAction extends RecordableTextAction {
+
+		public DeleteNextCharAction() {
+			super(DefaultEditorKit.deleteNextCharAction, null, null,
+												null, null);
+		}
+
+		public DeleteNextCharAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			boolean beep = true;
+			if ((textArea != null) && (textArea.isEditable())) {
+				try {
+					Document doc = textArea.getDocument();
+					Caret caret = textArea.getCaret();
+					int dot = caret.getDot();
+					int mark = caret.getMark();
+					if (dot != mark) {
+						doc.remove(Math.min(dot, mark), Math.abs(dot - mark));
+						beep = false;
+					}
+					else if (dot < doc.getLength()) {
+						int delChars = 1;
+						if (dot < doc.getLength() - 1) {
+							String dotChars = doc.getText(dot, 2);
+							char c0 = dotChars.charAt(0);
+							char c1 = dotChars.charAt(1);
+							if (c0 >= '\uD800' && c0 <= '\uDBFF' &&
+								c1 >= '\uDC00' && c1 <= '\uDFFF') {
+								delChars = 2;
+							}
+						}
+						doc.remove(dot, delChars);
+						beep = false;
+					}
+				} catch (BadLocationException bl) {
+				}
+			}
+
+			if (beep)
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+
+			textArea.requestFocusInWindow();
+
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.deleteNextCharAction;
+		}
+
+	}
+
+
+	/**
+	 * Deletes the character of content that precedes the current caret
+	 * position.
+	 */
+	public static class DeletePrevCharAction extends RecordableTextAction {
+ 
+		public DeletePrevCharAction() {
+			super(deletePrevCharAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			boolean beep = true;
+			if ((textArea != null) && (textArea.isEditable())) {
+				try {
+					Document doc = textArea.getDocument();
+					Caret caret = textArea.getCaret();
+					int dot = caret.getDot();
+					int mark = caret.getMark();
+					if (dot != mark) {
+						doc.remove(Math.min(dot, mark), Math.abs(dot - mark));
+						beep = false;
+					}
+					else if (dot > 0) {
+						int delChars = 1;
+						if (dot > 1) {
+							String dotChars = doc.getText(dot - 2, 2);
+							char c0 = dotChars.charAt(0);
+							char c1 = dotChars.charAt(1);
+							if (c0 >= '\uD800' && c0 <= '\uDBFF' &&
+								c1 >= '\uDC00' && c1 <= '\uDFFF') {
+								delChars = 2;
+							}
+						}
+						doc.remove(dot - delChars, delChars);
+						beep = false;
+					}
+				} catch (BadLocationException bl) {
+				}
+			}
+
+			if (beep)
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.deletePrevCharAction;
+		}
+
+	}
+
+
+	/**
+	 * Action that deletes the previous word in the text area.
+	 */
+	public static class DeletePrevWordAction extends RecordableTextAction {
+
+		public DeletePrevWordAction() {
+			super(rtaDeletePrevWordAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			try {
+				int end = textArea.getSelectionStart();
+				int start = getPreviousWordStart(textArea, end);
+				if (end>start) {
+					textArea.getDocument().remove(start, end-start);
+				}
+			} catch (BadLocationException ex) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+		}
+
+		public String getMacroID() {
+			return rtaDeletePrevWordAction;
+		}
+
+		/**
+		 * Returns the starting offset to delete.  Exists so subclasses can
+		 * override.
+		 */
+		protected int getPreviousWordStart(RTextArea textArea, int end)
+				throws BadLocationException {
+			return Utilities.getPreviousWord(textArea, end);
+		}
+
+	}
+
+
+	/**
+	 * Action that deletes all text from the caret position to the end of the
+	 * caret's line.
+	 */
+	public static class DeleteRestOfLineAction extends RecordableTextAction {
+
+ 
+		public DeleteRestOfLineAction() {
+			super(rtaDeleteRestOfLineAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			try {
+
+				// We use the elements instead of calling getLineOfOffset(),
+				// etc. to speed things up just a tad (i.e. micro-optimize).
+				Document document = textArea.getDocument();
+				int caretPosition = textArea.getCaretPosition();
+				Element map = document.getDefaultRootElement();
+				int currentLineNum = map.getElementIndex(caretPosition);
+				Element currentLineElement = map.getElement(currentLineNum);
+				// Always take -1 as we don't want to remove the newline.
+				int currentLineEnd = currentLineElement.getEndOffset()-1;
+				if (caretPosition<currentLineEnd) {
+					document.remove(caretPosition,
+									currentLineEnd-caretPosition);
+				}
+
+			} catch (BadLocationException ble) {
+				ble.printStackTrace();
+			}
+
+		}
+
+		public final String getMacroID() {
+			return rtaDeleteRestOfLineAction;
+		}
+
+	}
+
+
+	/**
+	 * Finds the most recent word in the document that matches the "word" up
+	 * to the current caret position, and auto-completes the rest.  Repeatedly
+	 * calling this action at the same location in the document goes one
+	 * match back each time it is called.
+	 */
+	public static class DumbCompleteWordAction extends RecordableTextAction {
+
+		private int lastWordStart;
+		private int lastDot;
+		private int searchOffs;
+		private String lastPrefix;
+
+		public DumbCompleteWordAction() {
+			super(rtaDumbCompleteWordAction);
+			lastWordStart = searchOffs = lastDot = -1;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				return;
+			}
+
+			try {
+
+				int dot = textArea.getCaretPosition();
+				if (dot == 0) {
+					return;
+				}
+
+				int curWordStart = Utilities.getWordStart(textArea, dot - 1);
+
+				if (lastWordStart!=curWordStart || dot!=lastDot) {
+					lastPrefix = textArea.getText(curWordStart,dot-curWordStart);
+					// Utilities.getWordStart() treats spans of whitespace and
+					// single non-letter chars as "words."
+					if (lastPrefix.length()==0 ||
+							!Character.isLetter(lastPrefix.charAt(lastPrefix.length()-1))) {
+						UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+						return;
+					}
+					lastWordStart = dot - lastPrefix.length();
+					searchOffs = lastWordStart;
+				}
+
+				while (searchOffs > 0) {
+					int wordStart = 0;
+					try {
+						wordStart = Utilities.getPreviousWord(textArea,
+							searchOffs);
+					} catch (BadLocationException ble) {
+						// No more words.  Sometimes happens for example if the
+						// document starts off with whitespace - then searchOffs
+						// is > 0 but there are no more words
+						wordStart = BreakIterator.DONE;
+					}
+					if (wordStart==BreakIterator.DONE) {
+						UIManager.getLookAndFeel().provideErrorFeedback(
+								textArea);
+						break;
+					}
+					int end = Utilities.getWordEnd(textArea, wordStart);
+					String word = textArea.getText(wordStart, end - wordStart);
+					searchOffs = wordStart;
+					if (word.startsWith(lastPrefix)) {
+						textArea.replaceRange(word, lastWordStart, dot);
+						lastDot = textArea.getCaretPosition(); // Maybe shifted
+						break;
+					}
+				}
+
+			} catch (BadLocationException ble) { // Never happens
+				ble.printStackTrace();
+			}
+
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Moves the caret to the end of the document.
+	 */
+	public static class EndAction extends RecordableTextAction {
+
+ 		private boolean select;
+
+		public EndAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			int dot = getVisibleEnd(textArea);
+			if (select)
+				textArea.moveCaretPosition(dot);
+			else
+				textArea.setCaretPosition(dot);
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+		protected int getVisibleEnd(RTextArea textArea) {
+			return textArea.getDocument().getLength();
+		}
+
+	}
+
+
+	/**
+	 * Positions the caret at the end of the line.
+	 */
+	public static class EndLineAction extends RecordableTextAction {
+
+ 		private boolean select;
+
+		public EndLineAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			int offs = textArea.getCaretPosition();
+			int endOffs = 0;
+			try {
+				if (textArea.getLineWrap()) {
+					// Must check per character, since one logical line may be
+					// many physical lines.
+					// FIXME:  Replace Utilities call with custom version to
+					// cut down on all of the modelToViews, as each call causes
+					// a getTokenList => expensive!
+					endOffs = Utilities.getRowEnd(textArea, offs);
+				}
+				else {
+					Element root = textArea.getDocument().getDefaultRootElement();
+					int line = root.getElementIndex(offs);
+					endOffs = root.getElement(line).getEndOffset() - 1;
+				}
+				if (select) {
+					textArea.moveCaretPosition(endOffs);
+				}
+				else {
+					textArea.setCaretPosition(endOffs);
+				}
+			} catch (Exception ex) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action that ends recording a macro.
+	 */
+	public static class EndRecordingMacroAction extends RecordableTextAction {
+
+ 
+		public EndRecordingMacroAction() {
+			super(rtaEndRecordingMacroAction);
+		}
+
+		public EndRecordingMacroAction(String name, Icon icon,
+					String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RTextArea.endRecordingMacro();
+		}
+
+		public final String getMacroID() {
+			return rtaEndRecordingMacroAction;
+		}
+
+		public boolean isRecordable() {
+			return false; // Never record the recording of a macro!
+		}
+
+	}
+
+
+	/**
+	 * Positions the caret at the end of the word.
+	 */
+	protected static class EndWordAction extends RecordableTextAction {
+
+ 		private boolean select;
+
+		protected EndWordAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			try {
+				int offs = textArea.getCaretPosition();
+				int endOffs = getWordEnd(textArea, offs);
+				if (select)
+					textArea.moveCaretPosition(endOffs);
+				else
+					textArea.setCaretPosition(endOffs);
+			} catch (BadLocationException ble) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+		protected int getWordEnd(RTextArea textArea, int offs)
+									throws BadLocationException {
+			return Utilities.getWordEnd(textArea, offs);
+		}
+
+	}
+
+
+	/**
+	 * Action for increasing the font size.
+	 */
+	public static class IncreaseFontSizeAction extends RecordableTextAction {
+
+ 
+		protected float increaseAmount;
+
+		protected static final float MAXIMUM_SIZE	= 40.0f;
+
+		public IncreaseFontSizeAction() {
+			super(rtaIncreaseFontSizeAction);
+			initialize();
+		}
+
+		public IncreaseFontSizeAction(String name, Icon icon, String desc,
+							Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+			initialize();
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			Font font = textArea.getFont();
+			float oldSize = font.getSize2D();
+			float newSize = oldSize + increaseAmount;
+			if (newSize<=MAXIMUM_SIZE) {
+				// Grow by increaseAmount.
+				font = font.deriveFont(newSize);
+				textArea.setFont(font);
+			}
+			else if (oldSize<MAXIMUM_SIZE) {
+				// Can't grow by full increaseAmount, but can grow a
+				// little bit.
+				font = font.deriveFont(MAXIMUM_SIZE);
+				textArea.setFont(font);
+			}
+			else {
+				// Our font size must be at or bigger than MAXIMUM_SIZE.
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return rtaIncreaseFontSizeAction;
+		}
+
+		protected void initialize() {
+			increaseAmount = 1.0f;
+		}
+
+	}
+
+
+	/**
+	 * Action for when the user presses the Enter key.
+	 */
+	public static class InsertBreakAction extends RecordableTextAction {
+
+ 
+		public InsertBreakAction() {
+			super(DefaultEditorKit.insertBreakAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			textArea.replaceSelection("\n");
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.insertBreakAction;
+		}
+
+		/*
+		 * Overridden for Sun bug 4515750.  Sun fixed this in a more complicated
+		 * way, but I'm not sure why.  See BasicTextUI#getActionMap() and
+		 * BasicTextUI.TextActionWrapper.
+		 */
+		public boolean isEnabled() {
+			JTextComponent tc = getTextComponent(null);
+			return (tc==null || tc.isEditable()) ? super.isEnabled() : false;
+		}
+
+	}
+
+
+	/**
+	 * Action taken when content is to be inserted.
+	 */
+	public static class InsertContentAction extends RecordableTextAction {
+
+ 
+		public InsertContentAction() {
+			super(DefaultEditorKit.insertContentAction, null, null, null,
+					null);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			String content = e.getActionCommand();
+			if (content != null)
+				textArea.replaceSelection(content);
+			else
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.insertContentAction;
+		}
+
+	}
+
+
+	/**
+	 * Places a tab character into the document. If there is a selection, it
+	 * is removed before the tab is added.
+	 */
+	public static class InsertTabAction extends RecordableTextAction {
+
+ 
+		public InsertTabAction() {
+			super(insertTabAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			textArea.replaceSelection("\t");
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.insertTabAction;
+		}
+
+	}
+
+
+	/**
+	 * Action to invert the selection's case.
+	 */
+	public static class InvertSelectionCaseAction extends RecordableTextAction {
+
+ 
+		public InvertSelectionCaseAction() {
+			super(rtaInvertSelectionCaseAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			String selection = textArea.getSelectedText();
+			if (selection!=null) {
+				StringBuffer buffer = new StringBuffer(selection);
+				int length = buffer.length();
+				for (int i=0; i<length; i++) {
+					char c = buffer.charAt(i);
+					if (Character.isUpperCase(c))
+						buffer.setCharAt(i, Character.toLowerCase(c));
+					else if (Character.isLowerCase(c))
+						buffer.setCharAt(i, Character.toUpperCase(c));
+				}
+				textArea.replaceSelection(buffer.toString());
+			}
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action to join the current line and the following line.
+	 */
+	public static class JoinLinesAction extends RecordableTextAction {
+
+		public JoinLinesAction() {
+			super(rtaJoinLinesAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			try {
+				Caret c = textArea.getCaret();
+				int caretPos = c.getDot();
+				Document doc = textArea.getDocument();
+				Element map = doc.getDefaultRootElement();
+				int lineCount = map.getElementCount();
+				int line = map.getElementIndex(caretPos);
+				if (line==lineCount-1) {
+					UIManager.getLookAndFeel().
+								provideErrorFeedback(textArea);
+					return;
+				}
+				Element lineElem = map.getElement(line);
+				caretPos = lineElem.getEndOffset() - 1;
+				c.setDot(caretPos);		// Gets rid of any selection.
+				doc.remove(caretPos, 1);	// Should be '\n'.
+			} catch (BadLocationException ble) {
+				/* Shouldn't ever happen. */
+				ble.printStackTrace();
+			}
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action that moves a line up or down.
+	 */
+	public static class LineMoveAction extends RecordableTextAction {
+
+		private int moveAmt;
+
+		public LineMoveAction(String name, int moveAmt) {
+			super(name);
+			this.moveAmt = moveAmt;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			try {
+				int caret = textArea.getCaretPosition();
+				Document doc = textArea.getDocument();
+				Element root = doc.getDefaultRootElement();
+				int line = root.getElementIndex(caret);
+				if (moveAmt==-1 && line>0) {
+					moveLineUp(textArea, line);
+				}
+				else if (moveAmt==1 && line<root.getElementCount()-1) {
+					moveLineDown(textArea, line);
+				}
+				else {
+					UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+					return;
+				}
+			} catch (BadLocationException ble) {
+				// Never happens.
+				ble.printStackTrace();
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+		private final void moveLineDown(RTextArea textArea, int line)
+									throws BadLocationException {
+			Document doc = textArea.getDocument();
+			Element root = doc.getDefaultRootElement();
+			Element elem = root.getElement(line);
+			int start = elem.getStartOffset();
+			int end = elem.getEndOffset();
+			int caret = textArea.getCaretPosition();
+			int caretOffset = caret - start;
+			String text = doc.getText(start, end-start);
+			doc.remove(start, end-start);
+			Element elem2 = root.getElement(line); // not "line+1" - removed.
+			//int start2 = elem2.getStartOffset();
+			int end2 = elem2.getEndOffset();
+			doc.insertString(end2, text, null);
+			elem = root.getElement(line+1);
+			textArea.setCaretPosition(elem.getStartOffset()+caretOffset);
+		}
+
+		private final void moveLineUp(RTextArea textArea, int line)
+									throws BadLocationException {
+			Document doc = textArea.getDocument();
+			Element root = doc.getDefaultRootElement();
+			int lineCount = root.getElementCount();
+			Element elem = root.getElement(line);
+			int start = elem.getStartOffset();
+			int end = line==lineCount-1 ? elem.getEndOffset()-1 :
+									elem.getEndOffset();
+			int caret = textArea.getCaretPosition();
+			int caretOffset = caret - start;
+			String text = doc.getText(start, end-start);
+			if (line==lineCount-1) {
+				start--; // Remove previous line's ending \n
+			}
+			doc.remove(start, end-start);
+			Element elem2 = root.getElement(line-1);
+			int start2 = elem2.getStartOffset();
+			//int end2 = elem2.getEndOffset();
+			if (line==lineCount-1) {
+				text += '\n';
+			}
+			doc.insertString(start2, text, null);
+			//caretOffset = Math.min(start2+caretOffset, end2-1);
+			textArea.setCaretPosition(start2+caretOffset);
+		}
+
+	}
+
+
+	/**
+	 * Action to make the selection lower-case.
+	 */
+	public static class LowerSelectionCaseAction extends RecordableTextAction {
+
+		public LowerSelectionCaseAction() {
+			super(rtaLowerSelectionCaseAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			String selection = textArea.getSelectedText();
+			if (selection!=null)
+				textArea.replaceSelection(selection.toLowerCase());
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action that moves the caret to the next (or previous) bookmark.
+	 */
+	public static class NextBookmarkAction extends RecordableTextAction {
+
+		private boolean forward;
+
+		public NextBookmarkAction(String name, boolean forward) {
+			super(name);
+			this.forward = forward;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+			if (gutter!=null) {
+
+				try {
+
+					GutterIconInfo[] bookmarks = gutter.getBookmarks();
+					if (bookmarks.length==0) {
+						UIManager.getLookAndFeel().
+									provideErrorFeedback(textArea);
+						return;
+					}
+
+					GutterIconInfo moveTo = null;
+					int curLine = textArea.getCaretLineNumber();
+
+					if (forward) {
+						for (int i=0; i<bookmarks.length; i++) {
+							GutterIconInfo bookmark = bookmarks[i];
+							int offs = bookmark.getMarkedOffset();
+							int line = textArea.getLineOfOffset(offs);
+							if (line>curLine) {
+								moveTo = bookmark;
+								break;
+							}
+						}
+						if (moveTo==null) { // Loop back to beginning
+							moveTo = bookmarks[0];
+						}
+					}
+					else {
+						for (int i=bookmarks.length-1; i>=0; i--) {
+							GutterIconInfo bookmark = bookmarks[i];
+							int offs = bookmark.getMarkedOffset();
+							int line = textArea.getLineOfOffset(offs);
+							if (line<curLine) {
+								moveTo = bookmark;
+								break;
+							}
+						}
+						if (moveTo==null) { // Loop back to end
+							moveTo = bookmarks[bookmarks.length-1];
+						}
+					}
+
+					int offs = moveTo.getMarkedOffset();
+					if (textArea instanceof RSyntaxTextArea) {
+						RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+						if (rsta.isCodeFoldingEnabled()) {
+							rsta.getFoldManager().
+										ensureOffsetNotInClosedFold(offs);
+						}
+					}
+					int line = textArea.getLineOfOffset(offs);
+					offs = textArea.getLineStartOffset(line);
+					textArea.setCaretPosition(offs);
+
+				} catch (BadLocationException ble) { // Never happens
+					UIManager.getLookAndFeel().
+								provideErrorFeedback(textArea);
+					ble.printStackTrace();
+				}
+			}
+
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Selects the next occurrence of the text last selected.
+	 */
+	public static class NextOccurrenceAction extends RecordableTextAction {
+
+		public NextOccurrenceAction(String name) {
+			super(name);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			String selectedText = textArea.getSelectedText();
+			if (selectedText == null || selectedText.length() == 0) {
+				selectedText = RTextArea.getSelectedOccurrenceText();
+				if (selectedText == null || selectedText.length() == 0) {
+					UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+					return;
+				}
+			}
+			SearchContext context = new SearchContext(selectedText);
+			if (!SearchEngine.find(textArea, context)) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+			RTextArea.setSelectedOccurrenceText(selectedText);
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action to move the selection and/or caret. Constructor indicates
+	 * direction to use.
+	 */
+	public static class NextVisualPositionAction extends RecordableTextAction {
+
+		private boolean select;
+		private int direction;
+
+		public NextVisualPositionAction(String nm, boolean select, int dir) {
+			super(nm);
+			this.select = select;
+			this.direction = dir;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			Caret caret = textArea.getCaret();
+			int dot = caret.getDot();
+
+			/*
+			 * Move to the beginning/end of selection on a "non-shifted"
+			 * left- or right-keypress.  We shouldn't have to worry about
+			 * navigation filters as, if one is being used, it let us get
+			 * to that position before.
+			 */
+			if (!select) {
+				switch (direction) {
+					case SwingConstants.EAST:
+						int mark = caret.getMark();
+						if (dot!=mark) {
+							caret.setDot(Math.max(dot, mark));
+							return;
+						}
+						break;
+					case SwingConstants.WEST:
+						mark = caret.getMark();
+						if (dot!=mark) {
+							caret.setDot(Math.min(dot, mark));
+							return;
+						}
+						break;
+					default:
+				}
+			}
+
+			Position.Bias[] bias = new Position.Bias[1];
+			Point magicPosition = caret.getMagicCaretPosition();
+
+			try {
+
+				if(magicPosition == null &&
+					(direction == SwingConstants.NORTH ||
+					direction == SwingConstants.SOUTH)) {
+					Rectangle r = textArea.modelToView(dot);
+					magicPosition = new Point(r.x, r.y);
+				}
+
+				NavigationFilter filter = textArea.getNavigationFilter();
+
+				if (filter != null) {
+					dot = filter.getNextVisualPositionFrom(textArea, dot,
+								Position.Bias.Forward, direction, bias);
+				}
+				else {
+					dot = textArea.getUI().getNextVisualPositionFrom(
+								textArea, dot,
+								Position.Bias.Forward, direction, bias);
+				}
+				if (select)
+					caret.moveDot(dot);
+				else
+					caret.setDot(dot);
+
+				if(magicPosition != null &&
+					(direction == SwingConstants.NORTH ||
+					direction == SwingConstants.SOUTH)) {
+						caret.setMagicCaretPosition(magicPosition);
+				}
+
+			} catch (BadLocationException ble) {
+				ble.printStackTrace();
+			}
+
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+    }
+
+
+	/**
+	 * Positions the caret at the next word.
+	 */
+	public static class NextWordAction extends RecordableTextAction {
+
+ 		private boolean select;
+
+		public NextWordAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			int offs = textArea.getCaretPosition();
+			int oldOffs = offs;
+			Element curPara = Utilities.getParagraphElement(textArea, offs);
+
+			try {
+				offs = getNextWord(textArea, offs);
+				if(offs >= curPara.getEndOffset() &&
+							oldOffs != curPara.getEndOffset() - 1) {
+					// we should first move to the end of current paragraph
+					// http://bugs.sun.com/view_bug.do?bug_id=4278839
+					offs = curPara.getEndOffset() - 1;
+				}
+			} catch (BadLocationException ble) {
+				int end = textArea.getDocument().getLength();
+				if (offs != end) {
+					if(oldOffs != curPara.getEndOffset() - 1)
+						offs = curPara.getEndOffset() - 1;
+					else
+						offs = end;
+				}
+			}
+
+			if (select)
+				textArea.moveCaretPosition(offs);
+			else
+				textArea.setCaretPosition(offs);
+
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+		protected int getNextWord(RTextArea textArea, int offs)
+									throws BadLocationException {
+			return Utilities.getNextWord(textArea, offs);
+		}
+
+	}
+
+
+	/**
+	 * Pages one view to the left or right.
+	 */
+	static class PageAction extends RecordableTextAction {
+
+ 
+		private boolean select;
+		private boolean left;
+
+		public PageAction(String name, boolean left, boolean select) {
+			super(name);
+			this.select = select;
+			this.left = left;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			int selectedIndex;
+			Rectangle visible = new Rectangle();
+			textArea.computeVisibleRect(visible);
+			if (left)
+				visible.x = Math.max(0, visible.x - visible.width);
+			else
+				visible.x += visible.width;
+		
+			selectedIndex = textArea.getCaretPosition();
+			if(selectedIndex != -1) {
+				if (left) {
+					selectedIndex = textArea.viewToModel(
+									new Point(visible.x, visible.y));
+				}
+				else {
+					selectedIndex = textArea.viewToModel(
+							new Point(visible.x + visible.width - 1,
+									visible.y + visible.height - 1));
+				}
+				Document doc = textArea.getDocument();
+				if ((selectedIndex != 0) && 
+					(selectedIndex  > (doc.getLength()-1))) {
+					selectedIndex = doc.getLength()-1;
+				}
+				else if(selectedIndex  < 0) {
+					selectedIndex = 0;
+				}
+				if (select)
+					textArea.moveCaretPosition(selectedIndex);
+				else
+					textArea.setCaretPosition(selectedIndex);
+			}
+
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action for pasting text.
+	 */
+	public static class PasteAction extends RecordableTextAction {
+
+ 
+		public PasteAction() {
+			super(DefaultEditorKit.pasteAction);
+		}
+
+		public PasteAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			textArea.paste();
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.pasteAction;
+		}
+
+	}
+
+
+	/**
+	 * "Plays back" the last macro recorded.
+	 */
+	public static class PlaybackLastMacroAction extends RecordableTextAction {
+
+ 
+		public PlaybackLastMacroAction() {
+			super(rtaPlaybackLastMacroAction);
+		}
+
+		public PlaybackLastMacroAction(String name, Icon icon,
+					String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			textArea.playbackLastMacro();
+		}
+
+		public boolean isRecordable() {
+			return false; // Don't record macro playbacks.
+		}
+
+		public final String getMacroID() {
+			return rtaPlaybackLastMacroAction;
+		}
+
+	}
+
+
+	/**
+	 * Select the previous occurrence of the text last selected.
+	 */
+	public static class PreviousOccurrenceAction extends RecordableTextAction {
+
+		public PreviousOccurrenceAction(String name) {
+			super(name);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			String selectedText = textArea.getSelectedText();
+			if (selectedText == null || selectedText.length() == 0) {
+				selectedText = RTextArea.getSelectedOccurrenceText();
+				if (selectedText == null || selectedText.length() == 0) {
+					UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+					return;
+				}
+			}
+			SearchContext context = new SearchContext(selectedText);
+			context.setSearchForward(false);
+			if (!SearchEngine.find(textArea, context)) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+			RTextArea.setSelectedOccurrenceText(selectedText);
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+    /**
+     * Positions the caret at the beginning of the previous word.
+     */
+    public static class PreviousWordAction extends RecordableTextAction {
+
+ 		private boolean select;
+
+		public PreviousWordAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			int offs = textArea.getCaretPosition();
+			boolean failed = false;
+			try {
+
+				Element curPara = Utilities.getParagraphElement(textArea, offs);
+				offs = getPreviousWord(textArea, offs);
+				if(offs < curPara.getStartOffset()) {
+					offs = Utilities.getParagraphElement(textArea, offs).
+												getEndOffset() - 1;
+				}
+
+			} catch (BadLocationException bl) {
+				if (offs != 0)
+					offs = 0;
+				else
+					failed = true;
+			}
+
+			if (!failed) {
+				if (select)
+					textArea.moveCaretPosition(offs);
+				else
+					textArea.setCaretPosition(offs);
+			}
+			else
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+		protected int getPreviousWord(RTextArea textArea, int offs)
+										throws BadLocationException {
+			return Utilities.getPreviousWord(textArea, offs);
+		}
+
+	}
+
+
+	/**
+	 * Re-does the last action undone.
+	 */
+	public static class RedoAction extends RecordableTextAction {
+
+ 
+		public RedoAction() {
+			super(rtaRedoAction);
+		}
+
+		public RedoAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (textArea.isEnabled() && textArea.isEditable()) {
+				textArea.redoLastAction();
+				textArea.requestFocusInWindow();
+			}
+		}
+
+		public final String getMacroID() {
+			return rtaRedoAction;
+		}
+
+	}
+
+
+	/**
+	 * Scrolls the text area one line up or down, without changing
+	 * the caret position.
+	 */
+	public static class ScrollAction extends RecordableTextAction {
+
+		private int delta;
+
+		public ScrollAction(String name, int delta) {
+			super(name);
+			this.delta = delta;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			Container parent = textArea.getParent();
+			if (parent instanceof JViewport) {
+				JViewport viewport = (JViewport)parent;
+				Point p = viewport.getViewPosition();
+				p.y += delta*textArea.getLineHeight();
+				if (p.y<0) {
+					p.y = 0;
+				}
+				else {
+					Rectangle viewRect = viewport.getViewRect();
+					int visibleEnd = p.y + viewRect.height;
+					if (visibleEnd>=textArea.getHeight()) {
+						p.y = textArea.getHeight() - viewRect.height;
+					}
+				}
+				viewport.setViewPosition(p);
+			}
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Selects the entire document.
+	 */
+	public static class SelectAllAction extends RecordableTextAction {
+
+ 
+		public SelectAllAction() {
+			super(selectAllAction);
+		}
+
+		public SelectAllAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			Document doc = textArea.getDocument();
+			textArea.setCaretPosition(0);
+			textArea.moveCaretPosition(doc.getLength());
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.selectAllAction;
+		}
+
+	}
+
+
+	/**
+	 * Selects the line around the caret.
+	 */
+	public static class SelectLineAction extends RecordableTextAction {
+
+ 		private Action start;
+		private Action end;
+
+		public SelectLineAction() {
+			super(selectLineAction);
+			start = new BeginLineAction("pigdog", false);
+			end = new EndLineAction("pigdog", true);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			start.actionPerformed(e);
+			end.actionPerformed(e);
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.selectLineAction;
+		}
+
+	}
+
+
+	/**
+	 * Selects the word around the caret.
+	 */
+	public static class SelectWordAction extends RecordableTextAction {
+
+ 		protected Action start;
+		protected Action end;
+
+		public SelectWordAction() {
+			super(selectWordAction);
+			createActions();
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			start.actionPerformed(e);
+			end.actionPerformed(e);
+		}
+
+		protected void createActions() {
+			start = new BeginWordAction("pigdog", false);
+			end = new EndWordAction("pigdog", true);
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.selectWordAction;
+		}
+
+	}
+
+
+	/**
+	 * Puts the text area into read-only mode.
+	 */
+	public static class SetReadOnlyAction extends RecordableTextAction {
+
+ 
+		public SetReadOnlyAction() {
+			super(readOnlyAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			textArea.setEditable(false);
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.readOnlyAction;
+		}
+
+		public boolean isRecordable() {
+			return false; // Why would you want to record this?
+		}
+
+	}
+
+
+	/**
+	 * Puts the text area into writable (from read-only) mode.
+	 */
+	public static class SetWritableAction extends RecordableTextAction {
+
+ 
+		public SetWritableAction() {
+			super(writableAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			textArea.setEditable(true);
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.writableAction;
+		}
+
+		public boolean isRecordable() {
+			return false; // Why would you want to record this?
+		}
+
+	}
+
+
+	/**
+	 * The action for inserting a time/date stamp.
+	 */
+	public static class TimeDateAction extends RecordableTextAction {
+
+ 
+		public TimeDateAction() {
+			super(rtaTimeDateAction);
+		}
+
+		public TimeDateAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			Date today = new Date();
+			DateFormat timeDateStamp = DateFormat.getDateTimeInstance();
+			String dateString = timeDateStamp.format(today);
+			textArea.replaceSelection(dateString);
+		}
+
+		public final String getMacroID() {
+			return rtaTimeDateAction;
+		}
+
+	}
+
+
+	/**
+	 * Toggles whether the current line has a bookmark.
+	 */
+	public static class ToggleBookmarkAction extends RecordableTextAction {
+ 
+		public ToggleBookmarkAction() {
+			super(rtaToggleBookmarkAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+			if (gutter!=null) {
+				int line = textArea.getCaretLineNumber();
+				try {
+					gutter.toggleBookmark(line);
+				} catch (BadLocationException ble) { // Never happens
+					UIManager.getLookAndFeel().
+								provideErrorFeedback(textArea);
+					ble.printStackTrace();
+				}
+			}
+		}
+
+		public final String getMacroID() {
+			return rtaToggleBookmarkAction;
+		}
+
+	}
+
+
+	/**
+	 * The action for the insert key toggling insert/overwrite modes.
+	 */
+	public static class ToggleTextModeAction extends RecordableTextAction {
+ 
+		public ToggleTextModeAction() {
+			super(rtaToggleTextModeAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			int textMode = textArea.getTextMode();
+			if (textMode==RTextArea.INSERT_MODE)
+				textArea.setTextMode(RTextArea.OVERWRITE_MODE);
+			else
+				textArea.setTextMode(RTextArea.INSERT_MODE);
+		}
+
+		public final String getMacroID() {
+			return rtaToggleTextModeAction;
+		}
+
+	}
+
+
+	/**
+	 * Undoes the last action done.
+	 */
+	public static class UndoAction extends RecordableTextAction {
+
+ 		public UndoAction() {
+			super(rtaUndoAction);
+		}
+
+		public UndoAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (textArea.isEnabled() && textArea.isEditable()) {
+				textArea.undoLastAction();
+				textArea.requestFocusInWindow();
+			}
+		}
+
+		public final String getMacroID() {
+			return rtaUndoAction;
+		}
+
+	}
+
+
+	/**
+	 * Removes the selection, if any.
+	 */
+	public static class UnselectAction extends RecordableTextAction {
+
+ 
+		public UnselectAction() {
+			super(rtaUnselectAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			textArea.setCaretPosition(textArea.getCaretPosition());
+		}
+
+		public final String getMacroID() {
+			return rtaUnselectAction;
+		}
+
+	}
+
+ 
+	/**
+	 * Action to make the selection upper-case.
+	 */
+	public static class UpperSelectionCaseAction extends RecordableTextAction {
+
+ 
+		public UpperSelectionCaseAction() {
+			super(rtaUpperSelectionCaseAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			String selection = textArea.getSelectedText();
+			if (selection!=null)
+				textArea.replaceSelection(selection.toUpperCase());
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Scrolls up/down vertically.  The select version of this action extends
+	 * the selection, instead of simply moving the caret.
+	 */
+	public static class VerticalPageAction extends RecordableTextAction {
+
+		private boolean select;
+		private int direction;
+
+		public VerticalPageAction(String name, int direction, boolean select) {
+			super(name);
+			this.select = select;
+			this.direction = direction;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			Rectangle visible = textArea.getVisibleRect();
+			Rectangle newVis = new Rectangle(visible);
+			int selectedIndex = textArea.getCaretPosition();
+			int scrollAmount = textArea.getScrollableBlockIncrement(
+							visible, SwingConstants.VERTICAL, direction); 
+			int initialY = visible.y;
+			Caret caret = textArea.getCaret();
+			Point magicPosition = caret.getMagicCaretPosition();
+			int yOffset;   
+
+			if (selectedIndex!=-1) {
+
+				try {
+
+					Rectangle dotBounds = textArea.modelToView(selectedIndex);
+					int x = (magicPosition != null) ? magicPosition.x :
+												dotBounds.x;
+					int h = dotBounds.height;
+					yOffset = direction *
+							((int)Math.ceil(scrollAmount/(double)h)-1)*h; 
+					newVis.y = constrainY(textArea, initialY+yOffset, yOffset, visible.height);                        
+					int newIndex;
+
+					if (visible.contains(dotBounds.x, dotBounds.y)) {
+						// Dot is currently visible, base the new
+						// location off the old, or
+						newIndex = textArea.viewToModel(
+									new Point(x, constrainY(textArea,
+										dotBounds.y + yOffset, 0, 0)));
+										}
+					else {
+						// Dot isn't visible, choose the top or the bottom
+						// for the new location.
+						if (direction == -1) {
+							newIndex = textArea.viewToModel(new Point(
+													x, newVis.y));
+						}
+						else {
+							newIndex = textArea.viewToModel(new Point(
+									x, newVis.y + visible.height));
+						}
+					}
+					newIndex = constrainOffset(textArea, newIndex);
+					if (newIndex != selectedIndex) {
+						// Make sure the new visible location contains
+						// the location of dot, otherwise Caret will
+						// cause an additional scroll.
+						adjustScrollIfNecessary(textArea, newVis, initialY,
+											newIndex);
+						if (select)
+							textArea.moveCaretPosition(newIndex);
+						else
+							textArea.setCaretPosition(newIndex);
+					}
+
+				} catch (BadLocationException ble) { }
+
+			} // End of if (selectedIndex!=-1).
+
+			else {
+				yOffset = direction * scrollAmount;
+				newVis.y = constrainY(textArea, initialY + yOffset, yOffset, visible.height);
+			}
+
+			if (magicPosition != null)
+				caret.setMagicCaretPosition(magicPosition);
+
+			textArea.scrollRectToVisible(newVis);
+		}
+
+		private int constrainY(JTextComponent textArea, int y, int vis, int screenHeight) {
+			if (y < 0)
+				y = 0;
+			else if (y + vis > textArea.getHeight()) {
+				//y = Math.max(0, textArea.getHeight() - vis);
+				y = Math.max(0, textArea.getHeight()-screenHeight);
+			}
+			return y;
+		}
+
+		private int constrainOffset(JTextComponent text, int offset) {
+			Document doc = text.getDocument();
+			if ((offset != 0) && (offset > doc.getLength()))
+				offset = doc.getLength();
+			if (offset  < 0)
+				offset = 0;
+			return offset;
+		}
+
+		private void adjustScrollIfNecessary(JTextComponent text,
+									Rectangle visible, int initialY,
+									int index) {
+			try {
+				Rectangle dotBounds = text.modelToView(index);
+	                if (dotBounds.y < visible.y ||
+					(dotBounds.y > (visible.y + visible.height)) ||
+					(dotBounds.y + dotBounds.height) >
+					(visible.y + visible.height)) {
+					int y;
+					if (dotBounds.y < visible.y)
+						y = dotBounds.y;
+					else
+						y = dotBounds.y + dotBounds.height - visible.height;
+					if ((direction == -1 && y < initialY) ||
+						(direction == 1 && y > initialY))
+						// Only adjust if won't cause scrolling upward.
+						visible.y = y;
+				}
+			} catch (BadLocationException ble) {}
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RTextAreaUI.java b/src/org/fife/ui/rtextarea/RTextAreaUI.java
new file mode 100644
index 0000000..e486a99
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RTextAreaUI.java
@@ -0,0 +1,581 @@
+/*
+ * 04/25/2007
+ *
+ * RTextAreaUI.java - UI used by instances of RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.text.*;
+import javax.swing.border.Border;
+import javax.swing.plaf.*;
+import javax.swing.plaf.basic.*;
+
+
+/**
+ * The UI used by instances of <code>RTextArea</code>.  This UI takes into
+ * account all of the "extras" involved in an <code>RTextArea</code>, including
+ * having a special caret (for insert and overwrite), background images,
+ * highlighting the current line, etc.
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ */
+public class RTextAreaUI extends BasicTextAreaUI implements ViewFactory {
+
+	private static final String SHARED_ACTION_MAP_NAME	= "RTextAreaUI.actionMap";
+	private static final String SHARED_INPUT_MAP_NAME	= "RTextAreaUI.inputMap";
+
+	protected RTextArea textArea;				// The text area for which we are the UI.
+
+	private static final EditorKit defaultKit = new RTextAreaEditorKit();
+	private static final TransferHandler defaultTransferHandler =
+										new RTATextTransferHandler();
+
+	private static final String RTEXTAREA_KEYMAP_NAME	= "RTextAreaKeymap";
+
+
+	/**
+	 * Creates a UI for an RTextArea.
+	 *
+	 * @param textArea A text area.
+	 * @return The UI.
+	 */
+	public static ComponentUI createUI(JComponent textArea) {
+		return new RTextAreaUI(textArea);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea An instance of <code>RTextArea</code>.
+	 * @throws IllegalArgumentException If <code>textArea</code> is not an
+	 *         instance of <code>RTextArea</code>.
+	 */
+	public RTextAreaUI(JComponent textArea) {
+		if (!(textArea instanceof RTextArea)) {
+			throw new IllegalArgumentException("RTextAreaUI is for " +
+							 		"instances of RTextArea only!");
+		}
+		this.textArea = (RTextArea)textArea;
+	}
+
+
+	/**
+	 * The Nimbus LAF (and any Synth laf might have similar issues) doesn't set
+	 * many UIManager properties that BasicLAF UI's look for.  This causes
+	 * problems for custom Basic-based UI's such as RTextAreaUI.  This method
+	 * attempts to detect if Nimbus has been installed, and if so, sets proper
+	 * values for some editor properties.
+	 *
+	 * @param editor The text area.
+	 */
+	private void correctNimbusDefaultProblems(JTextComponent editor) {
+
+		// Don't check UIManager.getLookAndFeel().getName() for "Nimbus",
+		// as other Synth-based LaFs might have not set these properties,
+		// in which case we'll need to use our fallback values.
+
+		// Check for null, but not for UIResource, for these properties,
+		// because if Nimbus was installed these values would all be given
+		// null values.  Another laf might have successfully installed
+		// UIResource values, which we don't want to override.
+
+		Color c = editor.getCaretColor();
+		if (c==null) {
+			editor.setCaretColor(RTextArea.getDefaultCaretColor());
+		}
+
+		c = editor.getSelectionColor();
+		if (c==null) {
+			c = UIManager.getColor("nimbusSelectionBackground");
+			if (c==null) { // Not Nimbus, but still need a value - fallback
+				c = UIManager.getColor("textHighlight");
+				if (c==null) {
+					c = new ColorUIResource(Color.BLUE);
+				}
+			}
+			editor.setSelectionColor(c);
+		}
+
+		c = editor.getSelectedTextColor();
+		if (c==null) {
+			c = UIManager.getColor("nimbusSelectedText");
+			if (c==null) { // Not Nimbus, but still need a value - fallback
+				c = UIManager.getColor("textHighlightText");
+				if (c==null) {
+					c = new ColorUIResource(Color.WHITE);
+				}
+			}
+			editor.setSelectedTextColor(c);
+		}
+
+		c = editor.getDisabledTextColor();
+		if (c==null) {
+			c = UIManager.getColor("nimbusDisabledText");
+			if (c==null) { // Not Nimbus, but still need a value - fallback
+				c = UIManager.getColor("textInactiveText");
+				if (c==null) {
+					c = new ColorUIResource(Color.DARK_GRAY);
+				}
+			}
+			editor.setDisabledTextColor(c);
+		}
+
+		Border border = editor.getBorder();
+		if (border==null) {
+			editor.setBorder(new BasicBorders.MarginBorder());
+		}
+
+		Insets margin = editor.getMargin();
+		if (margin==null) {
+			editor.setMargin(new InsetsUIResource(2, 2, 2, 2));
+		}
+
+	}
+
+
+	/**
+	 * Creates the view for an element.  Returns a WrappedPlainView or
+	 * PlainView.
+	 *
+	 * @param elem The element.
+	 * @return The view.
+	 */
+	public View create(Element elem) {
+		if (textArea.getLineWrap())
+			return new WrappedPlainView(elem, textArea.getWrapStyleWord());
+		else
+			return new PlainView(elem);
+	}
+
+
+	/**
+	 * Returns the default caret for an <code>RTextArea</code>.  This caret is
+	 * capable of displaying itself differently for insert/overwrite modes.
+	 *
+	 * @return The caret.
+	 */
+	protected Caret createCaret() {
+		Caret caret = new ConfigurableCaret();
+		caret.setBlinkRate(500);
+		return caret;
+	}
+
+
+	/**
+	 * Creates the keymap for this text area.  This takes the super class's
+	 * keymap, but sets the default keystroke to be RTextAreaEditorKit's
+	 * DefaultKeyTypedAction.  This must be done to override the default
+	 * keymap's default key-typed action.
+	 *
+	 * @return The keymap.
+	 */
+	protected Keymap createKeymap() {
+
+		// Load the keymap we'll be using (it's saved by
+		// JTextComponent.addKeymap).
+		Keymap map = JTextComponent.getKeymap(RTEXTAREA_KEYMAP_NAME);
+		if (map==null) {
+			Keymap parent = JTextComponent.getKeymap(JTextComponent.DEFAULT_KEYMAP);
+			map = JTextComponent.addKeymap(RTEXTAREA_KEYMAP_NAME, parent);
+			map.setDefaultAction(new RTextAreaEditorKit.DefaultKeyTypedAction());
+		}
+
+		return map;
+
+	}
+
+
+	/**
+	 * Creates a default action map.  This action map contains actions for all
+	 * basic text area work - cut, copy, paste, select, caret motion, etc.<p>
+	 *
+	 * This isn't named <code>createActionMap()</code> because there is a
+	 * package-private member by that name in <code>BasicTextAreaUI</code>,
+	 * and some compilers will give warnings that we are not overriding that
+	 * method since it is package-private.
+	 *
+	 * @return The action map.
+	 */
+	protected ActionMap createRTextAreaActionMap() {
+
+		// Get the actions of the text area (which in turn gets them from its
+		// DefaultEditorKit).
+		ActionMap map = new ActionMapUIResource();
+		Action[] actions = textArea.getActions();
+		int n = actions.length;
+		for (int i = 0; i < n; i++) {
+			Action a = actions[i];
+			map.put(a.getValue(Action.NAME), a);
+		}
+
+		// Not sure if we need these; not sure they are ever called
+		// (check their NAMEs).
+		map.put(TransferHandler.getCutAction().getValue(Action.NAME),
+									TransferHandler.getCutAction());
+		map.put(TransferHandler.getCopyAction().getValue(Action.NAME),
+									TransferHandler.getCopyAction());
+		map.put(TransferHandler.getPasteAction().getValue(Action.NAME),
+									TransferHandler.getPasteAction());
+
+		return map;
+
+	}
+
+
+	/**
+	 * Returns the name to use to cache/fetch the shared action map.  This
+	 * should be overridden by subclasses if the subclass has its own custom
+	 * editor kit to install, so its actions get picked up.
+	 *
+	 * @return The name of the cached action map.
+	 */
+	protected String getActionMapName() {
+		return SHARED_ACTION_MAP_NAME;
+	}
+
+
+	/**
+	 * Fetches the EditorKit for the UI.
+	 *
+	 * @param tc the text component for which this UI is installed
+	 * @return the editor capabilities
+	 * @see TextUI#getEditorKit
+	 */
+	public EditorKit getEditorKit(JTextComponent tc) {
+		return defaultKit;
+	}
+
+
+	/**
+	 * Returns the text area for which we are the UI.
+	 *
+	 * @return The text area.
+	 */
+	public RTextArea getRTextArea() {
+		return textArea;
+	}
+
+
+	/**
+	 * Returns an action map to use by a text area.<p>
+	 *
+	 * This method is not named <code>getActionMap()</code> because there is
+	 * a package-private method in <code>BasicTextAreaUI</code> with that name.
+	 * Thus, creating a new method with that name causes certain compilers to
+	 * issue warnings that you are not actually overriding the original method
+	 * (since it is package-private).
+	 *
+	 * @return The action map.
+	 * @see #createRTextAreaActionMap()
+	 */
+	private ActionMap getRTextAreaActionMap() {
+
+		// Get the UIManager-cached action map; if this is the first
+		// RTextArea created, create the action map and cache it.
+		ActionMap map = (ActionMap)UIManager.get(getActionMapName());
+		if (map==null) {
+			map = createRTextAreaActionMap();
+			UIManager.put(getActionMapName(), map);
+		}
+
+		ActionMap componentMap = new ActionMapUIResource();
+		componentMap.put("requestFocus", new FocusAction());
+
+		if (map != null)
+			componentMap.setParent(map);
+		return componentMap;
+
+	}
+
+
+	/**
+	 * Get the InputMap to use for the UI.<p>
+	 *  
+	 * This method is not named <code>getInputMap()</code> because there is
+	 * a package-private method in <code>BasicTextAreaUI</code> with that name.
+	 * Thus, creating a new method with that name causes certain compilers to
+	 * issue warnings that you are not actually overriding the original method
+	 * (since it is package-private).
+	 */
+	protected InputMap getRTextAreaInputMap() {
+		InputMap map = new InputMapUIResource();
+		InputMap shared = (InputMap)UIManager.get(SHARED_INPUT_MAP_NAME);
+		if (shared==null) {
+			shared = new RTADefaultInputMap();
+			UIManager.put(SHARED_INPUT_MAP_NAME, shared);
+		}
+		//KeyStroke[] keys = shared.allKeys();
+		//for (int i=0; i<keys.length; i++)
+		//	System.err.println(keys[i] + " -> " + shared.get(keys[i]));
+		map.setParent(shared);
+		return map;
+	}
+
+
+	/**
+	 * Gets the allocation to give the root View.  Due
+	 * to an unfortunate set of historical events this 
+	 * method is inappropriately named.  The Rectangle
+	 * returned has nothing to do with visibility.  
+	 * The component must have a non-zero positive size for 
+	 * this translation to be computed.
+	 *
+	 * @return the bounding box for the root view
+	 */
+	protected Rectangle getVisibleEditorRect() {
+		Rectangle alloc = textArea.getBounds();
+		if ((alloc.width > 0) && (alloc.height > 0)) {
+			alloc.x = alloc.y = 0;
+			Insets insets = textArea.getInsets();
+			alloc.x += insets.left;
+			alloc.y += insets.top;
+			alloc.width -= insets.left + insets.right;
+			alloc.height -= insets.top + insets.bottom;
+			return alloc;
+		}
+		return null;
+	}
+
+
+	protected void installDefaults() {
+
+		super.installDefaults();
+
+		JTextComponent editor = getComponent();
+		editor.setFont(RTextAreaBase.getDefaultFont());
+
+		// Nimbus (and possibly other Synth lafs) doesn't play by BasicLaf
+		// rules and doesn't set properties needed by custom BasicTextAreaUI's.
+		correctNimbusDefaultProblems(editor);
+
+		editor.setTransferHandler(defaultTransferHandler);
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected void installKeyboardActions() {
+
+		// NOTE: Don't call super.installKeyboardActions(), as that causes
+		// JTextAreas to stop responding to certain keystrokes if an RTextArea
+		// is the first-instantiated text area.  This is because of the code
+		// path installKeyboardActions() -> getActionMap() -> createActionMap().
+		// In BasicTextUI#createActionMap(), "editor.getActions()" is called,
+		// and the current editor's returned Actions are used to create the
+		// ActionMap, which is then cached and used in all future J/RTextAreas.
+		// Unfortunately, RTextArea actions don't worn in JTextAreas.
+		//super.installKeyboardActions();
+
+		RTextArea textArea = getRTextArea();
+
+		// backward compatibility support... keymaps for the UI
+		// are now installed in the more friendly input map.
+		textArea.setKeymap(createKeymap()); 
+
+		// Since BasicTextUI.getInputMap() is package-private, instead use
+		// our own version here.
+		InputMap map = getRTextAreaInputMap();
+		SwingUtilities.replaceUIInputMap(textArea,JComponent.WHEN_FOCUSED,map);
+
+		// Same thing here with action map.
+		ActionMap am = getRTextAreaActionMap();
+		if (am!=null) {
+		    SwingUtilities.replaceUIActionMap(textArea, am);
+		}
+
+
+	}
+
+
+	/**
+	 * Installs this UI to the given text component.
+	 */
+	public void installUI(JComponent c) {
+		if (!(c instanceof RTextArea)) {
+			throw new Error("RTextAreaUI needs an instance of RTextArea!");
+		}
+		super.installUI(c);
+	}
+
+
+	protected void paintBackground(Graphics g) {
+
+		// Only fill in the background if an image isn't being used.
+		Color bg = textArea.getBackground();
+		if (bg!=null) {
+			g.setColor(bg);
+			//g.fillRect(0, 0, textArea.getWidth(), textArea.getHeight());
+			Rectangle r = g.getClipBounds();
+			g.fillRect(r.x,r.y, r.width,r.height);
+		}
+
+		Rectangle visibleRect = textArea.getVisibleRect();
+
+		paintLineHighlights(g);
+		paintCurrentLineHighlight(g, visibleRect);
+		paintMarginLine(g, visibleRect);
+
+	}
+
+
+	/**
+	 * Paints the highlighted current line, if it is enabled.
+	 *
+	 * @param g The graphics context with which to paint.
+	 * @param visibleRect The visible rectangle of the text area.
+	 */
+	protected void paintCurrentLineHighlight(Graphics g, Rectangle visibleRect) {
+
+		if (textArea.getHighlightCurrentLine()) {
+
+			Caret caret = textArea.getCaret();
+			if (caret.getDot()==caret.getMark()) {
+
+				Color highlight = textArea.getCurrentLineHighlightColor();
+				// NOTE:  We use the getLineHeight() method below instead
+				// of currentCaretRect.height because of a bug where
+				// currentCaretRect.height is incorrect when an
+				// RSyntaxTextArea is first displayed (it is initialized 
+				// with the text area's font.getHeight() (via RTextArea),
+				// but isn't changed to account for the syntax styles
+				// before it is displayed).
+				//int height = textArea.currentCaretRect.height);
+				int height = textArea.getLineHeight();
+
+				if (textArea.getFadeCurrentLineHighlight()) {
+					Graphics2D g2d = (Graphics2D)g;
+					Color bg = textArea.getBackground();
+					GradientPaint paint = new GradientPaint(
+						visibleRect.x,0, highlight,
+						visibleRect.x+visibleRect.width,0,
+								bg==null ? Color.WHITE : bg);
+					g2d.setPaint(paint);
+					g2d.fillRect(visibleRect.x,textArea.currentCaretY,
+									visibleRect.width, height);
+				}
+				else {
+					g.setColor(highlight);
+					g.fillRect(visibleRect.x,textArea.currentCaretY,
+									visibleRect.width, height);
+				}
+
+			} // End of if (caret.getDot()==caret.getMark()).
+
+		} // End of if (textArea.isCurrentLineHighlightEnabled()...
+
+	}
+
+
+	/**
+	 * Paints any line highlights.
+	 *
+	 * @param g The graphics context.
+	 */
+	protected void paintLineHighlights(Graphics g) {
+		LineHighlightManager lhm = textArea.getLineHighlightManager();
+		if (lhm!=null) {
+			lhm.paintLineHighlights(g);
+		}
+	}
+
+
+	/**
+	 * Draws the "margin line" if enabled.
+	 *
+	 * @param g The graphics context to paint with.
+	 * @param visibleRect The visible rectangle of this text area.
+	 */
+	protected void paintMarginLine(Graphics g, Rectangle visibleRect) {
+		if (textArea.isMarginLineEnabled()) {
+			g.setColor(textArea.getMarginLineColor());
+			Insets insets = textArea.getInsets();
+			int marginLineX = textArea.getMarginLinePixelLocation() +
+							(insets==null ? 0 : insets.left);
+			g.drawLine(marginLineX,visibleRect.y,
+						marginLineX,visibleRect.y+visibleRect.height);
+		}
+	}
+
+
+	/**
+	 * Returns the y-coordinate of the specified line.<p>
+	 *
+	 * The default implementation is equivalent to:
+	 * <pre>
+	 * int startOffs = textArea.getLineStartOffset(line);
+	 * return yForLineContaining(startOffs);</code>
+	 * </pre>
+	 *
+	 * Subclasses that can calculate this value more quickly than traditional
+	 * {@link #modelToView(JTextComponent, int)} calls should override this
+	 * method to do so. This method may be used when the entire bounding box
+	 * isn't needed, to speed up rendering.
+	 *
+	 * @param line The line number.
+	 * @return The y-coordinate of the top of the line, or <code>-1</code> if
+	 *         this text area doesn't yet have a positive size or the line is
+	 *         hidden (i.e. from folding).
+	 * @throws BadLocationException If <code>line</code> isn't a valid line
+	 *         number for this document.
+	 */
+	public int yForLine(int line) throws BadLocationException {
+		int startOffs = textArea.getLineStartOffset(line);
+		return yForLineContaining(startOffs);
+	}
+
+
+	/**
+	 * Returns the y-coordinate of the line containing an offset.<p>
+	 *
+	 * The default implementation is equivalent to:
+	 * <pre>
+	 * int line = textArea.getLineOfOffset(offs);
+	 * int startOffs = textArea.getLineStartOffset(line);
+	 * return modelToView(startOffs).y;</code>
+	 * </pre>
+	 *
+	 * Subclasses that can calculate this value more quickly than traditional
+	 * {@link #modelToView(JTextComponent, int)} calls should override this
+	 * method to do so. This method may be used when the entire bounding box
+	 * isn't needed, to speed up rendering.
+	 *
+	 * @param offs The offset info the document.
+	 * @return The y-coordinate of the top of the offset, or <code>-1</code> if
+	 *         this text area doesn't yet have a positive size or the line is
+	 *         hidden (i.e. from folding).
+	 * @throws BadLocationException If <code>offs</code> isn't a valid offset
+	 *         into the document.
+	 */
+	public int yForLineContaining(int offs) throws BadLocationException {
+		Rectangle r = modelToView(textArea, offs);
+		return r!=null ? r.y : -1;
+	}
+
+
+	/**
+	 * Registered in the ActionMap.
+	 */
+	class FocusAction extends AbstractAction {
+
+		public void actionPerformed(ActionEvent e) {
+			textArea.requestFocus();
+		}
+
+		public boolean isEnabled() {
+			return textArea.isEditable();
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RTextScrollPane.java b/src/org/fife/ui/rtextarea/RTextScrollPane.java
new file mode 100644
index 0000000..f2a90d7
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RTextScrollPane.java
@@ -0,0 +1,236 @@
+/*
+ * 11/14/2003
+ *
+ * RTextScrollPane.java - A JScrollPane that will only accept RTextAreas
+ * so that it can display line numbers, fold indicators, and icons.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Font;
+import javax.swing.JScrollPane;
+
+
+/**
+ * An extension of <code>javax.swing.JScrollPane</code> that will only take
+ * <code>RTextArea</code>s for its view.  This class has the ability to show:
+ * <ul>
+ *    <li>Line numbers
+ *    <li>Per-line icons (for bookmarks, debugging breakpoints, error markers, etc.)
+ *    <li>+/- icons to denote code folding regions.
+ * </ul>
+ *
+ * The actual "meat" of these extras is contained in the {@link Gutter} class.
+ * Each <code>RTextScrollPane</code> has a <code>Gutter</code> instance that
+ * it uses as its row header.  The gutter is only made visible when one of its
+ * features is being used (line numbering, folding, and/or icons).
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+public class RTextScrollPane extends JScrollPane {
+
+	private RTextArea textArea;
+	private Gutter gutter;
+
+
+	/**
+	 * Constructor.  If you use this constructor, you must call
+	 * {@link #setViewportView(Component)} and pass in an {@link RTextArea}
+	 * for this scroll pane to render line numbers properly.
+	 */
+	public RTextScrollPane() {
+		this(null, true);
+	}
+
+
+	/**
+	 * Creates a scroll pane.  A default value will be used for line number
+	 * color (gray), and the current line's line number will be highlighted.
+	 *
+	 * @param textArea The text area this scroll pane will contain.
+	 */
+	public RTextScrollPane(RTextArea textArea) {
+		this(textArea, true);
+	}
+
+
+	/**
+	 * Creates a scroll pane.  A default value will be used for line number
+	 * color (gray), and the current line's line number will be highlighted.
+	 *
+	 * @param textArea The text area this scroll pane will contain.  If this is
+	 *        <code>null</code>, you must call
+	 *        {@link #setViewportView(Component)}, passing in an
+	 *        {@link RTextArea}.
+	 * @param lineNumbers Whether line numbers should be enabled.
+	 */
+	public RTextScrollPane(RTextArea textArea, boolean lineNumbers) {
+		this(textArea, lineNumbers, Color.GRAY);
+	}
+
+
+	/**
+	 * Creates a scroll pane with preferred size (width, height).
+	 *
+	 * @param area The text area this scroll pane will contain.  If this is
+	 *        <code>null</code>, you must call
+	 *        {@link #setViewportView(Component)}, passing in an
+	 *        {@link RTextArea}.
+	 * @param lineNumbers Whether line numbers are initially enabled.
+	 * @param lineNumberColor The color to use for line numbers.
+	 */
+	public RTextScrollPane(RTextArea area, boolean lineNumbers,
+							Color lineNumberColor) {
+
+		super(area);
+
+		// Create the text area and set it inside this scroll bar area.
+		textArea = area;
+
+		// Create the gutter for this document.
+		Font defaultFont = new Font("Monospaced", Font.PLAIN, 12);
+		gutter = new Gutter(textArea);
+		gutter.setLineNumberFont(defaultFont);
+		gutter.setLineNumberColor(lineNumberColor);
+		setLineNumbersEnabled(lineNumbers);
+
+		// Set miscellaneous properties.
+		setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS);
+		setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_AS_NEEDED);
+
+	}
+
+
+	/**
+	 * Ensures the gutter is visible if it's showing anything.
+	 */
+	private void checkGutterVisibility() {
+		int count = gutter.getComponentCount();
+		if (count==0) {
+			if (getRowHeader()!=null && getRowHeader().getView()==gutter) {
+				setRowHeaderView(null);
+			}
+		}
+		else {
+			if (getRowHeader()==null || getRowHeader().getView()==null) {
+				setRowHeaderView(gutter);
+			}
+		}
+	}
+
+
+	/**
+	 * Returns the gutter.
+	 *
+	 * @return The gutter.
+	 */
+	public Gutter getGutter() {
+		return gutter;
+	}
+
+
+	/**
+	 * Returns <code>true</code> if the line numbers are enabled and visible.
+	 *
+	 * @return Whether or not line numbers are visible.
+	 * @see #setLineNumbersEnabled(boolean)
+	 */
+	public boolean getLineNumbersEnabled() {
+		return gutter.getLineNumbersEnabled();
+	}
+
+
+	/**
+	 * Returns the text area being displayed.
+	 *
+	 * @return The text area.
+	 * @see #setViewportView(Component)
+	 */
+	public RTextArea getTextArea() {
+		return (RTextArea)getViewport().getView();
+	}
+
+
+	/**
+	 * Returns whether the fold indicator is enabled.
+	 *
+	 * @return Whether the fold indicator is enabled.
+	 * @see #setFoldIndicatorEnabled(boolean)
+	 */
+	public boolean isFoldIndicatorEnabled() {
+		return gutter.isFoldIndicatorEnabled();
+	}
+
+
+	/**
+	 * Returns whether the icon row header is enabled.
+	 *
+	 * @return Whether the icon row header is enabled.
+	 * @see #setIconRowHeaderEnabled(boolean)
+	 */
+	public boolean isIconRowHeaderEnabled() {
+		return gutter.isIconRowHeaderEnabled();
+	}
+
+
+	/**
+	 * Toggles whether the fold indicator is enabled.
+	 *
+	 * @param enabled Whether the fold indicator should be enabled.
+	 * @see #isFoldIndicatorEnabled()
+	 */
+	public void setFoldIndicatorEnabled(boolean enabled) {
+		gutter.setFoldIndicatorEnabled(enabled);
+		checkGutterVisibility();
+	}
+
+
+	/**
+	 * Toggles whether the icon row header (used for breakpoints, bookmarks,
+	 * etc.) is enabled.
+	 *
+	 * @param enabled Whether the icon row header is enabled.
+	 * @see #isIconRowHeaderEnabled()
+	 */
+	public void setIconRowHeaderEnabled(boolean enabled) {
+		gutter.setIconRowHeaderEnabled(enabled);
+		checkGutterVisibility();
+	}
+
+
+	/**
+	 * Toggles whether or not line numbers are visible.
+	 *
+	 * @param enabled Whether or not line numbers should be visible.
+	 * @see #getLineNumbersEnabled()
+	 */
+	public void setLineNumbersEnabled(boolean enabled) {
+		gutter.setLineNumbersEnabled(enabled);
+		checkGutterVisibility();
+	}
+
+
+	/**
+	 * Sets the view for this scroll pane.  This must be an {@link RTextArea}.
+	 *
+	 * @param view The new view.
+	 * @see #getTextArea()
+	 */
+	public void setViewportView(Component view) {
+		if (!(view instanceof RTextArea)) {
+			throw new IllegalArgumentException("view must be an RTextArea");
+		}
+		super.setViewportView(view);
+		textArea = (RTextArea)view;
+		if (gutter!=null) {
+			gutter.setTextArea(textArea);
+		}
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RUndoManager.java b/src/org/fife/ui/rtextarea/RUndoManager.java
new file mode 100644
index 0000000..0e52043
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RUndoManager.java
@@ -0,0 +1,251 @@
+/*
+ * 12/06/2008
+ *
+ * RUndoManager.java - Handles undo/redo behavior for RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.util.ResourceBundle;
+import javax.swing.Action;
+import javax.swing.UIManager;
+import javax.swing.event.UndoableEditEvent;
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+import javax.swing.undo.CompoundEdit;
+import javax.swing.undo.UndoManager;
+import javax.swing.undo.UndoableEdit;
+
+
+/**
+ * This class manages undos/redos for a particular editor pane.  It groups
+ * all undos that occur one character position apart together, to avoid
+ * Java's horrible "one character at a time" undo behavior.  It also
+ * recognizes "replace" actions (i.e., text is selected, then the user
+ * types), and treats it as a single action, instead of a remove/insert
+ * action pair.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RUndoManager extends UndoManager {
+
+	private RCompoundEdit compoundEdit;
+	private RTextArea textArea;
+	private int lastOffset;
+	private String cantUndoText;
+	private String cantRedoText;
+
+	private int internalAtomicEditDepth;
+
+	private static final String MSG	= "org.fife.ui.rtextarea.RTextArea";
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The parent text area.
+	 */
+	public RUndoManager(RTextArea textArea) {
+		this.textArea = textArea;
+		ResourceBundle msg = ResourceBundle.getBundle(MSG);
+		cantUndoText = msg.getString("Action.CantUndo.Name");
+		cantRedoText = msg.getString("Action.CantRedo.Name");
+	}
+
+
+	/**
+	 * Begins an "atomic" edit.  This method is called when RTextArea
+	 * KNOWS that some edits should be compound automatically, such as
+	 * when the user is typing in overwrite mode (the deletion of the
+	 * current char + insertion of the new one) or the playing back of a
+	 * macro.
+	 *
+	 * @see #endInternalAtomicEdit()
+	 */
+	public void beginInternalAtomicEdit() {
+		if (++internalAtomicEditDepth==1) {
+			if (compoundEdit!=null)
+				compoundEdit.end();
+			compoundEdit = new RCompoundEdit();
+		}
+	}
+
+
+	/**
+	 * Ends an "atomic" edit.
+	 *
+	 * @see #beginInternalAtomicEdit()
+	 */
+	public void endInternalAtomicEdit() {
+		if (internalAtomicEditDepth>0 && --internalAtomicEditDepth==0) {
+			addEdit(compoundEdit);
+			compoundEdit.end();
+			compoundEdit = null;
+			updateActions();	// Needed to show the new display name.
+		}
+	}
+
+
+	/**
+	 * Returns the localized "Can't Redo" string.
+	 *
+	 * @return The localized "Can't Redo" string.
+	 * @see #getCantUndoText()
+	 */
+	public String getCantRedoText() {
+		return cantRedoText;
+	}
+
+
+	/**
+	 * Returns the localized "Can't Undo" string.
+	 *
+	 * @return The localized "Can't Undo" string.
+	 * @see #getCantRedoText()
+	 */
+	public String getCantUndoText() {
+		return cantUndoText;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void redo() throws CannotRedoException {
+		super.redo();
+		updateActions();
+	}
+
+
+	private RCompoundEdit startCompoundEdit(UndoableEdit edit) {
+		lastOffset = textArea.getCaretPosition();
+		compoundEdit = new RCompoundEdit();
+		compoundEdit.addEdit(edit);
+		addEdit(compoundEdit);
+		return compoundEdit;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void undo() throws CannotUndoException {
+		super.undo();
+		updateActions();
+	}
+
+
+	public void undoableEditHappened(UndoableEditEvent e) {
+
+		// This happens when the first undoable edit occurs, and
+		// just after an undo.  So, we need to update our actions.
+		if (compoundEdit==null) {
+			compoundEdit = startCompoundEdit(e.getEdit());
+			updateActions();
+			return;
+		}
+
+		else if (internalAtomicEditDepth>0) {
+			compoundEdit.addEdit(e.getEdit());
+			return;
+		}
+
+		// This happens when there's already an undo that has occurred.
+		// Test to see if these undos are on back-to-back characters,
+		// and if they are, group them as a single edit.  Since an
+		// undo has already occurred, there is no need to update our
+		// actions here.
+		int diff = textArea.getCaretPosition() - lastOffset;
+		// "<=1" allows contiguous "overwrite mode" key presses to be
+		// grouped together.
+		if (Math.abs(diff)<=1) {//==1) {
+			compoundEdit.addEdit(e.getEdit());
+			lastOffset += diff;
+			//updateActions();
+			return;
+		}
+
+		// This happens when this UndoableEdit didn't occur at the
+		// character just after the previous undlabeledit.  Since an
+		// undo has already occurred, there is no need to update our
+		// actions here either.
+		compoundEdit.end();
+		compoundEdit = startCompoundEdit(e.getEdit());
+		//updateActions();
+
+	}
+
+
+	/**
+	 * Ensures that undo/redo actions are enabled appropriately and have
+	 * descriptive text at all times.
+	 */
+	public void updateActions() {
+
+		String text;
+
+		Action a = RTextArea.getAction(RTextArea.UNDO_ACTION);
+		if (canUndo()) {
+			a.setEnabled(true);
+			text = getUndoPresentationName();
+			a.putValue(Action.NAME, text);
+			a.putValue(Action.SHORT_DESCRIPTION, text);
+		}
+		else {
+			if (a.isEnabled()) {
+				a.setEnabled(false);
+				text = cantUndoText;
+				a.putValue(Action.NAME, text);
+				a.putValue(Action.SHORT_DESCRIPTION, text);
+			}
+		}
+
+		a = RTextArea.getAction(RTextArea.REDO_ACTION);
+		if (canRedo()) {
+			a.setEnabled(true);
+			text = getRedoPresentationName();
+			a.putValue(Action.NAME, text);
+			a.putValue(Action.SHORT_DESCRIPTION, text);
+		}
+		else {
+			if (a.isEnabled()) {
+				a.setEnabled(false);
+				text = cantRedoText;
+				a.putValue(Action.NAME, text);
+				a.putValue(Action.SHORT_DESCRIPTION, text);
+			}
+		}
+
+	}
+
+	/**
+	 * The edit used by {@link RUndoManager}.
+	 */
+	class RCompoundEdit extends CompoundEdit {
+
+		public String getUndoPresentationName() {
+			return UIManager.getString("AbstractUndoableEdit.undoText");
+		}
+
+		public String getRedoPresentationName() {
+			return UIManager.getString("AbstractUndoableEdit.redoText");
+		}
+
+		public boolean isInProgress() {
+			return false;
+		}
+
+		public void undo() throws CannotUndoException {
+			if (compoundEdit!=null)
+				compoundEdit.end();
+			super.undo();
+			compoundEdit = null;
+		}
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RecordableTextAction.java b/src/org/fife/ui/rtextarea/RecordableTextAction.java
new file mode 100644
index 0000000..f278c08
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RecordableTextAction.java
@@ -0,0 +1,289 @@
+/*
+ * 08/19/2004
+ *
+ * RecordableTextAction.java - An action that can be recorded and replayed
+ * in an RTextArea macro.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.event.ActionEvent;
+import java.util.ResourceBundle;
+import javax.swing.Icon;
+import javax.swing.KeyStroke;
+import javax.swing.text.DefaultEditorKit;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.TextAction;
+
+
+/**
+ * The base action used by the actions defined in
+ * {@link RTextAreaEditorKit}.  This action is what allows instances of
+ * <code>RTextArea</code> to record keystrokes into "macros;" if an action is
+ * recordable and occurs while the user is recording a macro, it adds itself to
+ * the currently-being-recorded macro.
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ */
+public abstract class RecordableTextAction extends TextAction {
+
+	/**
+	 * Whether or not this text action should be recorded in a macro.
+	 */
+	private boolean isRecordable;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The text (name) associated with the action.
+	 */
+	public RecordableTextAction(String text) {
+		this(text, null, null, null, null);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The text (name) associated with the action.
+	 * @param icon The icon associated with the action.
+	 * @param desc The description of the action.
+	 * @param mnemonic The mnemonic for the action.
+	 * @param accelerator The accelerator key for the action.
+	 */
+	public RecordableTextAction(String text, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+		super(text);
+		putValue(SMALL_ICON, icon);
+		putValue(SHORT_DESCRIPTION, desc);
+		putValue(ACCELERATOR_KEY, accelerator);
+		putValue(MNEMONIC_KEY, mnemonic);
+		setRecordable(true);
+	}
+
+
+	/**
+	 * This method is final so that you cannot override it and mess up the
+	 * macro-recording part of it.  The actual meat of the action is in
+	 * <code>actionPerformedImpl</code>.
+	 *
+	 * @param e The action being performed.
+	 * @see #actionPerformedImpl
+	 */
+	public final void actionPerformed(ActionEvent e) {
+
+		JTextComponent textComponent = getTextComponent(e);
+		if (textComponent instanceof RTextArea) {
+			RTextArea textArea = (RTextArea)textComponent;
+			//System.err.println("Recordable action: " + getMacroID());
+			if (RTextArea.isRecordingMacro() && isRecordable()) {
+				int mod = e.getModifiers();
+				// We ignore keypresses involving ctrl/alt/meta if they are
+				// "default" keypresses - i.e., they aren't some special
+				// action like paste (e.g., paste would return Ctrl+V, but
+				// its action would be "paste-action").
+				String macroID = getMacroID();
+//System.err.println(macroID);
+//System.err.println("... " + (mod&ActionEvent.ALT_MASK));
+//System.err.println("... " + (mod&ActionEvent.CTRL_MASK));
+//System.err.println("... " + (mod&ActionEvent.META_MASK));
+				if (!DefaultEditorKit.defaultKeyTypedAction.equals(macroID)
+					|| (
+						(mod&ActionEvent.ALT_MASK)==0 &&
+						(mod&ActionEvent.CTRL_MASK)==0 &&
+						(mod&ActionEvent.META_MASK)==0)
+					) {
+					String command = e.getActionCommand();
+					RTextArea.addToCurrentMacro(macroID, command);
+					//System.err.println("... recording it!");
+				}
+			}
+			actionPerformedImpl(e, textArea);
+		}
+
+	}
+
+
+	/**
+	 * The actual meat of the action.  If you wish to subclass this action
+	 * and modify its behavior, this is the method to override.
+	 *
+	 * @param e The action being performed.
+	 * @param textArea The text area "receiving" the action.
+	 * @see #actionPerformed
+	 */
+	public abstract void actionPerformedImpl(ActionEvent e, RTextArea textArea);
+
+
+	/**
+	 * Returns the accelerator for this action.
+	 *
+	 * @return The accelerator.
+	 * @see #setAccelerator(KeyStroke)
+	 */
+	public KeyStroke getAccelerator() {
+		return (KeyStroke)getValue(ACCELERATOR_KEY);
+	}
+
+
+	/**
+	 * Returns the description for this action.
+	 *
+	 * @return The description.
+	 */
+	public String getDescription() {
+		return (String)getValue(SHORT_DESCRIPTION);
+	}
+
+
+	/**
+	 * Returns the icon for this action.
+	 *
+	 * @return The icon.
+	 */
+	public Icon getIcon() {
+		return (Icon)getValue(SMALL_ICON);
+	}
+
+
+	/**
+	 * Returns the identifier for this macro.  This method makes it so that you
+	 * can create an instance of the <code>RTextAreaEditorKit.CutAction</code>
+	 * action, for example, rename it to "Remove", and it will still be
+	 * recorded as a "cut" action.  Subclasses should return a unique string
+	 * from this method; preferably the name of the action.<p>
+	 * If you subclass a <code>RecordableTextAction</code>, you should NOT
+	 * override this method; if you do, the action may not be properly
+	 * recorded in a macro.
+	 *
+	 * @return The internally-used macro ID.
+	 */
+	public abstract String getMacroID();
+
+
+	/**
+	 * Returns the mnemonic for this action.
+	 *
+	 * @return The mnemonic, or <code>-1</code> if not defined.
+	 * @see #setMnemonic(char)
+	 * @see #setMnemonic(Integer)
+	 */
+	public int getMnemonic() {
+		Integer i = (Integer)getValue(MNEMONIC_KEY);
+		return i!=null ? i.intValue() : -1;
+	}
+
+
+	/**
+	 * Returns the name of this action.
+	 *
+	 * @return The name of this action.
+	 * @see #setName(String)
+	 */
+	public String getName() {
+		return (String)getValue(NAME);
+	}
+
+
+	/**
+	 * Returns whether or not this action will be recorded and replayed in
+	 * a macro.
+	 *
+	 * @return Whether or not this action will be recorded and replayed.
+	 * @see #setRecordable
+	 */
+	public boolean isRecordable() {
+		return isRecordable;
+	}
+
+
+	/**
+	 * Sets the accelerator for this action.
+	 *
+	 * @param accelerator The new accelerator.
+	 * @see #getAccelerator()
+	 */
+	public void setAccelerator(KeyStroke accelerator) {
+		putValue(ACCELERATOR_KEY, accelerator);
+	}
+
+
+	/**
+	 * Sets the mnemonic for this action.
+	 *
+	 * @param mnemonic The new mnemonic.
+	 * @see #setMnemonic(Integer)
+	 * @see #getMnemonic()
+	 */
+	public void setMnemonic(char mnemonic) {
+		setMnemonic(new Integer(mnemonic));
+	}
+
+
+	/**
+	 * Sets the mnemonic for this action.
+	 *
+	 * @param mnemonic The new mnemonic.
+	 * @see #setMnemonic(char)
+	 * @see #getMnemonic()
+	 */
+	public void setMnemonic(Integer mnemonic) {
+		putValue(MNEMONIC_KEY, mnemonic);
+	}
+
+
+	/**
+	 * Sets the name of this action.
+	 *
+	 * @param name The new name.
+	 * @see #getName()
+	 */
+	public void setName(String name) {
+		putValue(NAME, name);
+	}
+
+
+	/**
+	 * Sets the name, mnemonic, and description of this action.
+	 *
+	 * @param msg The resource bundle.
+	 * @param keyRoot The root of the keys for the properties.
+	 *        "<code>.Name</code>", "<code>.Mnemonic</code>", and
+	 *        "<code>.Desc</code>" will be appended to create the key for each
+	 *        property.
+	 */
+	public void setProperties(ResourceBundle msg, String keyRoot) {
+		setName(msg.getString(keyRoot + ".Name"));
+		setMnemonic(msg.getString(keyRoot + ".Mnemonic").charAt(0));
+		setShortDescription(msg.getString(keyRoot + ".Desc"));
+	}
+
+
+	/**
+	 * Sets whether or not this action will be recorded and replayed in
+	 * a macro.
+	 *
+	 * @param recordable Whether or not this action should be recorded
+	 *        and replayed.
+	 * @see #isRecordable
+	 */
+	public void setRecordable(boolean recordable) {
+		isRecordable = recordable;
+	}
+
+
+	/**
+	 * Sets the short description for this action.
+	 *
+	 * @param shortDesc The short description for this action.
+	 */
+	public void setShortDescription(String shortDesc) {
+		putValue(SHORT_DESCRIPTION, shortDesc);
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RegExReplaceInfo.java b/src/org/fife/ui/rtextarea/RegExReplaceInfo.java
new file mode 100644
index 0000000..a3da689
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RegExReplaceInfo.java
@@ -0,0 +1,85 @@
+/*
+ * 02/19/2006
+ *
+ * RegExReplaceInfo.java - Information about a regex text match.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+
+/**
+ * Information on how to implement a regular expression "replace" operation.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class RegExReplaceInfo {
+
+	private String matchedText;
+	private int startIndex;
+	private int endIndex;
+	private String replacement;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param matchedText The text that matched the regular expression.
+	 * @param start The start index of the matched text in the
+	 *        <code>CharSequence</code> searched.
+	 * @param end The end index of the matched text in the
+	 *        <code>CharSequence</code> searched.
+	 * @param replacement The text to replace the matched text with.  This
+	 *        string has any matched groups and character escapes replaced.
+	 */
+	public RegExReplaceInfo(String matchedText, int start, int end,
+						String replacement) {
+		this.matchedText = matchedText;
+		this.startIndex = start;
+		this.endIndex = end;
+		this.replacement = replacement;
+	}
+
+	/**
+	 * Returns the end index of the matched text.
+	 *
+	 * @return The end index of the matched text in the document searched.
+	 * @see #getMatchedText()
+	 * @see #getEndIndex()
+	 */
+	public int getEndIndex() {
+		return endIndex;
+	}
+
+	/**
+	 * Returns the text that matched the regular expression.
+	 *
+	 * @return The matched text.
+	 */
+	public String getMatchedText() {
+		return matchedText;
+	}
+
+	/**
+	 * Returns the string to replaced the matched text with.
+	 * 
+	 * @return The string to replace the matched text with.
+	 */
+	public String getReplacement() {
+		return replacement;
+	}
+
+	/**
+	 * Returns the start index of the matched text.
+	 *
+	 * @return The start index of the matched text in the document searched.
+	 * @see #getMatchedText()
+	 * @see #getEndIndex()
+	 */
+	public int getStartIndex() {
+		return startIndex;
+	}
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/SearchContext.java b/src/org/fife/ui/rtextarea/SearchContext.java
new file mode 100644
index 0000000..c379d78
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/SearchContext.java
@@ -0,0 +1,244 @@
+/*
+ * 02/17/2012
+ *
+ * SearchContext.java - Container for options of a search/replace operation.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+
+/**
+ * Contains information about a find/replace operation.  Applications can
+ * keep an instance of this class around and use it to maintain the user's
+ * selection for options such as "match case," "regular expression," etc.,
+ * between search operations.  They can then pass the instance as a parameter
+ * to the public {@link SearchEngine} methods to do the actual searching.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see SearchEngine
+ */
+public class SearchContext {
+
+	private String searchFor;
+
+	private String replaceWith;
+
+	private boolean forward;
+
+	private boolean matchCase;
+
+	private boolean wholeWord;
+
+	private boolean regex;
+
+	private boolean selectionOnly;
+
+
+	/**
+	 * Creates a new search context.  Specifies a forward search,
+	 * case-insensitive, not whole-word, not a regular expression.
+	 */
+	public SearchContext() {
+		this(null);
+	}
+
+
+	/**
+	 * Creates a new search context.  Specifies a forward search,
+	 * case-insensitive, not whole-word, not a regular expression.
+	 *
+	 * @param searchFor The text to search for.
+	 */
+	public SearchContext(String searchFor) {
+		this(searchFor, false);
+	}
+
+
+	/**
+	 * Creates a new search context.  Specifies a forward search, not
+	 * whole-word, not a regular expression.
+	 *
+	 * @param searchFor The text to search for.
+	 * @param matchCase Whether to do a case-sensitive search.
+	 */
+	public SearchContext(String searchFor, boolean matchCase) {
+		this.searchFor = searchFor;
+		this.matchCase = matchCase;
+		forward = true;
+	}
+
+
+	/**
+	 * Returns whether case should be honored while searching.
+	 *
+	 * @return Whether case should be honored.
+	 * @see #setMatchCase(boolean)
+	 */
+	public boolean getMatchCase() {
+		return matchCase;
+	}
+
+
+	/**
+	 * Returns the text to replace with, if doing a replace operation.
+	 *
+	 * @return The text to replace with.
+	 * @see #setReplaceWith(String)
+	 * @see #getSearchFor()
+	 */
+	public String getReplaceWith() {
+		return replaceWith;
+	}
+
+
+	/**
+	 * Returns the text to search for.
+	 *
+	 * @return The text to search for.
+	 * @see #setSearchFor(String)
+	 * @see #getReplaceWith()
+	 */
+	public String getSearchFor() {
+		return searchFor;
+	}
+
+
+	/**
+	 * Returns whether the search should be forward through the text (vs.
+	 * backwards).
+	 *
+	 * @return Whether we should search forwards.
+	 * @see #setSearchForward(boolean)
+	 */
+	public boolean getSearchForward() {
+		return forward;
+	}
+
+
+	/**
+	 * Returns whether the search should only be done in the selected text.
+	 * This flag is currently not supported.
+	 *
+	 * @return Whether only the selected text should be searched.
+	 * @see #setSearchSelectionOnly(boolean)
+	 */
+	public boolean getSearchSelectionOnly() {
+		return selectionOnly;
+	}
+
+
+	/**
+	 * Returns whether only "whole word" matches should be returned.  A match
+	 * is considered to be "whole word" if the character on either side of the
+	 * matched text is a non-word character, or if there is no character on
+	 * one side of the word, such as when it's at the beginning or end of a
+	 * line.
+	 *
+	 * @return Whether only "whole word" matches should be returned.
+	 * @see #setWholeWord(boolean)
+	 */
+	public boolean getWholeWord() {
+		return wholeWord;
+	}
+
+
+	/**
+	 * Returns whether a regular expression search should be done.
+	 *
+	 * @return Whether a regular expression search should be done.
+	 * @see #setRegularExpression(boolean)
+	 */
+	public boolean isRegularExpression() {
+		return regex;
+	}
+
+
+	/**
+	 * Sets whether case should be honored while searching.
+	 *
+	 * @param matchCase Whether case should be honored.
+	 * @see #getMatchCase()
+	 */
+	public void setMatchCase(boolean matchCase) {
+		this.matchCase = matchCase;
+	}
+
+
+	/**
+	 * Sets whether a regular expression search should be done.
+	 *
+	 * @param regex Whether a regular expression search should be done.
+	 * @see #isRegularExpression()
+	 */
+	public void setRegularExpression(boolean regex) {
+		this.regex = regex;
+	}
+
+
+	/**
+	 * Sets the text to replace with, if doing a replace operation.
+	 *
+	 * @param replaceWith The text to replace with.
+	 * @see #getReplaceWith()
+	 * @see #setSearchFor(String)
+	 */
+	public void setReplaceWith(String replaceWith) {
+		this.replaceWith = replaceWith;
+	}
+
+
+	/**
+	 * Sets the text to search for.
+	 *
+	 * @param searchFor The text to search for.
+	 * @see #getSearchFor()
+	 * @see #setReplaceWith(String)
+	 */
+	public void setSearchFor(String searchFor) {
+		this.searchFor = searchFor;
+	}
+
+
+	/**
+	 * Sets whether the search should be forward through the text (vs.
+	 * backwards).
+	 *
+	 * @param forward Whether we should search forwards.
+	 * @see #getSearchForward()
+	 */
+	public void setSearchForward(boolean forward) {
+		this.forward = forward;
+	}
+
+
+	/**
+	 * Sets whether only the selected text should be searched.
+	 * This flag is currently not supported.
+	 *
+	 * @param selectionOnly Whether only selected text should be searched.
+	 * @see #getSearchSelectionOnly()
+	 */
+	public void setSearchSelectionOnly(boolean selectionOnly) {
+		this.selectionOnly = selectionOnly;
+	}
+
+
+	/**
+	 * Sets whether only "whole word" matches should be returned.  A match
+	 * is considered to be "whole word" if the character on either side of the
+	 * matched text is a non-word character, or if there is no character on
+	 * one side of the word, such as when it's at the beginning or end of a
+	 * line.
+	 *
+	 * @param wholeWord Whether only "whole word" matches should be returned.
+	 * @see #getWholeWord()
+	 */
+	public void setWholeWord(boolean wholeWord) {
+		this.wholeWord = wholeWord;
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/SearchEngine.java b/src/org/fife/ui/rtextarea/SearchEngine.java
new file mode 100644
index 0000000..1c7f1d9
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/SearchEngine.java
@@ -0,0 +1,833 @@
+/*
+ * 02/19/2006
+ *
+ * SearchEngine.java - Handles find/replace operations in an RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+import javax.swing.JTextArea;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * A singleton class that can perform advanced find/replace operations
+ * in an {@link RTextArea}.  Simply create a {@link SearchContext} and call
+ * one of the following methods:
+ * 
+ * <ul>
+ *    <li>{@link #find(JTextArea, SearchContext)}
+ *    <li>{@link #replace(RTextArea, SearchContext)}
+ *    <li>{@link #replaceAll(RTextArea, SearchContext)}
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see SearchContext
+ */
+public class SearchEngine {
+
+
+	/**
+	 * Private constructor to prevent instantiation.
+	 */
+	private SearchEngine() {
+	}
+
+
+	/**
+	 * Finds the next instance of the string/regular expression specified
+	 * from the caret position.  If a match is found, it is selected in this
+	 * text area.
+	 *
+	 * @param textArea The text area in which to search.
+	 * @param context What to search for and all search options.
+	 * @return Whether a match was found (and thus selected).
+	 * @throws PatternSyntaxException If this is a regular expression search
+	 *         but the search text is an invalid regular expression.
+	 * @see #replace(RTextArea, SearchContext)
+	 * @see #replaceAll(RTextArea, SearchContext)
+	 */
+	public static boolean find(JTextArea textArea, SearchContext context) {
+
+		String text = context.getSearchFor();
+		if (text==null || text.length()==0) {
+			return false;
+		}
+
+		// Be smart about what position we're "starting" at.  We don't want
+		// to find a match in the currently selected text (if any), so we
+		// start searching AFTER the selection if searching forward, and
+		// BEFORE the selection if searching backward.
+		Caret c = textArea.getCaret();
+		boolean forward = context.getSearchForward();
+		int start = forward ? Math.max(c.getDot(), c.getMark()) :
+						Math.min(c.getDot(), c.getMark());
+
+		String findIn = getFindInText(textArea, start, forward);
+		if (findIn==null || findIn.length()==0) return false;
+
+		// Find the next location of the text we're searching for.
+		if (!context.isRegularExpression()) {
+			int pos = getNextMatchPos(text, findIn, forward,
+								context.getMatchCase(), context.getWholeWord());
+			findIn = null; // May help garbage collecting.
+			if (pos!=-1) {
+				// Without this, if JTextArea isn't in focus, selection
+				// won't appear selected.
+				c.setSelectionVisible(true);
+				pos = forward ? start+pos : pos;
+				selectAndPossiblyCenter(textArea, pos, pos+text.length());
+				return true;
+			}
+		}
+		else {
+			// Regex matches can have varying widths.  The returned point's
+			// x- and y-values represent the start and end indices of the
+			// match in findIn.
+			Point regExPos = getNextMatchPosRegEx(text, findIn, forward,
+								context.getMatchCase(), context.getWholeWord());
+			findIn = null; // May help garbage collecting.
+			if (regExPos!=null) {
+				// Without this, if JTextArea isn't in focus, selection
+				// won't appear selected.
+				c.setSelectionVisible(true);
+				if (forward) {
+					regExPos.translate(start, start);
+				}
+				selectAndPossiblyCenter(textArea, regExPos.x, regExPos.y);
+				return true;
+			}
+		}
+
+		// No match.
+		return false;
+
+	}
+
+
+	/**
+	 * Returns a <code>CharSequence</code> for a text area that doesn't make a
+	 * copy of its contents for iteration.  This conserves memory but is likely
+	 * just a tad slower.
+	 *
+	 * @param textArea The text area whose document is the basis for the
+	 *        <code>CharSequence</code>.
+	 * @param start The starting offset of the sequence (or ending offset if
+	 *        <code>forward</code> is <code>false</code>).
+	 * @param forward Whether we're searching forward or backward.
+	 * @return The character sequence.
+	 */
+	private static CharSequence getFindInCharSequence(RTextArea textArea,
+			int start, boolean forward) {
+		RDocument doc = (RDocument)textArea.getDocument();
+		int csStart = 0;
+		int csEnd = 0;
+		if (forward) {
+			csStart = start;
+			csEnd = doc.getLength();
+		}
+		else {
+			csStart = 0;
+			csEnd = start;
+		}
+		return new RDocumentCharSequence(doc, csStart, csEnd);
+	}
+
+
+	/**
+	 * Returns the text in which to search, as a string.  This is used
+	 * internally to grab the smallest buffer possible in which to search.
+	 */
+	private static String getFindInText(JTextArea textArea, int start,
+									boolean forward) {
+
+		// Be smart about the text we grab to search in.  We grab more than
+		// a single line because our searches can return multi-line results.
+		// We copy only the chars that will be searched through.
+		String findIn = null;
+		try {
+			if (forward) {
+				findIn = textArea.getText(start,
+							textArea.getDocument().getLength()-start);
+			}
+			else { // backward
+				findIn = textArea.getText(0, start);
+			}
+		} catch (BadLocationException ble) {
+			// Never happens; findIn will be null anyway.
+			ble.printStackTrace();
+		}
+
+		return findIn;
+
+	}
+
+
+	/**
+	 * This method is called internally by
+	 * <code>getNextMatchPosRegExImpl</code> and is used to get the locations
+	 * of all regular-expression matches, and possibly their replacement
+	 * strings.<p>
+	 *
+	 * Returns either:
+	 * <ul>
+	 *   <li>A list of points representing the starting and ending positions
+	 *       of all matches returned by the specified matcher, or
+	 *   <li>A list of <code>RegExReplaceInfo</code>s describing the matches
+	 *       found by the matcher and the replacement strings for each.
+	 * </ul>
+	 *
+	 * If <code>replacement</code> is <code>null</code>, this method call is
+	 * assumed to be part of a "find" operation and points are returned.  If
+	 * if is non-<code>null</code>, it is assumed to be part of a "replace"
+	 * operation and the <code>RegExReplaceInfo</code>s are returned.<p>
+	 *
+	 * @param m The matcher.
+	 * @param replaceStr The string to replace matches with.  This is a
+	 *        "template" string and can contain captured group references in
+	 *        the form "<code>${digit}</code>".
+	 * @return A list of result objects.
+	 * @throws IndexOutOfBoundsException If <code>replaceStr</code> references
+	 *         an invalid group (less than zero or greater than the number of
+	 *         groups matched).
+	 */
+	private static List getMatches(Matcher m, String replaceStr) {
+		ArrayList matches = new ArrayList();
+		while (m.find()) {
+			Point loc = new Point(m.start(), m.end());
+			if (replaceStr==null) { // Find, not replace.
+				matches.add(loc);
+			}
+			else { // Replace.
+				matches.add(new RegExReplaceInfo(m.group(0), loc.x, loc.y,
+								getReplacementText(m, replaceStr)));
+			}
+		}
+		return matches;
+	}
+
+
+	/**
+	 * Searches <code>searchIn</code> for an occurrence of
+	 * <code>searchFor</code> either forwards or backwards, matching
+	 * case or not.<p>
+	 *
+	 * Most clients will have no need to call this method directly.
+	 *
+	 * @param searchFor The string to look for.
+	 * @param searchIn The string to search in.
+	 * @param forward Whether to search forward or backward in
+	 *        <code>searchIn</code>.
+	 * @param matchCase If <code>true</code>, do a case-sensitive search for
+	 *        <code>searchFor</code>.
+	 * @param wholeWord If <code>true</code>, <code>searchFor</code>
+	 *        occurrences embedded in longer words in <code>searchIn</code>
+	 *        don't count as matches.
+	 * @return The starting position of a match, or <code>-1</code> if no
+	 *         match was found.
+	 */
+	public static final int getNextMatchPos(String searchFor, String searchIn,
+								boolean forward, boolean matchCase,
+								boolean wholeWord) {
+
+		// Make our variables lower case if we're ignoring case.
+		if (!matchCase) {
+			return getNextMatchPosImpl(searchFor.toLowerCase(),
+								searchIn.toLowerCase(), forward,
+								matchCase, wholeWord);
+		}
+
+		return getNextMatchPosImpl(searchFor, searchIn, forward,
+								matchCase, wholeWord);
+
+	}
+
+
+	/**
+	 * Actually does the work of matching; assumes searchFor and searchIn
+	 * are already upper/lower-cased appropriately.<br>
+	 * The reason this method is here is to attempt to speed up
+	 * <code>FindInFilesDialog</code>; since it repeatedly calls
+	 * this method instead of <code>getNextMatchPos</code>, it gets better
+	 * performance as it no longer has to allocate a lower-cased string for
+	 * every call.
+	 *
+	 * @param searchFor The string to search for.
+	 * @param searchIn The string to search in.
+	 * @param goForward Whether the search is forward or backward.
+	 * @param matchCase Whether the search is case-sensitive.
+	 * @param wholeWord Whether only whole words should be matched.
+	 * @return The location of the next match, or <code>-1</code> if no
+	 *         match was found.
+	 */
+	private static final int getNextMatchPosImpl(String searchFor,
+								String searchIn, boolean goForward,
+								boolean matchCase, boolean wholeWord) {
+
+		if (wholeWord) {
+			int len = searchFor.length();
+			int temp = goForward ? 0 : searchIn.length();
+			int tempChange = goForward ? 1 : -1;
+			while (true) {
+				if (goForward)
+					temp = searchIn.indexOf(searchFor, temp);
+				else
+					temp = searchIn.lastIndexOf(searchFor, temp);
+				if (temp!=-1) {
+					if (isWholeWord(searchIn, temp, len)) {
+						return temp;
+					}
+					else {
+						temp += tempChange;
+						continue;
+					}
+				}
+				return temp; // Always -1.
+			}
+		}
+		else {
+			return goForward ? searchIn.indexOf(searchFor) :
+							searchIn.lastIndexOf(searchFor);
+		}
+
+	}
+
+
+	/**
+	 * Searches <code>searchIn</code> for an occurrence of <code>regEx</code>
+	 * either forwards or backwards, matching case or not.
+	 *
+	 * @param regEx The regular expression to look for.
+	 * @param searchIn The string to search in.
+	 * @param goForward Whether to search forward.  If <code>false</code>,
+	 *        search backward.
+	 * @param matchCase Whether or not to do a case-sensitive search for
+	 *        <code>regEx</code>.
+	 * @param wholeWord If <code>true</code>, <code>regEx</code>
+	 *        occurrences embedded in longer words in <code>searchIn</code>
+	 *        don't count as matches.
+	 * @return A <code>Point</code> representing the starting and ending
+	 *         position of the match, or <code>null</code> if no match was
+	 *         found.
+	 * @throws PatternSyntaxException If <code>regEx</code> is an invalid
+	 *         regular expression.
+	 * @see #getNextMatchPos
+	 */
+	private static Point getNextMatchPosRegEx(String regEx,
+							CharSequence searchIn, boolean goForward,
+							boolean matchCase, boolean wholeWord) {
+		return (Point)getNextMatchPosRegExImpl(regEx, searchIn, goForward,
+									matchCase, wholeWord, null);
+	}
+
+
+	/**
+	 * Searches <code>searchIn</code> for an occurrence of <code>regEx</code>
+	 * either forwards or backwards, matching case or not.
+	 *
+	 * @param regEx The regular expression to look for.
+	 * @param searchIn The string to search in.
+	 * @param goForward Whether to search forward.  If <code>false</code>,
+	 *        search backward.
+	 * @param matchCase Whether or not to do a case-sensitive search for
+	 *        <code>regEx</code>.
+	 * @param wholeWord If <code>true</code>, <code>regEx</code>
+	 *        occurrences embedded in longer words in <code>searchIn</code>
+	 *        don't count as matches.
+	 * @param replaceStr The string that will replace the match found (if
+	 *        a match is found).  The object returned will contain the
+	 *        replacement string with matched groups substituted.  If this
+	 *        value is <code>null</code>, it is assumed this call is part of a
+	 *        "find" instead of a "replace" operation.
+	 * @return If <code>replaceStr</code> is <code>null</code>, a
+	 *         <code>Point</code> representing the starting and ending points
+	 *         of the match.  If it is non-<code>null</code>, an object with
+	 *         information about the match and the morphed string to replace
+	 *         it with.  If no match is found, <code>null</code> is returned.
+	 * @throws PatternSyntaxException If <code>regEx</code> is an invalid
+	 *         regular expression.
+	 * @throws IndexOutOfBoundsException If <code>replaceStr</code> references
+	 *         an invalid group (less than zero or greater than the number of
+	 *         groups matched).
+	 * @see #getNextMatchPos
+	 */
+	private static Object getNextMatchPosRegExImpl(String regEx,
+							CharSequence searchIn, boolean goForward,
+							boolean matchCase, boolean wholeWord,
+							String replaceStr) {
+
+		if (wholeWord) {
+			regEx = "\\b" + regEx + "\\b";
+		}
+
+		// Make a pattern that takes into account whether or not to match case.
+		int flags = Pattern.MULTILINE; // '^' and '$' are done per line.
+		flags |= matchCase ? 0 : (Pattern.CASE_INSENSITIVE|Pattern.UNICODE_CASE);
+		Pattern pattern = Pattern.compile(regEx, flags);
+
+		// Make a Matcher to find the regEx instances.
+		Matcher m = pattern.matcher(searchIn);
+
+		// Search forwards
+		if (goForward) {
+			if (m.find()) {
+				if (replaceStr==null) { // Find, not replace.
+					return new Point(m.start(), m.end());
+				}
+				// Otherwise, replace
+				return new RegExReplaceInfo(m.group(0),
+						m.start(), m.end(),
+						getReplacementText(m, replaceStr));
+			}
+		}
+
+		// Search backwards
+		else {
+			List matches = getMatches(m, replaceStr);
+			if (!matches.isEmpty()) {
+				return matches.get(matches.size()-1);
+			}
+		}
+
+		return null; // No match found
+
+	}
+
+
+	/**
+	 * Returns information on how to implement a regular expression "replace"
+	 * action in the specified text with the specified replacement string.
+	 *
+	 * @param searchIn The string to search in.
+	 * @param context The search options.
+	 * @return A <code>RegExReplaceInfo</code> object describing how to
+	 *         implement the replace.
+	 * @throws PatternSyntaxException If the search text is an invalid regular
+	 *         expression.
+	 * @throws IndexOutOfBoundsException If the replacement text references an
+	 *         invalid group (less than zero or greater than the number of
+	 *         groups matched).
+	 * @see #getNextMatchPos
+	 */
+	private static RegExReplaceInfo getRegExReplaceInfo(CharSequence searchIn,
+										SearchContext context) {
+		// Can't pass null to getNextMatchPosRegExImpl or it'll think
+		// you're doing a "find" operation instead of "replace, and return a
+		// Point.
+		String replacement = context.getReplaceWith();
+		if (replacement==null) {
+			replacement = "";
+		}
+		String regex = context.getSearchFor();
+		boolean goForward = context.getSearchForward();
+		boolean matchCase = context.getMatchCase();
+		boolean wholeWord = context.getWholeWord();
+		return (RegExReplaceInfo)getNextMatchPosRegExImpl(regex, searchIn,
+						goForward, matchCase, wholeWord, replacement);
+	}
+
+
+	/**
+	 * Called internally by <code>getMatches()</code>.  This method assumes
+	 * that the specified matcher has just found a match, and that you want
+	 * to get the string with which to replace that match.<p>
+	 *
+	 * Escapes simply insert the escaped character, except for <code>\n</code>
+	 * and <code>\t</code>, which insert a newline and tab respectively.
+	 * Substrings of the form <code>$\d+</code> are considered to be matched
+	 * groups.  To include a literal dollar sign in your template, escape it
+	 * (i.e. <code>\$</code>).<p>
+	 *
+	 * Most clients will have no need to call this method directly.
+	 *
+	 * @param m The matcher.
+	 * @param template The template for the replacement string.  For example,
+	 *        "<code>foo</code>" would yield the replacement string
+	 *        "<code>foo</code>", while "<code>$1 is the greatest</code>"
+	 *        would yield different values depending on the value of the first
+	 *        captured group in the match.
+	 * @return The string to replace the match with.
+	 * @throws IndexOutOfBoundsException If <code>template</code> references
+	 *         an invalid group (less than zero or greater than the number of
+	 *         groups matched).
+	 */
+	public static String getReplacementText(Matcher m, CharSequence template) {
+
+		// NOTE: This code was mostly ripped off from J2SE's Matcher
+		// class.
+
+		// Process substitution string to replace group references with groups
+		int cursor = 0;
+		StringBuffer result = new StringBuffer();
+
+		while (cursor < template.length()) {
+	
+			char nextChar = template.charAt(cursor);
+	
+			if (nextChar == '\\') { // Escape character.
+				nextChar = template.charAt(++cursor);
+				switch (nextChar) { // Special cases.
+					case 'n':
+						nextChar = '\n';
+						break;
+					case 't':
+						nextChar = '\t';
+						break;
+				}
+				result.append(nextChar);
+				cursor++;
+			}
+			else if (nextChar == '$') { // Group reference.
+
+				cursor++; // Skip the '$'.
+
+				// The first number is always a group
+				int refNum = template.charAt(cursor) - '0';
+				if ((refNum < 0)||(refNum > 9)) {
+					// This should really be an IllegalArgumentException,
+					// but we cheat to keep all "group" errors throwing
+					// the same exception type.
+					throw new IndexOutOfBoundsException(
+								"No group " + template.charAt(cursor));
+				}
+				cursor++;
+
+				// Capture the largest legal group string
+				boolean done = false;
+				while (!done) {
+					if (cursor >= template.length()) {
+						break;
+					}
+					int nextDigit = template.charAt(cursor) - '0';
+					if ((nextDigit < 0)||(nextDigit > 9)) { // not a number
+						break;
+					}
+					int newRefNum = (refNum * 10) + nextDigit;
+					if (m.groupCount() < newRefNum) {
+						done = true;
+					}
+					else {
+						refNum = newRefNum;
+						cursor++;
+					}
+				}
+
+				// Append group
+				if (m.group(refNum) != null)
+					result.append(m.group(refNum));
+
+			}
+
+			else {
+				result.append(nextChar);
+				cursor++;
+			}
+
+		}
+
+		return result.toString();
+
+	}
+
+
+	/**
+	 * Returns whether the characters on either side of
+	 * <code>substr(searchIn, startPos, startPos+searchStringLength)</code>
+	 * are <em>not</em> letters or digits.
+	 */
+	private static final boolean isWholeWord(CharSequence searchIn,
+											int offset, int len) {
+
+		boolean wsBefore, wsAfter;
+
+		try {
+			wsBefore = !Character.isLetterOrDigit(searchIn.charAt(offset - 1));
+		} catch (IndexOutOfBoundsException e) { wsBefore = true; }
+		try {
+			wsAfter  = !Character.isLetterOrDigit(searchIn.charAt(offset + len));
+		} catch (IndexOutOfBoundsException e) { wsAfter = true; }
+
+		return wsBefore && wsAfter;
+
+	}
+
+
+	/**
+	 * Makes the caret's dot and mark the same location so that, for the
+	 * next search in the specified direction, a match will be found even
+	 * if it was within the original dot and mark's selection.
+	 *
+	 * @param textArea The text area.
+	 * @param forward Whether the search will be forward through the
+	 *        document (<code>false</code> means backward).
+	 * @return The new dot and mark position.
+	 */
+	private static int makeMarkAndDotEqual(JTextArea textArea,
+										boolean forward) {
+		Caret c = textArea.getCaret();
+		int val = forward ? Math.min(c.getDot(), c.getMark()) :
+						Math.max(c.getDot(), c.getMark());
+		c.setDot(val);
+		return val;
+	}
+
+
+	/**
+	 * Finds the next instance of the regular expression specified from
+	 * the caret position.  If a match is found, it is replaced with
+	 * the specified replacement string.
+	 *
+	 * @param textArea The text area in which to search.
+	 * @param context What to search for and all search options.
+	 * @return Whether a match was found (and thus replaced).
+	 * @throws PatternSyntaxException If this is a regular expression search
+	 *         but the search text is an invalid regular expression.
+	 * @throws IndexOutOfBoundsException If this is a regular expression search
+	 *         but the replacement text references an invalid group (less than
+	 *         zero or greater than the number of groups matched).
+	 * @see #replace(RTextArea, SearchContext)
+	 * @see #find(JTextArea, SearchContext)
+	 */
+	private static boolean regexReplace(RTextArea textArea,
+			SearchContext context) throws PatternSyntaxException {
+
+		// Be smart about what position we're "starting" at.  For example,
+		// if they are searching backwards and there is a selection such that
+		// the dot is past the mark, and the selection is the text for which
+		// you're searching, this search will find and return the current
+		// selection.  So, in that case we start at the beginning of the
+		// selection.
+		Caret c = textArea.getCaret();
+		boolean forward = context.getSearchForward();
+		int start = makeMarkAndDotEqual(textArea, forward);
+
+		CharSequence findIn = getFindInCharSequence(textArea, start, forward);
+		if (findIn==null) return false;
+
+		// Find the next location of the text we're searching for.
+		RegExReplaceInfo info = getRegExReplaceInfo(findIn, context);
+
+		findIn = null; // May help garbage collecting.
+
+		// If a match was found, do the replace and return!
+		if (info!=null) {
+
+			// Without this, if JTextArea isn't in focus, selection won't
+			// appear selected.
+			c.setSelectionVisible(true);
+
+			int matchStart = info.getStartIndex();
+			int matchEnd = info.getEndIndex();
+			if (forward) {
+				matchStart += start;
+				matchEnd += start;
+			}
+			selectAndPossiblyCenter(textArea, matchStart, matchEnd);
+			textArea.replaceSelection(info.getReplacement());
+
+			return true;
+
+		}
+
+		// No match.
+		return false;
+
+	}
+
+
+	/**
+	 * Finds the next instance of the text/regular expression specified from
+	 * the caret position.  If a match is found, it is replaced with the
+	 * specified replacement string.
+	 *
+	 * @param textArea The text area in which to search.
+	 * @param context What to search for and all search options.
+	 * @return Whether a match was found (and thus replaced).
+	 * @throws PatternSyntaxException If this is a regular expression search
+	 *         but the search text is an invalid regular expression.
+	 * @throws IndexOutOfBoundsException If this is a regular expression search
+	 *         but the replacement text references an invalid group (less than
+	 *         zero or greater than the number of groups matched).
+	 * @see #replaceAll(RTextArea, SearchContext)
+	 * @see #find(JTextArea, SearchContext)
+	 */
+	public static boolean replace(RTextArea textArea, SearchContext context)
+									throws PatternSyntaxException {
+
+		String toFind = context.getSearchFor();
+		if (toFind==null || toFind.length()==0) {
+			return false;
+		}
+
+		textArea.beginAtomicEdit();
+		try {
+
+			// Regular expression replacements have their own method.
+			if (context.isRegularExpression()) {
+				return regexReplace(textArea, context);
+			}
+
+			// Plain text search.  If we find it, replace it!
+			// First make the dot and mark equal (get rid of any selection), as
+			// a common use-case is the user will use "Find" to select the text
+			// to replace, then click "Replace" to replace the current
+			// selection. Since our find() method searches from an endpoint of
+			// the selection, we must remove the selection to work properly.
+			makeMarkAndDotEqual(textArea, context.getSearchForward());
+			if (find(textArea, context)) {
+				textArea.replaceSelection(context.getReplaceWith());
+				return true;
+			}
+
+		} finally {
+			textArea.endAtomicEdit();
+		}
+
+		return false;
+
+	}
+
+
+	/**
+	 * Replaces all instances of the text/regular expression specified in
+	 * the specified document with the specified replacement.
+	 *
+	 * @param textArea The text area in which to search.
+	 * @param context What to search for and all search options.
+	 * @return The number of replacements done.
+	 * @throws PatternSyntaxException If this is a regular expression search
+	 *         but the replacement text is an invalid regular expression.
+	 * @throws IndexOutOfBoundsException If this is a regular expression search
+	 *         but the replacement text references an invalid group (less than
+	 *         zero or greater than the number of groups matched).
+	 * @see #replace(RTextArea, SearchContext)
+	 * @see #find(JTextArea, SearchContext)
+	 */
+	public static int replaceAll(RTextArea textArea, SearchContext context)
+									throws PatternSyntaxException {
+
+		context.setSearchForward(true); // Replace all always searches forward
+		String toFind = context.getSearchFor();
+		if (toFind==null || toFind.length()==0) {
+			return 0;
+		}
+
+		int count = 0;
+
+		textArea.beginAtomicEdit();
+		try {
+			int oldOffs = textArea.getCaretPosition();
+			textArea.setCaretPosition(0);
+			while (SearchEngine.replace(textArea, context)) {
+				count++;
+			}
+			if (count==0) { // If nothing was found, don't move the caret.
+				textArea.setCaretPosition(oldOffs);
+			}
+		} finally {
+			textArea.endAtomicEdit();
+		}
+
+		return count;
+
+	}
+
+
+	/**
+	 * Selects a range of text in a text component.  If the new selection is
+	 * outside of the previous viewable rectangle, then the view is centered
+	 * around the new selection.
+	 *
+	 * @param textArea The text component whose selection is to be centered.
+	 * @param start The start of the range to select.
+	 * @param end The end of the range to select.
+	 */
+	private static void selectAndPossiblyCenter(JTextArea textArea, int start,
+												int end) {
+
+		boolean foldsExpanded = false;
+		if (textArea instanceof RSyntaxTextArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			FoldManager fm = rsta.getFoldManager();
+			if (fm.isCodeFoldingSupportedAndEnabled()) {
+				foldsExpanded = fm.ensureOffsetNotInClosedFold(start);
+				foldsExpanded |= fm.ensureOffsetNotInClosedFold(end);
+			}
+		}
+
+		textArea.setSelectionStart(start);
+		textArea.setSelectionEnd(end);
+
+		Rectangle r = null;
+		try {
+			r = textArea.modelToView(start);
+			if (r==null) { // Not yet visible; i.e. JUnit tests
+				return;
+			}
+			if (end!=start) {
+				r = r.union(textArea.modelToView(end));
+			}
+		} catch (BadLocationException ble) { // Never happens
+			ble.printStackTrace();
+			textArea.setSelectionStart(start);
+			textArea.setSelectionEnd(end);
+			return;
+		}
+
+		Rectangle visible = textArea.getVisibleRect();
+
+		// If the new selection is already in the view, don't scroll,
+		// as that is visually jarring.
+		if (!foldsExpanded && visible.contains(r)) {
+			textArea.setSelectionStart(start);
+			textArea.setSelectionEnd(end);
+			return;
+		}
+
+		visible.x = r.x - (visible.width - r.width) / 2;
+		visible.y = r.y - (visible.height - r.height) / 2;
+
+		Rectangle bounds = textArea.getBounds();
+		Insets i = textArea.getInsets();
+		bounds.x = i.left;
+		bounds.y = i.top;
+		bounds.width -= i.left + i.right;
+		bounds.height -= i.top + i.bottom;
+
+		if (visible.x < bounds.x) {
+			visible.x = bounds.x;
+		}
+
+		if (visible.x + visible.width > bounds.x + bounds.width) {
+			visible.x = bounds.x + bounds.width - visible.width;
+		}
+
+		if (visible.y < bounds.y) {
+			visible.y = bounds.y;
+		}
+
+		if (visible.y + visible.height > bounds.y + bounds.height) {
+			visible.y = bounds.y + bounds.height - visible.height;
+		}
+
+		textArea.scrollRectToVisible(visible);
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/ToolTipSupplier.java b/src/org/fife/ui/rtextarea/ToolTipSupplier.java
new file mode 100644
index 0000000..3a7b68a
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/ToolTipSupplier.java
@@ -0,0 +1,39 @@
+/*
+ * 02/05/2009
+ *
+ * ToolTipSupplier.java - Can provide tool tips to RTextAreas without the need
+ * for subclassing.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.event.MouseEvent;
+
+
+/**
+ * A <tt>ToolTipSupplier</tt> can create tool tip text for an <tt>RTextArea</tt>
+ * on its behalf.  A text area will check its <tt>ToolTipSupplier</tt> for a
+ * tool tip before calling the super class's implementation of
+ * {@link RTextArea#getToolTipText()}.  This allows
+ * applications to intercept tool tip events and provide the text for a tool
+ * tip without subclassing <tt>RTextArea</tt>.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface ToolTipSupplier {
+
+
+	/**
+	 * Returns the tool tip text to display for a given mouse event.
+	 *
+	 * @param textArea The text area.
+	 * @param e The mouse event.
+	 * @return The tool tip, or <code>null</code> if none.
+	 */
+	public String getToolTipText(RTextArea textArea, MouseEvent e);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java b/src/org/fife/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java
new file mode 100644
index 0000000..147c0e3
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java
@@ -0,0 +1,136 @@
+/*
+ * 01/22/2005
+ *
+ * VolatileImageBackgroundPainterStrategy.java - Renders an RTextAreaBase's
+ * background as an image using VolatileImages.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.image.VolatileImage;
+
+
+/**
+ * A strategy for painting the background of an <code>RTextAreaBase</code>
+ * as an image.  The image is always stretched to completely fill the
+ * <code>RTextAreaBase</code>.<p>
+ *
+ * A <code>java.awt.image.VolatileImage</code> is used for rendering;
+ * theoretically, this should be the best image format for performance.<p>
+ *
+ * You can set the scaling hint used when stretching/skewing the image
+ * to fit in the <code>RTextAreaBase</code>'s background via the
+ * <code>setScalingHint</code> method, but keep in mind the more
+ * accurate the scaling hint, the less responsive your application will
+ * be when stretching the window (as that's the only time the image's
+ * size is recalculated).
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see org.fife.ui.rtextarea.ImageBackgroundPainterStrategy
+ * @see org.fife.ui.rtextarea.BufferedImageBackgroundPainterStrategy
+ */
+public class VolatileImageBackgroundPainterStrategy
+					extends ImageBackgroundPainterStrategy {
+
+	private VolatileImage bgImage;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param ta The text area whose background we'll be painting.
+	 */
+	public VolatileImageBackgroundPainterStrategy(RTextAreaBase ta) {
+		super(ta);
+	}
+
+
+	/**
+	 * Paints the image at the specified location.  This method assumes
+	 * scaling has already been done, and simply paints the background
+	 * image "as-is."
+	 *
+	 * @param g The graphics context.
+	 * @param x The x-coordinate at which to paint.
+	 * @param y The y-coordinate at which to paint.
+	 */
+	protected void paintImage(Graphics g, int x, int y) {
+		if (bgImage != null) {
+			do {
+				int rc = bgImage.validate(null);//getGraphicsConfiguration());
+				if (rc==VolatileImage.IMAGE_RESTORED) {
+					// FIXME:  If the image needs to be restored are its width
+					// and height still valid??  If not, we'll need to cache
+					// these values...
+					renderImage(bgImage.getWidth(), bgImage.getHeight(),
+						getScalingHint());
+				}
+				g.drawImage(bgImage, x,y, null);
+			} while (bgImage.contentsLost());
+		}
+	}
+
+
+	/**
+	 * Renders the image at the proper size into <code>bgImage</code>.
+	 * This method assumes that <code>bgImage</code> is not
+	 * <code>null</code>.
+	 *
+	 * @param width The width of the volatile image to render into.
+	 * @param height The height of the volatile image to render into.
+	 * @param hint The scaling hint to use.
+	 */
+	protected void renderImage(int width, int height, int hint) {
+		Image master = getMasterImage();
+		if (master!=null) {
+			do {
+				Image i = master.getScaledInstance(width,height, hint);
+				tracker.addImage(i, 1);
+				try {
+					tracker.waitForID(1);
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+					bgImage = null;
+					return;
+				} finally {
+					tracker.removeImage(i, 1);
+				}
+				bgImage.getGraphics().drawImage(i, 0,0, null);
+				tracker.addImage(bgImage, 0);
+				try {
+					tracker.waitForID(0);
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+					bgImage = null;
+					return;
+				} finally {
+					tracker.removeImage(bgImage, 0);
+				}
+			} while (bgImage.contentsLost());
+		} // End of if (master!=null).
+		else {
+			bgImage = null;
+		}
+	}
+
+
+	/**
+	 * Rescales the displayed image to be the specified size.
+	 *
+	 * @param width The new width of the image.
+	 * @param height The new height of the image.
+	 * @param hint The scaling hint to use.
+	 */
+	protected void rescaleImage(int width, int height, int hint) {
+		bgImage = getRTextAreaBase().createVolatileImage(width, height);
+		if (bgImage!=null)
+			renderImage(width, height, hint);
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/package.html b/src/org/fife/ui/rtextarea/package.html
new file mode 100644
index 0000000..69aabdb
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/package.html
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	A single-font text editor with many custom features.
+	</body>
+</html>
diff --git a/src/org/fife/util/DynamicIntArray.java b/src/org/fife/util/DynamicIntArray.java
new file mode 100644
index 0000000..df3ce7a
--- /dev/null
+++ b/src/org/fife/util/DynamicIntArray.java
@@ -0,0 +1,423 @@
+/*
+ * 03/26/2004
+ *
+ * DynamicIntArray.java - Similar to an ArrayList, but holds ints instead
+ * of Objects.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.util;
+
+import java.io.Serializable;
+import java.util.Arrays;
+
+
+/**
+ * Similar to a <code>java.util.ArrayList</code>, but specifically for
+ * <code>int</code>s.  This is basically an array of integers that resizes
+ * itself (if necessary) when adding new elements.
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ */
+public class DynamicIntArray implements Serializable {
+
+	/**
+	 * The actual data.
+	 */
+	private int[] data;
+
+	/**
+	 * The number of values in the array.  Note that this is NOT the
+	 * capacity of the array; rather, <code>size <= capacity</code>.
+	 */
+	private int size;
+
+
+	/**
+	 * Constructs a new array object with an initial capacity of 10.
+	 */
+	public DynamicIntArray() {
+		this(10);
+	}
+
+
+	/**
+	 * Constructs a new array object with a given initial capacity.
+	 *
+	 * @param initialCapacity The initial capacity.
+	 * @throws IllegalArgumentException If <code>initialCapacity</code> is
+	 *         negative.
+	 */
+	public DynamicIntArray(int initialCapacity) {
+		if (initialCapacity<0) {
+			throw new IllegalArgumentException("Illegal initialCapacity: "
+												+ initialCapacity);
+		}
+		data = new int[initialCapacity];
+		size = 0;
+	}
+
+
+	/**
+	 * Constructs a new array object from the given int array.  The resulting
+	 * <code>DynamicIntArray</code> will have an initial capacity of 110%
+	 * the size of the array.
+	 *
+	 * @param intArray Initial data for the array object.
+	 * @throws NullPointerException If <code>intArray</code> is
+	 *         <code>null</code>.
+	 */
+	public DynamicIntArray(int[] intArray) {
+		size = intArray.length;
+		int capacity = (int)Math.min(size*110L/100, Integer.MAX_VALUE);
+		data = new int[capacity];
+		System.arraycopy(intArray,0, data,0, size); // source, dest, length.
+	}
+
+
+	/**
+	 * Appends the specified <code>int</code> to the end of this array.
+	 *
+	 * @param value The <code>int</code> to be appended to this array.
+	 */
+	public void add(int value) {
+		ensureCapacity(size + 1);
+		data[size++] = value;
+	}
+
+
+	/**
+	 * Inserts all <code>int</code>s in the specified array into this array
+	 * object at the specified location.  Shifts the <code>int</code>
+	 * currently at that position (if any) and any subsequent
+	 * <code>int</code>s to the right (adds one to their indices).
+	 *
+	 * @param index The index at which the specified integer is to be
+	 *        inserted.
+	 * @param intArray The array of <code>int</code>s to insert.
+	 * @throws IndexOutOfBoundsException If <code>index</code> is less than
+	 *         zero or greater than <code>getSize()</code>.
+	 * @throws NullPointerException If <code>intArray<code> is
+	 *         <code>null<code>.
+	 */
+	public void add(int index, int[] intArray) {
+		if (index>size) {
+			throwException2(index);
+		}
+		int addCount = intArray.length;
+		ensureCapacity(size+addCount);
+		int moveCount = size - index;
+		if (moveCount>0)
+			System.arraycopy(data,index, data,index+addCount, moveCount);
+		System.arraycopy(data,index, intArray,0, moveCount);
+		size += addCount;
+	}
+
+
+	/**
+	 * Inserts the specified <code>int</code> at the specified position in
+	 * this array. Shifts the <code>int</code> currently at that position (if
+	 * any) and any subsequent <code>int</code>s to the right (adds one to
+	 * their indices).
+	 *
+	 * @param index The index at which the specified integer is to be
+	 *        inserted.
+	 * @param value The <code>int</code> to be inserted.
+	 * @throws IndexOutOfBoundsException If <code>index</code> is less than
+	 *         zero or greater than <code>getSize()</code>.
+	 */
+	public void add(int index, int value) {
+		if (index>size) {
+			throwException2(index);
+		}
+		ensureCapacity(size+1);
+		System.arraycopy(data,index, data,index+1, size-index);
+		data[index] = value;
+		size++;
+	}
+
+
+	/**
+	 * Removes all values from this array object.  Capacity will remain the
+	 * same.
+	 */
+	public void clear() {
+		size = 0;
+	}
+
+
+	/**
+	 * Returns whether this array contains a given integer.  This method
+	 * performs a linear search, so it is not optimized for performance.
+	 *
+	 * @param integer The <code>int</code> for which to search.
+	 * @return Whether the given integer is contained in this array.
+	 */
+	public boolean contains(int integer) {
+		for (int i=0; i<size; i++) {
+			if (data[i]==integer)
+				return true;
+		}
+		return false;
+	}
+
+
+	/**
+	 * Decrements all values in the array in the specified range.
+	 *
+	 * @param from The range start offset (inclusive).
+	 * @param to The range end offset (exclusive).
+	 * @see #increment(int, int)
+	 */
+	public void decrement(int from, int to) {
+		for (int i=from; i<to; i++) {
+			data[i]--;
+		}
+	}
+
+
+	/**
+	 * Makes sure that this <code>DynamicIntArray</code> instance can hold
+	 * at least the number of elements specified.  If it can't, then the
+	 * capacity is increased.
+	 *
+	 * @param minCapacity The desired minimum capacity.
+	 */
+	private final void ensureCapacity(int minCapacity) {
+		int oldCapacity = data.length;
+		if (minCapacity > oldCapacity) {
+			int[] oldData = data;
+			// Ensures we don't just keep increasing capacity by some small
+			// number like 1...
+			int newCapacity = (oldCapacity * 3)/2 + 1;
+			if (newCapacity < minCapacity)
+				newCapacity = minCapacity;
+			data = new int[newCapacity];
+			System.arraycopy(oldData,0, data,0, size);
+		}
+	}
+
+
+	/**
+	 * Sets the value of all entries in this array to the specified value.
+	 *
+	 * @param value The new value for all elements in the array.
+	 */
+	public void fill(int value) {
+		Arrays.fill(data, value);
+	}
+
+
+	/**
+	 * Returns the <code>int</code> at the specified position in this array
+	 * object.
+	 *
+	 * @param index The index of the <code>int</code> to return.
+	 * @return The <code>int</code> at the specified position in this array.
+	 * @throws IndexOutOfBoundsException If <code>index</code> is less than
+	 *         zero or greater than or equal to <code>getSize()</code>.
+	 */
+	public int get(int index) {
+		// Small enough to be inlined, and throwException() is rarely called.
+		if (index>=size) {
+			throwException(index);
+		}
+		return data[index];
+	}
+
+
+	/**
+	 * Returns the <code>int</code> at the specified position in this array
+	 * object, without doing any bounds checking.  You really should use
+	 * {@link #get(int)} instead of this method.
+	 *
+	 * @param index The index of the <code>int</code> to return.
+	 * @return The <code>int</code> at the specified position in this array.
+	 */
+	public int getUnsafe(int index) {
+		// Small enough to be inlined.
+		return data[index];
+	}
+
+
+	/**
+	 * Returns the number of <code>int</code>s in this array object.
+	 *
+	 * @return The number of <code>int</code>s in this array object.
+	 */
+	public int getSize() {
+		return size;
+	}
+
+
+	/**
+	 * Increments all values in the array in the specified range.
+	 *
+	 * @param from The range start offset (inclusive).
+	 * @param to The range end offset (exclusive).
+	 * @see #decrement(int, int)
+	 */
+	public void increment(int from, int to) {
+		for (int i=from; i<to; i++) {
+			data[i]++;
+		}
+	}
+
+
+	public void insertRange(int offs, int count, int value) {
+		if (offs>size) {
+			throwException2(offs);
+		}
+		ensureCapacity(size+count);
+		System.arraycopy(data,offs, data,offs+count, size-offs);
+		if (value!=0) {
+			Arrays.fill(data, offs, offs+count, value);
+		}
+		size += count;
+	}
+
+
+	/**
+	 * Returns whether or not this array object is empty.
+	 *
+	 * @return Whether or not this array object contains no elements.
+	 */
+	public boolean isEmpty() {
+		return size==0;
+	}
+
+
+	/**
+	 * Removes the <code>int</code> at the specified location from this array
+	 * object.
+	 *
+	 * @param index The index of the <code>int</code> to remove.
+	 * @throws IndexOutOfBoundsException If <code>index</code> is less than
+	 *         zero or greater than or equal to <code>getSize()</code>.
+	 */
+	public void remove(int index) {
+		if (index>=size) {
+			throwException(index);
+		}
+		int toMove = size - index - 1;
+		if (toMove>0) {
+			System.arraycopy(data,index+1, data,index, toMove);
+		}
+		--size;
+	}
+
+
+	/**
+	 * Removes the <code>int</code>s in the specified range from this array
+	 * object.
+	 *
+	 * @param fromIndex The index of the first <code>int</code> to remove.
+	 * @param toIndex The index AFTER the last <code>int</code> to remove.
+	 * @throws IndexOutOfBoundsException If either of <code>fromIndex</code>
+	 *         or <code>toIndex</code> is less than zero or greater than or
+	 *         equal to <code>getSize()</code>.
+	 */
+	public void removeRange(int fromIndex, int toIndex) {
+		if (fromIndex>=size || toIndex>size) {
+			throwException3(fromIndex, toIndex);
+		}
+		int moveCount = size - toIndex;
+		System.arraycopy(data,toIndex, data,fromIndex, moveCount);
+		size -= (toIndex - fromIndex);
+	}
+
+		
+	/**
+	 * Sets the <code>int</code> value at the specified position in this
+	 * array object.
+	 *
+	 * @param index The index of the <code>int</code> to set
+	 * @param value The value to set it to.
+	 * @throws IndexOutOfBoundsException If <code>index</code> is less than
+	 *         zero or greater than or equal to <code>getSize()</code>.
+	 */
+	public void set(int index, int value) {
+		// Small enough to be inlined, and throwException() is rarely called.
+		if (index>=size) {
+			throwException(index);
+		}
+		data[index] = value;
+	}
+
+
+	/**
+	 * Sets the <code>int</code> value at the specified position in this
+	 * array object, without doing any bounds checking.  You should use
+	 * {@link #set(int, int)} instead of this method.
+	 *
+	 * @param index The index of the <code>int</code> to set
+	 * @param value The value to set it to.
+	 */
+	public void setUnsafe(int index, int value) {
+		// Small enough to be inlined.
+		data[index] = value;
+	}
+
+
+	/**
+	 * Throws an exception.  This method isolates error-handling code from
+	 * the error-checking code, so that callers (e.g. {@link #get} and
+	 * {@link #set}) can be both small enough to be inlined, as well as
+	 * not usually make any expensive method calls (since their callers will
+	 * usually not pass illegal arguments to them).
+	 *
+	 * See <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103956">
+	 * this Sun bug report</a> for more information.
+	 *
+	 * @param index The invalid index.
+	 * @throws IndexOutOfBoundsException Always.
+	 */
+	private final void throwException(int index)
+								throws IndexOutOfBoundsException {
+		throw new IndexOutOfBoundsException("Index " + index +
+						" not in valid range [0-" + (size-1) + "]");
+	}
+
+
+	/**
+	 * Throws an exception.  This method isolates error-handling code from
+	 * the error-checking code, so that callers can be both small enough to be
+	 * inlined, as well as not usually make any expensive method calls (since
+	 * their callers will usually not pass illegal arguments to them).
+	 *
+	 * See <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103956">
+	 * this Sun bug report</a> for more information.
+	 *
+	 * @param index The invalid index.
+	 * @throws IndexOutOfBoundsException Always.
+	 */
+	private final void throwException2(int index)
+								throws IndexOutOfBoundsException {
+		throw new IndexOutOfBoundsException("Index " + index +
+								", not in range [0-" + size + "]");
+	}
+
+
+	/**
+	 * Throws an exception.  This method isolates error-handling code from
+	 * the error-checking code, so that callers can be both small enough to be
+	 * inlined, as well as not usually make any expensive method calls (since
+	 * their callers will usually not pass illegal arguments to them).
+	 *
+	 * See <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103956">
+	 * this Sun bug report</a> for more information.
+	 *
+	 * @param index The invalid index.
+	 * @throws IndexOutOfBoundsException Always.
+	 */
+	private final void throwException3(int fromIndex, int toIndex)
+								throws IndexOutOfBoundsException {
+		throw new IndexOutOfBoundsException("Index range [" +
+						fromIndex + ", " + toIndex +
+						"] not in valid range [0-" + (size-1) + "]");
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/util/package.html b/src/org/fife/util/package.html
new file mode 100644
index 0000000..5a25a9d
--- /dev/null
+++ b/src/org/fife/util/package.html
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	General utility classes.
+	</body>
+</html>
diff --git a/src/theme.dtd b/src/theme.dtd
new file mode 100644
index 0000000..a801939
--- /dev/null
+++ b/src/theme.dtd
@@ -0,0 +1,78 @@
+<!-- DTD for RSyntaxTextArea Theme XML. See /themes folder for examples. -->
+<!ELEMENT RSyntaxTheme (baseFont?, background, caret, selection,
+      currentLineHighlight, marginLine, markAllHighlight, markOccurrencesHighlight,
+      matchedBracket, hyperlinks, secondaryLanguages, gutterBorder, lineNumbers,
+      foldIndicator, iconRowHeader, tokenStyles)>
+<!ELEMENT background EMPTY>
+<!ELEMENT baseFont EMPTY>
+<!ELEMENT caret EMPTY>
+<!ELEMENT selection EMPTY>
+<!ELEMENT currentLineHighlight EMPTY>
+<!ELEMENT marginLine EMPTY>
+<!ELEMENT markAllHighlight EMPTY>
+<!ELEMENT markOccurrencesHighlight EMPTY>
+<!ELEMENT matchedBracket EMPTY>
+<!ELEMENT hyperlinks EMPTY>
+<!ELEMENT secondaryLanguages (language+)>
+<!ELEMENT language EMPTY>
+<!ELEMENT gutterBorder EMPTY>
+<!ELEMENT lineNumbers EMPTY>
+<!ELEMENT foldIndicator EMPTY>
+<!ELEMENT iconRowHeader EMPTY>
+<!ELEMENT tokenStyles (style+)>
+<!ELEMENT style EMPTY>
+
+<!ATTLIST RSyntaxTheme
+      version  CDATA #REQUIRED>
+<!ATTLIST background
+      color    CDATA #REQUIRED>
+<!ATTLIST baseFont
+      family    CDATA #IMPLIED
+      size      CDATA #IMPLIED>
+<!ATTLIST caret
+      color     CDATA #REQUIRED>
+<!ATTLIST selection
+      fg        CDATA #IMPLIED
+      useFG     (true|false) "true"
+      bg        CDATA #REQUIRED
+      roundedEdges (true|false) "false">
+<!ATTLIST currentLineHighlight
+      color     CDATA #REQUIRED
+      fade      (true|false) "false">
+<!ATTLIST marginLine
+      fg         CDATA #REQUIRED>
+<!ATTLIST markAllHighlight
+      color      CDATA #REQUIRED>
+<!ATTLIST markOccurrencesHighlight
+      color      CDATA #REQUIRED
+      border     (true|false) "false">
+<!ATTLIST matchedBracket
+      fg            CDATA #REQUIRED
+      bg            CDATA #IMPLIED
+      highlightBoth (true|false) "false"
+      animate       (true|false) "false">
+<!ATTLIST hyperlinks
+      fg         CDATA #REQUIRED>
+<!ATTLIST language
+      index      (1|2|3) #REQUIRED
+      bg         CDATA   #REQUIRED>
+<!ATTLIST gutterBorder
+      color      CDATA #REQUIRED>
+<!ATTLIST lineNumbers
+      fg         CDATA #REQUIRED
+      fontFamily CDATA #IMPLIED
+      fontSize   CDATA #IMPLIED>
+<!ATTLIST foldIndicator
+      fg         CDATA #REQUIRED
+      iconBg     CDATA #REQUIRED>
+<!ATTLIST iconRowHeader
+      activeLineRange CDATA #REQUIRED>
+<!ATTLIST style
+      token      CDATA #REQUIRED
+      fg         CDATA #IMPLIED
+      bg         CDATA #IMPLIED
+      fontFamily CDATA #IMPLIED
+      fontSize   CDATA #IMPLIED
+      bold       (true|false) "false"
+      italic     (true|false) "false"
+      underline  (true|false) "false">
diff --git a/test/org/fife/ui/rtextarea/SearchEngineTest.java b/test/org/fife/ui/rtextarea/SearchEngineTest.java
new file mode 100644
index 0000000..8a29693
--- /dev/null
+++ b/test/org/fife/ui/rtextarea/SearchEngineTest.java
@@ -0,0 +1,647 @@
+/*
+ * 05/12/2010
+ *
+ * SearchEngineTest.java - Test cases for SearchEngine.java
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import javax.swing.text.BadLocationException;
+
+import junit.framework.TestCase;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rtextarea.SearchEngine;
+
+/**
+ * Some very basic unit tests for the {@link SearchEngine} used by
+ * <code>RTextArea</code>/<code>RSyntaxTextArea</code>.
+ * 
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class SearchEngineTest extends TestCase {
+
+	private RSyntaxTextArea textArea = new RSyntaxTextArea();
+
+	private static String text;
+
+
+	/**
+	 * Asserts that two strings are equal, ignoring case.
+	 *
+	 * @param expected
+	 * @param actual
+	 */
+	private void assertEqualsIgnoreCase(String expected, String actual) {
+		expected = expected != null ? expected.toLowerCase() : null;
+		actual = actual != null ? actual.toLowerCase() : null;
+		assertEquals(expected, actual);
+	}
+
+
+	/**
+	 * Asserts that the text area's selection is at the expected location and
+	 * has the expected value.
+	 *
+	 * @param expected
+	 * @param offs
+	 * @param matchCase
+	 */
+	private void assertSelected(String expected, int offs, boolean matchCase) {
+		String actual = textArea.getSelectedText();
+		if (matchCase) {
+			assertEquals(expected, actual);
+		} else {
+			assertEqualsIgnoreCase(expected, actual);
+		}
+		int selOffs = textArea.getSelectionStart();
+		assertEquals("unexpected selection offset: ", offs, selOffs);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected void setUp() throws Exception {
+
+		// setUp() is called once per test, each with a new instantiation of
+		// SearchEngineTest, so check a static variable to ensure that
+		// initialization is only done once.
+
+		if (text == null || text.length() <= 0) {
+
+			StringBuffer sb = new StringBuffer();
+			InputStream in = getClass().getResourceAsStream("text.txt");
+			BufferedReader br = new BufferedReader(new InputStreamReader(in));
+			String s = null;
+			try {
+				while ((s=br.readLine())!=null) {
+					sb.append(s).append("\n");
+				}
+			} finally {
+				br.close();
+			}
+
+			// Strip off last newline
+			text = sb.toString().substring(0, sb.length()-1);
+
+		}
+
+		super.setUp();
+
+	}
+
+
+	/**
+	 * Tests <code>SearchEngine.find()</code> when searching backward.
+	 */
+	public void testSearchEngineFindBackward() throws BadLocationException {
+
+		textArea.setText(text);
+
+		int end = text.length();
+		SearchContext context = new SearchContext();
+		context.setSearchForward(false);
+
+		// Search for "chuck", ignoring case.
+		context.setSearchFor("chuck");
+		context.setMatchCase(false);
+		textArea.setCaretPosition(end);
+		boolean found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 60, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 48, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 32, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 26, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(false, found);
+
+		// Search for "Chuck", matching case.
+		context.setSearchFor("Chuck");
+		context.setMatchCase(true);
+		textArea.setCaretPosition(end);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("Chuck", 26, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(false, found);
+
+		// Search for "chuck", ignoring case, whole word
+		context.setSearchFor("Chuck");
+		context.setMatchCase(false);
+		context.setWholeWord(true);
+		textArea.setCaretPosition(end);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 60, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 32, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(false, found);
+
+		// Search for "wood", matching case, whole word
+		context.setSearchFor("wood");
+		context.setMatchCase(true);
+		context.setWholeWord(true);
+		textArea.setCaretPosition(end);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("wood", 9, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(false, found);
+
+		// Search for ".ould", regex, ignoring case
+		context.setSearchFor(".ould");
+		context.setMatchCase(false);
+		context.setWholeWord(false);
+		context.setRegularExpression(true);
+		textArea.setCaretPosition(end);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("could", 54, true);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("wOuld", 14, true);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(false, found);
+
+		// Search for ".ould", regex, matching case
+		context.setSearchFor(".ould");
+		context.setMatchCase(true);
+		context.setWholeWord(false);
+		context.setRegularExpression(true);
+		textArea.setCaretPosition(end);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("could", 54, true);
+		found = SearchEngine.find(textArea,context);
+		assertEquals(false, found);
+
+		// Search for "[cd]huck", regex, ignoring case, whole word
+		context.setSearchFor("[cd]hUCk");
+		context.setMatchCase(false);
+		context.setWholeWord(true);
+		context.setRegularExpression(true);
+		textArea.setCaretPosition(end);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 60, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 32, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(false, found);
+
+		// Search for "[cd]huck", regex, matching case, whole word
+		context.setSearchFor("[cd]huck");
+		context.setMatchCase(true);
+		context.setWholeWord(true);
+		context.setRegularExpression(true);
+		textArea.setCaretPosition(end);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 60, true);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(false, found);
+
+	}
+
+
+	/**
+	 * Tests <code>SearchEngine.find()</code> when searching forward.
+	 */
+	public void testSearchEngineFindForward() throws BadLocationException {
+
+		textArea.setText(text);
+
+		SearchContext context = new SearchContext();
+
+		// Search for "chuck", ignoring case.
+		context.setSearchFor("chuck");
+		boolean found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 26, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 32, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 48, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 60, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(false, found);
+
+		// Search for "Chuck", matching case.
+		context.setSearchFor("Chuck");
+		context.setMatchCase(true);
+		textArea.setCaretPosition(0);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("Chuck", 26, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(false, found);
+
+		// Search for "chuck", ignoring case, whole word
+		context.setSearchFor("chuck");
+		context.setMatchCase(false);
+		context.setWholeWord(true);
+		textArea.setCaretPosition(0);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 32, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 60, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(false, found);
+
+		// Search for "wood", matching case, whole word
+		context.setSearchFor("wood");
+		context.setMatchCase(true);
+		context.setWholeWord(true);
+		textArea.setCaretPosition(0);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("wood", 9, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(false, found);
+
+		// Search for ".ould", regex, ignoring case
+		context.setSearchFor(".ould");
+		context.setMatchCase(false);
+		context.setWholeWord(false);
+		context.setRegularExpression(true);
+		textArea.setCaretPosition(0);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("wOuld", 14, true);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("could", 54, true);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(false, found);
+
+		// Search for ".ould", regex, matching case
+		context.setSearchFor(".ould");
+		context.setMatchCase(true);
+		context.setWholeWord(false);
+		context.setRegularExpression(true);
+		textArea.setCaretPosition(0);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("could", 54, true);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(false, found);
+
+		// Search for "[cd]huck", regex, ignoring case, whole word
+		context.setSearchFor("[cd]hUCk");
+		context.setMatchCase(false);
+		context.setWholeWord(true);
+		context.setRegularExpression(true);
+		textArea.setCaretPosition(0);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 32, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 60, context.getMatchCase());
+		found = SearchEngine.find(textArea, context);
+		assertEquals(false, found);
+
+		// Search for "[cd]huck", regex, matching case, whole word
+		context.setSearchFor("[cd]huck");
+		context.setMatchCase(true);
+		context.setWholeWord(true);
+		context.setRegularExpression(true);
+		textArea.setCaretPosition(0);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(true, found);
+		assertSelected("chuck", 60, true);
+		found = SearchEngine.find(textArea, context);
+		assertEquals(false, found);
+
+	}
+
+
+	/**
+	 * Tests <code>SearchEngine.replace()</code>.
+	 *
+	 * @param forward Whether to test searching forward or backward.
+	 */
+	private void testSearchEngineReplace(boolean forward)
+										throws BadLocationException {
+
+		int offs = forward ? 0 : text.length();
+		SearchContext context = new SearchContext();
+		context.setSearchForward(forward);
+		context.setReplaceWith("FOOBAR");
+
+		// Search for "chuck", ignoring case.
+		context.setSearchFor("chuck");
+		textArea.setText(text);
+		String expected = textArea.getText().replaceAll("(?i:" + context.getSearchFor() +  ")", context.getReplaceWith());
+		textArea.setCaretPosition(offs);
+		boolean found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(false, found);
+		assertEquals(expected, textArea.getText());
+
+		// Search for "chuck", matching case.
+		context.setSearchFor("chuck");
+		textArea.setText(text);
+		expected = textArea.getText().replaceAll(context.getSearchFor(), context.getReplaceWith());
+		context.setMatchCase(true);
+		context.setWholeWord(false);
+		context.setRegularExpression(false);
+		textArea.setCaretPosition(offs);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(false, found);
+		assertEquals(expected, textArea.getText());
+
+		// Search for "chuck", ignoring case, whole word.
+		context.setSearchFor("chuck");
+		textArea.setText(text);
+		expected = "How much wood wOuld a woodChuck FOOBAR, if a woodchuck could FOOBAR wOod?";
+		context.setMatchCase(false);
+		context.setWholeWord(true);
+		context.setRegularExpression(false);
+		textArea.setCaretPosition(offs);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(false, found);
+		assertEquals(expected, textArea.getText());
+
+		// Search for "chuck", matching case, whole word.
+		context.setSearchFor("chuck");
+		textArea.setText(text);
+		expected = "How much wood wOuld a woodChuck chUck, if a woodchuck could FOOBAR wOod?";
+		context.setMatchCase(true);
+		context.setWholeWord(true);
+		context.setRegularExpression(false);
+		textArea.setCaretPosition(offs);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(false, found);
+		assertEquals(expected, textArea.getText());
+
+		// Search for ".huck", regex, ignoring case
+		context.setSearchFor(".huck");
+		textArea.setText(text);
+		expected = textArea.getText().replaceAll("(?i:" + context.getSearchFor() +  ")", context.getReplaceWith());
+		context.setMatchCase(false);
+		context.setWholeWord(false);
+		context.setRegularExpression(true);
+		textArea.setCaretPosition(offs);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(false, found);
+		assertEquals(expected, textArea.getText());
+
+		// Search for ".huck", regex, matching case
+		context.setSearchFor(".huck");
+		textArea.setText(text);
+		expected = textArea.getText().replaceAll(context.getSearchFor(), context.getReplaceWith());
+		context.setMatchCase(true);
+		context.setWholeWord(false);
+		context.setRegularExpression(true);
+		textArea.setCaretPosition(offs);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(false, found);
+		assertEquals(expected, textArea.getText());
+
+		// Search for "[cd]huck", regex, ignoring case, whole word
+		context.setSearchFor("[cd]huck");
+		textArea.setText(text);
+		expected = "How much wood wOuld a woodChuck FOOBAR, if a woodchuck could FOOBAR wOod?";
+		context.setMatchCase(false);
+		context.setWholeWord(true);
+		context.setRegularExpression(true);
+		textArea.setCaretPosition(offs);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(false, found);
+		assertEquals(expected, textArea.getText());
+
+		// Search for "[cd]hUck", regex, matching case, whole word
+		context.setSearchFor("[cd]hUck");
+		textArea.setText(text);
+		expected = "How much wood wOuld a woodChuck FOOBAR, if a woodchuck could chuck wOod?";
+		context.setMatchCase(true);
+		context.setWholeWord(false);
+		context.setRegularExpression(true);
+		textArea.setCaretPosition(offs);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(true, found);
+		found = SearchEngine.replace(textArea, context);
+		assertEquals(false, found);
+		assertEquals(expected, textArea.getText());
+
+	}
+
+
+	/**
+	 * Tests <code>SearchEngine.replace()</code> when searching backward.
+	 */
+	public void testSearchEngineReplaceBackward() throws BadLocationException {
+		testSearchEngineReplace(false);
+	}
+
+
+	/**
+	 * Tests <code>SearchEngine.replace()</code> when searching forward.
+	 */
+	public void testSearchEngineReplaceForward() throws BadLocationException {
+		testSearchEngineReplace(true);
+	}
+
+
+	/**
+	 * Tests <code>SearchEngine.replaceAll()</code>.
+	 */
+	public void testSearchEngineReplaceAll() throws BadLocationException {
+
+		SearchContext context = new SearchContext();
+		context.setReplaceWith("FOOBAR");
+
+		// Replace "chuck", ignoring case.
+		context.setSearchFor("chuck");
+		textArea.setText(text);
+		String expected = textArea.getText().replaceAll("(?i:" + context.getSearchFor() +  ")", context.getReplaceWith());
+		int count = SearchEngine.replaceAll(textArea, context);
+		assertEquals(4, count);
+		assertEquals(expected, textArea.getText());
+
+		// Replace "wood", matching case.
+		context.setSearchFor("wood");
+		textArea.setText(text);
+		expected = textArea.getText().replaceAll(context.getSearchFor(), context.getReplaceWith());
+		context.setMatchCase(true);
+		context.setWholeWord(false);
+		context.setRegularExpression(false);
+		count = SearchEngine.replaceAll(textArea, context);
+		assertEquals(3, count);
+		assertEquals(expected, textArea.getText());
+
+		// Replace "wood", ignoring case, whole word.
+		context.setSearchFor("wood");
+		textArea.setText(text);
+		expected = "How much FOOBAR wOuld a woodChuck chUck, if a woodchuck could chuck FOOBAR?";
+		context.setMatchCase(false);
+		context.setWholeWord(true);
+		context.setRegularExpression(false);
+		count = SearchEngine.replaceAll(textArea, context);
+		assertEquals(2, count);
+		assertEquals(expected, textArea.getText());
+
+		// Replace "chUck", matching case, whole word.
+		context.setSearchFor("chUck");
+		textArea.setText(text);
+		expected = "How much wood wOuld a woodChuck FOOBAR, if a woodchuck could chuck wOod?";
+		context.setMatchCase(true);
+		context.setWholeWord(true);
+		context.setRegularExpression(false);
+		count = SearchEngine.replaceAll(textArea, context);
+		assertEquals(1, count);
+		assertEquals(expected, textArea.getText());
+
+		// Replace "wo(?:o|ul)d", regex, ignoring case.
+		context.setSearchFor("wo(?:o|ul)d");
+		textArea.setText(text);
+		expected = textArea.getText().replaceAll("(?i:" + context.getSearchFor() +  ")", context.getReplaceWith());
+		context.setMatchCase(false);
+		context.setWholeWord(false);
+		context.setRegularExpression(true);
+		count = SearchEngine.replaceAll(textArea, context);
+		assertEquals(5, count);
+		assertEquals(expected, textArea.getText());
+
+		// Replace "wo(?:o|ul)d", regex, matching case.
+		context.setSearchFor("wo(?:o|ul)d");
+		textArea.setText(text);
+		expected = textArea.getText().replaceAll(context.getSearchFor(), context.getReplaceWith());
+		context.setMatchCase(true);
+		context.setWholeWord(false);
+		context.setRegularExpression(true);
+		count = SearchEngine.replaceAll(textArea, context);
+		assertEquals(3, count);
+		assertEquals(expected, textArea.getText());
+
+		// Replace "wo(?:o|ul)d", regex, ignoring case, whole word
+		context.setSearchFor("wo(?:o|ul)d");
+		textArea.setText(text);
+		expected = "How much FOOBAR FOOBAR a woodChuck chUck, if a woodchuck could chuck FOOBAR?";
+		context.setMatchCase(false);
+		context.setWholeWord(true);
+		context.setRegularExpression(true);
+		count = SearchEngine.replaceAll(textArea, context);
+		assertEquals(3, count);
+		assertEquals(expected, textArea.getText());
+
+		// Replace "wO(?:o|ul)d", regex, matching case, whole word
+		context.setSearchFor("wO(?:o|ul)d");
+		textArea.setText(text);
+		expected = "How much wood FOOBAR a woodChuck chUck, if a woodchuck could chuck FOOBAR?";
+		context.setMatchCase(true);
+		context.setWholeWord(true);
+		context.setRegularExpression(true);
+		count = SearchEngine.replaceAll(textArea, context);
+		assertEquals(2, count);
+		assertEquals(expected, textArea.getText());
+
+	}
+
+
+	/**
+	 * Tests <code>SearchEngine.replaceAll()</code> when the replacement string
+	 * has captured groups.
+	 */
+	public void testSearchEngineRegexReplaceAllWithCapturedGroups() throws BadLocationException {
+
+		SearchContext context = new SearchContext();
+		context.setRegularExpression(true);
+
+		// A single captured group.
+		context.setSearchFor("r(o+)t");
+		textArea.setText("root roOt root");
+		String expected = "oo oO oo";
+		context.setMatchCase(false);
+		context.setWholeWord(false);
+		context.setReplaceWith("$1");
+		int count = SearchEngine.replaceAll(textArea, context);
+		assertEquals(3, count);
+		assertEquals(expected, textArea.getText());
+
+		// Multiple captured groups.
+		context.setSearchFor("(\\d)(\\d+)[kM]");
+		textArea.setText("152k 5271143M 3985k");
+		expected = "1.52 5.271143 3.985";
+		context.setMatchCase(false);
+		context.setWholeWord(false);
+		context.setReplaceWith("$1.$2");
+		count = SearchEngine.replaceAll(textArea, context);
+		assertEquals(3, count);
+		assertEquals(expected, textArea.getText());
+
+		// No matches
+		context.setSearchFor("(\\d)(\\d+)ABC");
+		expected = "152k 5271143M 3985k";
+		textArea.setText(expected);
+		textArea.setCaretPosition(8);
+		context.setMatchCase(false);
+		context.setWholeWord(false);
+		context.setReplaceWith("$1.$2");
+		count = SearchEngine.replaceAll(textArea, context);
+		assertEquals(0, count);
+		assertEquals(expected, textArea.getText());
+		assertEquals(8, textArea.getCaretPosition()); // Caret doesn't move
+
+	}
+
+
+}
\ No newline at end of file
diff --git a/test/org/fife/ui/rtextarea/text.txt b/test/org/fife/ui/rtextarea/text.txt
new file mode 100644
index 0000000..e1a2e9e
--- /dev/null
+++ b/test/org/fife/ui/rtextarea/text.txt
@@ -0,0 +1 @@
+How much wood wOuld a woodChuck chUck, if a woodchuck could chuck wOod?
\ No newline at end of file
diff --git a/themes/dark.xml b/themes/dark.xml
new file mode 100644
index 0000000..9b51fbc
--- /dev/null
+++ b/themes/dark.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE RSyntaxTheme SYSTEM "theme.dtd">
+
+<!--
+	Dark theme based off of Notepad++'s Obsidian theme.
+	See theme.dtd and org.fife.ui.rsyntaxtextarea.Theme for more information.
+-->
+<RSyntaxTheme version="1.0">
+
+   <!-- Omitting baseFont will use a system-appropriate monospaced. -->
+   <!--<baseFont family="..." size="13"/>-->
+   
+   <!--  General editor colors. -->
+   <background color="293134"/>
+   <caret color="c1cbc2"/>
+   <selection useFG="false" bg="404E51" roundedEdges="false"/>
+   <currentLineHighlight color="2F393C" fade="false"/>
+   <marginLine fg="394448"/>
+   <markAllHighlight color="6b8189"/> <!-- TODO: Fix me -->
+   <markOccurrencesHighlight color="5b7179" border="false"/>
+   <matchedBracket fg="6A8088" bg="6b8189" highlightBoth="false" animate="true"/>
+   <hyperlinks fg="a082bd"/>
+   <secondaryLanguages>
+      <language index="1" bg="334455"/>
+      <language index="2" bg="223322"/>
+      <language index="3" bg="ffe0f0"/>
+   </secondaryLanguages>
+   
+   <!-- Gutter styling. -->
+   <gutterBorder color="81969A"/>
+   <lineNumbers fg="81969A"/>
+   <foldIndicator fg="6A8088" iconBg="2f383c"/>
+   <iconRowHeader activeLineRange="3399ff"/>
+   
+   <!-- Syntax tokens. -->
+   <tokenStyles>
+      <style token="IDENTIFIER" fg="E0E2E4"/>
+      <style token="RESERVED_WORD" fg="93C763" bold="true"/>
+      <style token="RESERVED_WORD_2" fg="93C763" bold="true"/>
+      <style token="ANNOTATION" fg="E8E2B7"/>
+      <style token="COMMENT_DOCUMENTATION" fg="6C788C"/>
+      <style token="COMMENT_EOL" fg="66747B"/>
+      <style token="COMMENT_MULTILINE" fg="66747B"/>
+      <style token="COMMENT_KEYWORD" fg="ae9fbf"/>
+      <style token="COMMENT_MARKUP" fg="ae9fbf"/>
+      <style token="FUNCTION" fg="E0E2E4"/>
+      <style token="DATA_TYPE" fg="678CB1" bold="true"/>
+      <style token="LITERAL_BOOLEAN" fg="93C763" bold="true"/>
+      <style token="LITERAL_NUMBER_DECIMAL_INT" fg="FFCD22"/>
+      <style token="LITERAL_NUMBER_FLOAT" fg="FFCD22"/>
+      <style token="LITERAL_NUMBER_HEXADECIMAL" fg="FFCD22"/>
+      <style token="LITERAL_STRING_DOUBLE_QUOTE" fg="EC7600"/>
+      <style token="LITERAL_CHAR" fg="EC7600"/>
+      <style token="LITERAL_BACKQUOTE" fg="EC7600"/>
+      <style token="MARKUP_TAG_DELIMITER" fg="678CB1"/>
+      <style token="MARKUP_TAG_NAME" fg="ABBFD3" bold="true"/>
+      <style token="MARKUP_TAG_ATTRIBUTE" fg="B3B689"/>
+      <style token="MARKUP_TAG_ATTRIBUTE_VALUE" fg="e1e2cf"/>
+      <style token="MARKUP_COMMENT" fg="66747B"/>
+      <style token="MARKUP_DTD" fg="A082BD"/>
+      <style token="MARKUP_PROCESSING_INSTRUCTION" fg="A082BD"/>
+      <style token="MARKUP_CDATA" fg="d5e6f0"/>
+      <style token="MARKUP_CDATA_DELIMITER" fg="ae9fbf"/>
+      <style token="MARKUP_ENTITY_REFERENCE" fg="678CB1"/>
+      <style token="OPERATOR" fg="E8E2B7"/>
+      <style token="PREPROCESSOR" fg="A082BD"/>
+      <style token="REGEX" fg="d39745"/>
+      <style token="SEPARATOR" fg="E8E2B7"/>
+      <style token="VARIABLE" fg="ae9fbf" bold="true"/>
+      <style token="WHITESPACE" fg="E0E2E4"/>
+      
+      <style token="ERROR_IDENTIFIER" fg="E0E2E4" bg="04790e"/>
+      <style token="ERROR_NUMBER_FORMAT" fg="E0E2E4" bg="04790e"/>
+      <style token="ERROR_STRING_DOUBLE" fg="E0E2E4" bg="04790e"/>
+      <style token="ERROR_CHAR" fg="E0E2E4" bg="04790e"/>
+   </tokenStyles>
+
+</RSyntaxTheme>
diff --git a/themes/default-alt.xml b/themes/default-alt.xml
new file mode 100644
index 0000000..24ac97c
--- /dev/null
+++ b/themes/default-alt.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE RSyntaxTheme SYSTEM "theme.dtd">
+
+<!--
+	RSyntaxTextArea's default theme, using the "standard" selection style.
+	See theme.dtd and org.fife.ui.rsyntaxtextarea.Theme for more information.
+-->
+<RSyntaxTheme version="1.0">
+
+   <!-- Omitting baseFont will use a system-appropriate monospaced. -->
+   <!--<baseFont family="..." size="13"/>-->
+   
+   <!--  General editor colors. -->
+   <background color="ffffff"/>
+   <caret color="ff0000"/>
+   <selection fg="default" bg="default"/>
+   <currentLineHighlight color="ffffaa" fade="false"/>
+   <marginLine fg="b0b4b9"/>
+   <markAllHighlight color="6b8189"/> <!-- TODO: Fix me -->
+   <markOccurrencesHighlight color="d4d4d4" border="false"/>
+   <matchedBracket fg="000080" bg="eaeaff" highlightBoth="false" animate="true"/>
+   <hyperlinks fg="0000ff"/>
+   <secondaryLanguages>
+      <language index="1" bg="fff0cc"/>
+      <language index="2" bg="dafeda"/>
+      <language index="3" bg="ffe0f0"/>
+   </secondaryLanguages>
+   
+   <!-- Gutter styling. -->
+   <gutterBorder color="dddddd"/>
+   <lineNumbers fg="787878"/>
+   <foldIndicator fg="808080" iconBg="ffffff"/>
+   <iconRowHeader activeLineRange="3399ff"/>
+   
+   <!-- Syntax tokens. -->
+   <tokenStyles>
+      <style token="IDENTIFIER" fg="000000"/>
+      <style token="RESERVED_WORD" fg="0000ff" bold="true"/>
+      <style token="RESERVED_WORD_2" fg="0000ff" bold="true"/>
+      <style token="ANNOTATION" fg="808080"/>
+      <style token="COMMENT_DOCUMENTATION" fg="a40000" italic="true"/>
+      <style token="COMMENT_EOL" fg="008000" italic="true"/>
+      <style token="COMMENT_MULTILINE" fg="008000" italic="true"/>
+      <style token="COMMENT_KEYWORD" fg="ff9900" bold="true"/>
+      <style token="COMMENT_MARKUP" fg="808080"/>
+      <style token="DATA_TYPE" fg="008080" bold="true"/>
+      <style token="FUNCTION" fg="ad8000"/>
+      <style token="LITERAL_BOOLEAN" fg="0000ff" bold="true"/>
+      <style token="LITERAL_NUMBER_DECIMAL_INT" fg="6400C8"/>
+      <style token="LITERAL_NUMBER_FLOAT" fg="6400C8"/>
+      <style token="LITERAL_NUMBER_HEXADECIMAL" fg="6400C8"/>
+      <style token="LITERAL_STRING_DOUBLE_QUOTE" fg="DC009C"/>
+      <style token="LITERAL_CHAR" fg="DC009C"/>
+      <style token="LITERAL_BACKQUOTE" fg="DC009C"/>
+      <style token="MARKUP_TAG_DELIMITER" fg="ff0000"/>
+      <style token="MARKUP_TAG_NAME" fg="0000ff"/>
+      <style token="MARKUP_TAG_ATTRIBUTE" fg="3f7f7f"/>
+      <style token="MARKUP_TAG_ATTRIBUTE_VALUE" fg="DC009C"/>
+      <style token="MARKUP_COMMENT" fg="006000" italic="true"/>
+      <style token="MARKUP_DTD" fg="ad8000"/>
+      <style token="MARKUP_PROCESSING_INSTRUCTION" fg="808080"/>
+      <style token="MARKUP_CDATA" fg="cc6600"/>
+      <style token="MARKUP_CDATA_DELIMITER" fg="008080"/>
+      <style token="MARKUP_ENTITY_REFERENCE" fg="008000"/>
+      <style token="OPERATOR" fg="804040"/>
+      <style token="PREPROCESSOR" fg="808080"/>
+      <style token="REGEX" fg="008040"/>
+      <style token="SEPARATOR" fg="ff0000"/>
+      <style token="VARIABLE" fg="ee8800" bold="true"/>
+      <style token="WHITESPACE" fg="000000"/>
+      
+      <style token="ERROR_IDENTIFIER" fg="000000" bg="ffcccc"/>
+      <style token="ERROR_NUMBER_FORMAT" fg="000000" bg="ffcccc"/>
+      <style token="ERROR_STRING_DOUBLE" fg="000000" bg="ffcccc"/>
+      <style token="ERROR_CHAR" fg="000000" bg="ffcccc"/>
+   </tokenStyles>
+
+</RSyntaxTheme>
diff --git a/themes/default.xml b/themes/default.xml
new file mode 100644
index 0000000..3a3bbfd
--- /dev/null
+++ b/themes/default.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE RSyntaxTheme SYSTEM "theme.dtd">
+
+<!--
+	RSyntaxTextArea's default theme.
+	See theme.dtd and org.fife.ui.rsyntaxtextarea.Theme for more information.
+-->
+<RSyntaxTheme version="1.0">
+
+   <!-- Omitting baseFont will use a system-appropriate monospaced. -->
+   <!--<baseFont family="..." size="13"/>-->
+   
+   <!--  General editor colors. -->
+   <background color="ffffff"/>
+   <caret color="ff0000"/>
+   <selection fg="default" useFG="false" bg="c8c8ff"/>
+   <currentLineHighlight color="ffffaa" fade="false"/>
+   <marginLine fg="b0b4b9"/>
+   <markAllHighlight color="6b8189"/> <!-- TODO: Fix me -->
+   <markOccurrencesHighlight color="d4d4d4" border="false"/>
+   <matchedBracket fg="000080" bg="eaeaff" highlightBoth="false" animate="true"/>
+   <hyperlinks fg="0000ff"/>
+   <secondaryLanguages>
+      <language index="1" bg="fff0cc"/>
+      <language index="2" bg="dafeda"/>
+      <language index="3" bg="ffe0f0"/>
+   </secondaryLanguages>
+   
+   <!-- Gutter styling. -->
+   <gutterBorder color="dddddd"/>
+   <lineNumbers fg="787878"/>
+   <foldIndicator fg="808080" iconBg="ffffff"/>
+   <iconRowHeader activeLineRange="3399ff"/>
+   
+   <!-- Syntax tokens. -->
+   <tokenStyles>
+      <style token="IDENTIFIER" fg="000000"/>
+      <style token="RESERVED_WORD" fg="0000ff" bold="true"/>
+      <style token="RESERVED_WORD_2" fg="0000ff" bold="true"/>
+      <style token="ANNOTATION" fg="808080"/>
+      <style token="COMMENT_DOCUMENTATION" fg="a40000" italic="true"/>
+      <style token="COMMENT_EOL" fg="008000" italic="true"/>
+      <style token="COMMENT_MULTILINE" fg="008000" italic="true"/>
+      <style token="COMMENT_KEYWORD" fg="ff9900" bold="true"/>
+      <style token="COMMENT_MARKUP" fg="808080"/>
+      <style token="DATA_TYPE" fg="008080" bold="true"/>
+      <style token="FUNCTION" fg="ad8000"/>
+      <style token="LITERAL_BOOLEAN" fg="0000ff" bold="true"/>
+      <style token="LITERAL_NUMBER_DECIMAL_INT" fg="6400C8"/>
+      <style token="LITERAL_NUMBER_FLOAT" fg="6400C8"/>
+      <style token="LITERAL_NUMBER_HEXADECIMAL" fg="6400C8"/>
+      <style token="LITERAL_STRING_DOUBLE_QUOTE" fg="DC009C"/>
+      <style token="LITERAL_CHAR" fg="DC009C"/>
+      <style token="LITERAL_BACKQUOTE" fg="DC009C"/>
+      <style token="MARKUP_TAG_DELIMITER" fg="ff0000"/>
+      <style token="MARKUP_TAG_NAME" fg="0000ff"/>
+      <style token="MARKUP_TAG_ATTRIBUTE" fg="3f7f7f"/>
+      <style token="MARKUP_TAG_ATTRIBUTE_VALUE" fg="DC009C"/>
+      <style token="MARKUP_COMMENT" fg="006000" italic="true"/>
+      <style token="MARKUP_DTD" fg="ad8000"/>
+      <style token="MARKUP_PROCESSING_INSTRUCTION" fg="808080"/>
+      <style token="MARKUP_CDATA" fg="cc6600"/>
+      <style token="MARKUP_CDATA_DELIMITER" fg="008080"/>
+      <style token="MARKUP_ENTITY_REFERENCE" fg="008000"/>
+      <style token="OPERATOR" fg="804040"/>
+      <style token="PREPROCESSOR" fg="808080"/>
+      <style token="REGEX" fg="008040"/>
+      <style token="SEPARATOR" fg="ff0000"/>
+      <style token="VARIABLE" fg="ee8800" bold="true"/>
+      <style token="WHITESPACE" fg="000000"/>
+      
+      <style token="ERROR_IDENTIFIER" fg="000000" bg="ffcccc"/>
+      <style token="ERROR_NUMBER_FORMAT" fg="000000" bg="ffcccc"/>
+      <style token="ERROR_STRING_DOUBLE" fg="000000" bg="ffcccc"/>
+      <style token="ERROR_CHAR" fg="000000" bg="ffcccc"/>
+   </tokenStyles>
+
+</RSyntaxTheme>
diff --git a/themes/eclipse.xml b/themes/eclipse.xml
new file mode 100644
index 0000000..1196f80
--- /dev/null
+++ b/themes/eclipse.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE RSyntaxTheme SYSTEM "theme.dtd">
+
+<!--
+	Theme that mimics Eclipse's defaults.
+	See theme.dtd and org.fife.ui.rsyntaxtextarea.Theme for more information.
+-->
+<RSyntaxTheme version="1.0">
+
+   <!-- Omitting baseFont will use a system-appropriate monospaced. -->
+   <!--<baseFont family="..." size="13"/>-->
+   
+   <!--  General editor colors. -->
+   <background color="ffffff"/>
+   <caret color="000000"/>
+   <selection bg="default" fg="default"/>
+   <currentLineHighlight color="e8f2fe" fade="false"/>
+   <marginLine fg="b0b4b9"/>
+   <markAllHighlight color="6b8189"/> <!-- TODO: Fix me -->
+   <markOccurrencesHighlight color="d4d4d4" border="false"/>
+   <matchedBracket fg="c0c0c0" highlightBoth="false" animate="false"/>
+   <hyperlinks fg="0000ff"/>
+   <secondaryLanguages>
+      <language index="1" bg="fff0cc"/>
+      <language index="2" bg="dafeda"/>
+      <language index="3" bg="ffe0f0"/>
+   </secondaryLanguages>
+   
+   <!-- Gutter styling. -->
+   <gutterBorder color="dddddd"/>
+   <lineNumbers fg="787878"/>
+   <foldIndicator fg="808080" iconBg="ffffff"/>
+   <iconRowHeader activeLineRange="3399ff"/>
+   
+   <!-- Syntax tokens. -->
+   <tokenStyles>
+      <style token="IDENTIFIER" fg="000000"/>
+      <style token="RESERVED_WORD" fg="7f0055" bold="true"/>
+      <style token="RESERVED_WORD_2" fg="7f0055" bold="true"/>
+      <style token="ANNOTATION" fg="808080"/>
+      <style token="COMMENT_DOCUMENTATION" fg="3f5fbf"/>
+      <style token="COMMENT_EOL" fg="3f7f5f"/>
+      <style token="COMMENT_MULTILINE" fg="3f7f5f"/>
+      <style token="COMMENT_KEYWORD" fg="7F9FBF" bold="true"/>
+      <style token="COMMENT_MARKUP" fg="7f7f9f"/>
+      <style token="DATA_TYPE" fg="7f0055" bold="true"/>
+      <style token="FUNCTION" fg="000000"/>
+      <style token="LITERAL_BOOLEAN" fg="7f0055" bold="true"/>
+      <style token="LITERAL_NUMBER_DECIMAL_INT" fg="000000"/>
+      <style token="LITERAL_NUMBER_FLOAT" fg="000000"/>
+      <style token="LITERAL_NUMBER_HEXADECIMAL" fg="000000"/>
+      <style token="LITERAL_STRING_DOUBLE_QUOTE" fg="2900ff"/>
+      <style token="LITERAL_CHAR" fg="2900ff"/>
+      <style token="LITERAL_BACKQUOTE" fg="2900ff"/>
+      <style token="MARKUP_TAG_DELIMITER" fg="008080"/>
+      <style token="MARKUP_TAG_NAME" fg="3f7f7f"/>
+      <style token="MARKUP_TAG_ATTRIBUTE" fg="7f007f"/>
+      <style token="MARKUP_TAG_ATTRIBUTE_VALUE" fg="2a00ff" italic="true"/>
+      <style token="MARKUP_COMMENT" fg="3f5fbf"/>
+      <style token="MARKUP_DTD" fg="008080"/>
+      <style token="MARKUP_PROCESSING_INSTRUCTION" fg="808080"/>
+      <style token="MARKUP_CDATA" fg="000000"/>
+      <style token="MARKUP_CDATA_DELIMITER" fg="008080"/>
+      <style token="MARKUP_ENTITY_REFERENCE" fg="2a00ff"/>
+      <style token="OPERATOR" fg="000000"/>
+      <style token="PREPROCESSOR" fg="808080"/>
+      <style token="REGEX" fg="008040"/>
+      <style token="SEPARATOR" fg="000000"/>
+      <style token="VARIABLE" fg="ff9900" bold="true"/>
+      <style token="WHITESPACE" fg="000000"/>
+      
+      <style token="ERROR_IDENTIFIER" fg="000000" bg="ffcccc"/>
+      <style token="ERROR_NUMBER_FORMAT" fg="000000" bg="ffcccc"/>
+      <style token="ERROR_STRING_DOUBLE" fg="000000" bg="ffcccc"/>
+      <style token="ERROR_CHAR" fg="000000" bg="ffcccc"/>
+   </tokenStyles>
+
+</RSyntaxTheme>
diff --git a/themes/idea.xml b/themes/idea.xml
new file mode 100644
index 0000000..b4ae50f
--- /dev/null
+++ b/themes/idea.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE RSyntaxTheme SYSTEM "theme.dtd">
+
+<!--
+	Theme that mimics IntelliJ IDEA's defaults.
+	See theme.dtd and org.fife.ui.rsyntaxtextarea.Theme for more information.
+-->
+<RSyntaxTheme version="1.0">
+
+   <!-- Omitting baseFont will use a system-appropriate monospaced. -->
+   <!--<baseFont family="..." size="13"/>-->
+   
+   <!--  General editor colors. -->
+   <background color="ffffff" />
+   <caret color="000000" />
+   <selection fg="default" bg="default" />
+   <currentLineHighlight color="ffffd7" fade="false" />
+   <marginLine fg="b0b4b9" />
+   <markAllHighlight color="ccccff" />
+   <markOccurrencesHighlight color="ccccff" border="false" />
+   <matchedBracket fg="99ccff" bg="99ccff" highlightBoth="true" animate="false" />
+   <hyperlinks fg="0000ff" />
+   <secondaryLanguages>
+      <language index="1" bg="fff0cc" />
+      <language index="2" bg="dafeda" />
+      <language index="3" bg="ffe0f0" />
+   </secondaryLanguages>
+
+   <!-- Gutter styling. -->
+   <gutterBorder color="dddddd" />
+   <lineNumbers fg="787878" />
+   <foldIndicator fg="808080" iconBg="ffffff" />
+   <iconRowHeader activeLineRange="3399ff" />
+
+   <!-- Syntax tokens. -->
+   <tokenStyles>
+      <style token="IDENTIFIER" fg="000000" />
+      <style token="RESERVED_WORD" fg="000080" bold="true" />
+      <style token="RESERVED_WORD_2" fg="000080" bold="true" />
+      <style token="ANNOTATION" fg="808000" />
+      <style token="COMMENT_DOCUMENTATION" fg="808080" italic="true" />
+      <style token="COMMENT_EOL" fg="808080" italic="true" />
+      <style token="COMMENT_MULTILINE" fg="808080" italic="true" />
+      <style token="COMMENT_KEYWORD" fg="808080" bold="true" underline="true" italic="true" />
+      <style token="COMMENT_MARKUP" fg="808080" bg="e2ffe2" italic="true" />
+      <style token="DATA_TYPE" fg="000080" bold="true" />
+      <style token="FUNCTION" fg="000000" />
+      <style token="LITERAL_BOOLEAN" fg="000080" bold="true" />
+      <style token="LITERAL_NUMBER_DECIMAL_INT" fg="0000ff" />
+      <style token="LITERAL_NUMBER_FLOAT" fg="0000ff" />
+      <style token="LITERAL_NUMBER_HEXADECIMAL" fg="0000ff" />
+      <style token="LITERAL_STRING_DOUBLE_QUOTE" fg="008000" bold="true" />
+      <style token="LITERAL_CHAR" fg="008000" bold="true" />
+      <style token="LITERAL_BACKQUOTE" fg="008000" bold="true" />
+      <style token="MARKUP_TAG_DELIMITER" fg="000000" bold="true" />
+      <style token="MARKUP_TAG_NAME" fg="000080" bold="true" />
+      <style token="MARKUP_TAG_ATTRIBUTE" fg="0000ff" bold="true" />
+      <style token="MARKUP_TAG_ATTRIBUTE_VALUE" fg="008000" bold="true" />
+      <style token="MARKUP_COMMENT" fg="808080" italic="true"/>
+      <style token="MARKUP_DTD" fg="808080"/>
+      <style token="MARKUP_PROCESSING_INSTRUCTION"  fg="808080"/>
+      <style token="MARKUP_CDATA" fg="cc6600"/>
+      <style token="MARKUP_CDATA_DELIMITER" fg="008080"/>
+      <style token="MARKUP_ENTITY_REFERENCE" fg="008000"/>
+      <style token="OPERATOR" fg="000000" />
+      <style token="PREPROCESSOR" fg="808080" />
+      <style token="REGEX" fg="008040" />
+      <style token="SEPARATOR" fg="000000" />
+      <style token="VARIABLE" fg="810ca8" bold="true" />
+      <style token="WHITESPACE" fg="000000" />
+
+      <style token="ERROR_IDENTIFIER" fg="ff0000" />
+      <style token="ERROR_NUMBER_FORMAT" fg="ff0000" />
+      <style token="ERROR_STRING_DOUBLE" fg="ff0000" />
+      <style token="ERROR_CHAR" fg="ff0000" />
+   </tokenStyles>
+
+</RSyntaxTheme>
diff --git a/themes/vs.xml b/themes/vs.xml
new file mode 100644
index 0000000..78692d9
--- /dev/null
+++ b/themes/vs.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE RSyntaxTheme SYSTEM "theme.dtd">
+
+<!--
+	Theme that mimics Visual Studio's defaults.
+	See theme.dtd and org.fife.ui.rsyntaxtextarea.Theme for more information.
+-->
+<RSyntaxTheme version="1.0">
+
+   <!-- Omitting baseFont will use a system-appropriate monospaced. -->
+   <!--<baseFont family="..." size="13"/>-->
+   
+   <!--  General editor colors. -->
+   <background color="ffffff"/>
+   <caret color="000000"/>
+   <selection fg="default" bg="default"/>
+   <currentLineHighlight color="e8f2fe" fade="false"/>
+   <marginLine fg="b0b4b9"/>
+   <markAllHighlight color="6b8189"/> <!-- TODO: Fix me -->
+   <markOccurrencesHighlight color="d4d4d4" border="false"/> <!-- TODO: Fix me -->
+   <matchedBracket fg="DBE0CC" highlightBoth="false" animate="false"/>
+   <hyperlinks fg="0000ff"/>
+   <secondaryLanguages>
+      <language index="1" bg="fff0cc"/>
+      <language index="2" bg="dafeda"/>
+      <language index="3" bg="ffe0f0"/>
+   </secondaryLanguages>
+   
+   
+   <!-- Gutter styling. -->
+   <gutterBorder color="808080"/>
+   <lineNumbers fg="2B91AF"/>
+   <foldIndicator fg="808080" iconBg="ffffff"/>
+   <iconRowHeader activeLineRange="3399ff"/>
+   
+   <!-- Syntax tokens. -->
+   <tokenStyles>
+      <style token="IDENTIFIER" fg="000000"/>
+      <style token="RESERVED_WORD" fg="0000ff" bold="true"/>
+      <style token="RESERVED_WORD_2" fg="0000ff" bold="true"/>
+      <style token="ANNOTATION" fg="808080"/>
+      <style token="COMMENT_DOCUMENTATION" fg="008000"/>
+      <style token="COMMENT_EOL" fg="008000"/>
+      <style token="COMMENT_MULTILINE" fg="008000"/>
+      <style token="COMMENT_KEYWORD" fg="ae9fbf"/>
+      <style token="COMMENT_MARKUP" fg="808080"/>
+      <style token="DATA_TYPE" fg="0000ff" bold="true"/>
+      <style token="FUNCTION" fg="000000"/>
+      <style token="LITERAL_BOOLEAN" fg="0000ff" bold="true"/>
+      <style token="LITERAL_NUMBER_DECIMAL_INT" fg="000000"/>
+      <style token="LITERAL_NUMBER_FLOAT" fg="000000"/>
+      <style token="LITERAL_NUMBER_HEXADECIMAL" fg="000000"/>
+      <style token="LITERAL_STRING_DOUBLE_QUOTE" fg="A31515"/>
+      <style token="LITERAL_CHAR" fg="A31515"/>
+      <style token="LITERAL_BACKQUOTE" fg="A31515"/>
+      <style token="MARKUP_TAG_DELIMITER" fg="0000ff"/>
+      <style token="MARKUP_TAG_NAME" fg="A31515"/>
+      <style token="MARKUP_TAG_ATTRIBUTE" fg="ff0000"/>
+      <style token="MARKUP_TAG_ATTRIBUTE_VALUE" fg="0000ff"/>
+      <style token="MARKUP_COMMENT" fg="006000" italic="true"/>
+      <style token="MARKUP_DTD" fg="ad8000"/>
+      <style token="MARKUP_PROCESSING_INSTRUCTION" fg="808080"/>
+      <style token="MARKUP_CDATA" fg="000000"/>
+      <style token="MARKUP_CDATA_DELIMITER" fg="0000ff"/>
+      <style token="OPERATOR" fg="000000"/>
+      <style token="PREPROCESSOR" fg="808080"/>
+      <style token="REGEX" fg="000000"/>
+      <style token="SEPARATOR" fg="000000"/>
+      <style token="VARIABLE" fg="ff9900" bold="true"/>
+      <style token="WHITESPACE" fg="000000"/>
+      
+      <style token="ERROR_IDENTIFIER" fg="000000" bg="ffcccc"/>
+      <style token="ERROR_NUMBER_FORMAT" fg="000000" bg="ffcccc"/>
+      <style token="ERROR_STRING_DOUBLE" fg="000000" bg="ffcccc"/>
+      <style token="ERROR_CHAR" fg="000000" bg="ffcccc"/>
+   </tokenStyles>
+
+</RSyntaxTheme>

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/rsyntaxtextarea.git



More information about the pkg-java-commits mailing list