diff --git a/python/pluginResources/messages/PyBundle.properties b/python/pluginResources/messages/PyBundle.properties
index 2ca7f5b79992..93b0e49a5fb3 100644
--- a/python/pluginResources/messages/PyBundle.properties
+++ b/python/pluginResources/messages/PyBundle.properties
@@ -226,7 +226,7 @@ INTN.replace.noteq.operator=Replace not equal operator
INTN.remove.leading.$0=Remove leading {0}
INTN.remove.leading.prefix=Remove prefix
-INTN.remove.trailing.l=Remove trailing L
+INTN.remove.trailing.suffix=Remove trailing suffix
INTN.replace.list.comprehensions=Convert list comprehensions to supported form
@@ -636,6 +636,9 @@ INSP.NAME.coroutine.is.not.awaited=Coroutine ''{0}'' is not awaited
# PyTestParametrizedInspection
INSP.NAME.pytest-parametrized=Checks that functions decorated by pytest parametrize have correct arguments
+# PyHighlightingAnnotator
+INSP.python.trailing.suffix.not.support=Python does not support a trailing ''{0}''
+
INSP.abstract.class.set.as.metaclass=Set ''{0}'' as metaclass
INSP.abstract.class.add.to.superclasses=Add ''{0}'' to superclasses
INSP.compatibility.this.syntax.available.only.since.py3=This syntax available only since py3
diff --git a/python/python-psi-api/src/com/jetbrains/python/psi/PyNumericLiteralExpression.java b/python/python-psi-api/src/com/jetbrains/python/psi/PyNumericLiteralExpression.java
index f342526b24f3..57f4e99e1a68 100644
--- a/python/python-psi-api/src/com/jetbrains/python/psi/PyNumericLiteralExpression.java
+++ b/python/python-psi-api/src/com/jetbrains/python/psi/PyNumericLiteralExpression.java
@@ -43,4 +43,12 @@ public interface PyNumericLiteralExpression extends PyLiteralExpression {
BigDecimal getBigDecimalValue();
boolean isIntegerLiteral();
+
+ /**
+ * Returns possible suffix of integer literal like {@code uL}.
+ *
+ * @return null if this is not integer literal or the suffix is missed; string suffix otherwise
+ */
+ @Nullable
+ String getIntegerLiteralSuffix();
}
diff --git a/python/python-psi-impl/gen/com/jetbrains/python/lexer/_PythonLexer.java b/python/python-psi-impl/gen/com/jetbrains/python/lexer/_PythonLexer.java
index 04af6f56def6..6e2cf355c9f9 100644
--- a/python/python-psi-impl/gen/com/jetbrains/python/lexer/_PythonLexer.java
+++ b/python/python-psi-impl/gen/com/jetbrains/python/lexer/_PythonLexer.java
@@ -121,62 +121,62 @@ class _PythonLexer implements FlexLexerEx {
/* The ZZ_CMAP_A table has 3424 entries */
static final char ZZ_CMAP_A[] = zzUnpackCMap(
- "\11\0\1\36\1\37\1\113\1\46\1\14\22\0\1\34\1\35\1\27\1\13\1\0\1\102\1\103\1"+
- "\25\1\40\1\41\1\77\1\76\1\111\1\21\1\17\1\101\1\1\1\5\6\3\2\2\1\44\1\47\1"+
- "\107\1\45\1\106\1\0\1\100\1\4\1\11\1\23\1\4\1\20\1\30\3\15\1\22\1\15\1\12"+
- "\1\15\1\33\1\10\2\15\1\24\2\15\1\24\2\15\1\6\2\15\1\42\1\26\1\43\1\105\1\7"+
- "\1\112\1\50\1\57\1\61\1\52\1\54\1\66\1\73\1\75\1\64\1\22\1\60\1\62\1\72\1"+
- "\51\1\63\1\70\1\15\1\55\1\53\1\56\1\65\1\15\1\74\1\67\1\71\1\15\1\31\1\104"+
- "\1\32\1\110\6\0\1\113\24\0\1\15\12\0\1\15\4\0\1\15\5\0\27\15\1\0\12\15\4\0"+
- "\14\15\16\0\5\15\7\0\1\15\1\0\1\15\1\0\5\15\1\0\2\15\2\0\4\15\1\0\1\15\6\0"+
- "\1\15\1\0\3\15\1\0\1\15\1\0\4\15\1\0\23\15\1\0\11\15\1\0\26\15\2\0\1\15\6"+
- "\0\10\15\10\0\16\15\1\0\1\15\1\0\2\15\1\0\2\15\1\0\1\15\10\0\13\15\5\0\3\15"+
- "\15\0\12\16\4\0\6\15\1\0\10\15\2\0\12\15\1\0\6\15\12\16\3\15\2\0\14\15\2\0"+
- "\3\15\12\16\14\15\4\0\1\15\5\0\16\15\2\0\14\15\4\0\5\15\1\0\10\15\6\0\20\15"+
- "\2\0\12\16\1\15\2\0\16\15\1\0\1\15\3\0\4\15\2\0\11\15\2\0\2\15\2\0\4\15\10"+
- "\0\1\15\4\0\2\15\1\0\1\15\1\0\3\15\1\0\6\15\4\0\2\15\1\0\2\15\1\0\2\15\1\0"+
- "\2\15\2\0\1\15\1\0\5\15\4\0\2\15\2\0\3\15\3\0\1\15\7\0\4\15\1\0\1\15\7\0\12"+
- "\16\6\15\13\0\3\15\1\0\11\15\1\0\2\15\1\0\2\15\1\0\5\15\2\0\12\15\1\0\3\15"+
- "\1\0\3\15\2\0\1\15\30\0\1\15\7\0\3\15\1\0\10\15\2\0\6\15\2\0\2\15\2\0\3\15"+
- "\10\0\2\15\4\0\2\15\1\0\1\15\1\0\1\15\20\0\2\15\1\0\6\15\3\0\3\15\1\0\4\15"+
- "\3\0\2\15\1\0\1\15\1\0\2\15\3\0\2\15\3\0\3\15\3\0\14\15\4\0\5\15\3\0\3\15"+
- "\1\0\4\15\2\0\1\15\6\0\1\15\10\0\4\15\1\0\10\15\1\0\3\15\1\0\30\15\3\0\10"+
- "\15\1\0\3\15\1\0\4\15\7\0\2\15\1\0\3\15\5\0\4\15\1\0\5\15\2\0\4\15\5\0\2\15"+
- "\7\0\1\15\2\0\2\15\16\0\3\15\1\0\10\15\1\0\7\15\1\0\3\15\1\0\5\15\5\0\4\15"+
- "\7\0\1\15\12\0\6\15\2\0\2\15\1\0\22\15\3\0\10\15\1\0\11\15\1\0\1\15\2\0\7"+
- "\15\3\0\1\15\4\0\6\15\1\0\1\15\1\0\10\15\2\0\2\15\14\0\17\15\1\0\12\16\7\0"+
- "\2\15\1\0\1\15\2\0\2\15\1\0\1\15\2\0\1\15\6\0\4\15\1\0\7\15\1\0\3\15\1\0\1"+
- "\15\1\0\1\15\2\0\2\15\1\0\15\15\1\0\3\15\2\0\5\15\1\0\1\15\1\0\6\15\2\0\12"+
- "\16\2\0\4\15\10\0\2\15\13\0\1\15\1\0\1\15\1\0\1\15\4\0\12\15\1\0\24\15\3\0"+
- "\5\15\1\0\12\15\6\0\1\15\11\0\12\16\4\15\2\0\6\15\1\0\1\15\5\0\1\15\2\0\13"+
- "\15\1\0\15\15\1\0\4\15\2\0\7\15\1\0\1\15\1\0\4\15\2\0\1\15\1\0\4\15\2\0\7"+
- "\15\1\0\1\15\1\0\4\15\2\0\16\15\2\0\6\15\2\0\15\15\2\0\14\15\3\0\13\15\7\0"+
- "\15\15\1\0\7\15\13\0\4\15\14\0\1\15\1\0\2\15\14\0\4\15\3\0\1\15\4\0\2\15\15"+
- "\0\3\15\2\0\12\15\15\0\1\15\23\0\5\15\12\16\3\0\6\15\1\0\23\15\1\0\2\15\6"+
- "\0\6\15\5\0\15\15\1\0\1\15\1\0\1\15\1\0\1\15\1\0\6\15\1\0\7\15\1\0\1\15\3"+
- "\0\3\15\1\0\7\15\3\0\4\15\2\0\6\15\14\0\2\113\25\0\1\15\4\0\1\15\14\0\1\15"+
- "\15\0\1\15\2\0\1\15\4\0\1\15\2\0\12\15\1\0\1\15\3\0\5\15\6\0\1\15\1\0\1\15"+
- "\1\0\1\15\1\0\4\15\1\0\13\15\2\0\4\15\5\0\5\15\4\0\1\15\7\0\17\15\6\0\15\15"+
- "\7\0\10\15\11\0\7\15\1\0\7\15\6\0\3\15\11\0\5\15\2\0\5\15\3\0\7\15\2\0\2\15"+
- "\2\0\3\15\5\0\13\15\12\16\2\15\4\0\3\15\1\0\12\15\1\0\1\15\7\0\11\15\2\0\27"+
- "\15\2\0\15\15\3\0\1\15\1\0\1\15\2\0\1\15\16\0\1\15\12\16\5\15\3\0\5\15\12"+
- "\0\6\15\2\0\6\15\2\0\6\15\11\0\13\15\1\0\2\15\2\0\7\15\4\0\5\15\3\0\5\15\5"+
- "\0\12\15\1\0\5\15\1\0\1\15\1\0\2\15\1\0\2\15\1\0\12\15\3\0\15\15\3\0\2\15"+
- "\30\0\16\15\4\0\1\15\2\0\6\15\2\0\6\15\2\0\6\15\2\0\3\15\3\0\14\15\1\0\16"+
- "\15\1\0\2\15\1\0\1\15\15\0\1\15\2\0\4\15\4\0\10\15\1\0\5\15\12\0\6\15\2\0"+
- "\1\15\1\0\14\15\1\0\2\15\3\0\1\15\2\0\4\15\1\0\2\15\12\0\10\15\6\0\6\15\1"+
- "\0\2\15\5\0\10\15\1\0\3\15\1\0\13\15\4\0\3\15\4\0\6\15\1\0\12\16\4\15\2\0"+
- "\1\15\11\0\5\15\5\0\3\15\3\0\12\16\1\15\1\0\1\15\3\0\10\15\6\0\1\15\1\0\7"+
- "\15\1\0\1\15\1\0\4\15\1\0\2\15\6\0\1\15\5\0\7\15\2\0\7\15\3\0\6\15\1\0\1\15"+
- "\10\0\6\15\2\0\10\15\10\0\6\15\2\0\1\15\3\0\1\15\13\0\10\15\5\0\15\15\3\0"+
- "\2\15\6\0\5\15\3\0\6\15\10\0\10\15\2\0\7\15\16\0\4\15\4\0\3\15\15\0\1\15\2"+
- "\0\2\15\2\0\4\15\1\0\14\15\1\0\1\15\1\0\7\15\1\0\21\15\1\0\4\15\2\0\10\15"+
- "\1\0\7\15\1\0\14\15\1\0\4\15\1\0\5\15\1\0\1\15\3\0\11\15\1\0\10\15\2\0\22"+
- "\16\5\0\1\15\12\0\2\15\1\0\2\15\1\0\5\15\6\0\2\15\1\0\1\15\2\0\1\15\1\0\12"+
- "\15\1\0\4\15\1\0\1\15\1\0\1\15\6\0\1\15\4\0\1\15\1\0\1\15\1\0\1\15\1\0\3\15"+
- "\1\0\2\15\1\0\1\15\2\0\1\15\1\0\1\15\1\0\1\15\1\0\1\15\1\0\1\15\1\0\2\15\1"+
- "\0\1\15\2\0\4\15\1\0\7\15\1\0\4\15\1\0\4\15\1\0\1\15\1\0\12\15\1\0\5\15\1"+
- "\0\3\15\1\0\5\15\1\0\5\15");
+ "\11\0\1\41\1\42\1\114\1\51\1\17\22\0\1\37\1\40\1\32\1\16\1\0\1\103\1\104\1"+
+ "\30\1\43\1\44\1\100\1\77\1\112\1\24\1\22\1\102\1\1\1\5\6\3\2\2\1\47\1\52\1"+
+ "\110\1\50\1\107\1\0\1\101\1\4\1\11\1\26\1\4\1\23\1\33\3\20\1\25\1\20\1\15"+
+ "\1\20\1\36\1\10\2\20\1\27\2\20\1\14\2\20\1\6\2\20\1\45\1\31\1\46\1\106\1\7"+
+ "\1\113\1\53\1\62\1\64\1\55\1\57\1\67\1\74\1\76\1\66\1\25\1\63\1\13\1\73\1"+
+ "\54\1\65\1\71\1\20\1\60\1\56\1\61\1\12\1\20\1\75\1\70\1\72\1\20\1\34\1\105"+
+ "\1\35\1\111\6\0\1\114\24\0\1\20\12\0\1\20\4\0\1\20\5\0\27\20\1\0\12\20\4\0"+
+ "\14\20\16\0\5\20\7\0\1\20\1\0\1\20\1\0\5\20\1\0\2\20\2\0\4\20\1\0\1\20\6\0"+
+ "\1\20\1\0\3\20\1\0\1\20\1\0\4\20\1\0\23\20\1\0\11\20\1\0\26\20\2\0\1\20\6"+
+ "\0\10\20\10\0\16\20\1\0\1\20\1\0\2\20\1\0\2\20\1\0\1\20\10\0\13\20\5\0\3\20"+
+ "\15\0\12\21\4\0\6\20\1\0\10\20\2\0\12\20\1\0\6\20\12\21\3\20\2\0\14\20\2\0"+
+ "\3\20\12\21\14\20\4\0\1\20\5\0\16\20\2\0\14\20\4\0\5\20\1\0\10\20\6\0\20\20"+
+ "\2\0\12\21\1\20\2\0\16\20\1\0\1\20\3\0\4\20\2\0\11\20\2\0\2\20\2\0\4\20\10"+
+ "\0\1\20\4\0\2\20\1\0\1\20\1\0\3\20\1\0\6\20\4\0\2\20\1\0\2\20\1\0\2\20\1\0"+
+ "\2\20\2\0\1\20\1\0\5\20\4\0\2\20\2\0\3\20\3\0\1\20\7\0\4\20\1\0\1\20\7\0\12"+
+ "\21\6\20\13\0\3\20\1\0\11\20\1\0\2\20\1\0\2\20\1\0\5\20\2\0\12\20\1\0\3\20"+
+ "\1\0\3\20\2\0\1\20\30\0\1\20\7\0\3\20\1\0\10\20\2\0\6\20\2\0\2\20\2\0\3\20"+
+ "\10\0\2\20\4\0\2\20\1\0\1\20\1\0\1\20\20\0\2\20\1\0\6\20\3\0\3\20\1\0\4\20"+
+ "\3\0\2\20\1\0\1\20\1\0\2\20\3\0\2\20\3\0\3\20\3\0\14\20\4\0\5\20\3\0\3\20"+
+ "\1\0\4\20\2\0\1\20\6\0\1\20\10\0\4\20\1\0\10\20\1\0\3\20\1\0\30\20\3\0\10"+
+ "\20\1\0\3\20\1\0\4\20\7\0\2\20\1\0\3\20\5\0\4\20\1\0\5\20\2\0\4\20\5\0\2\20"+
+ "\7\0\1\20\2\0\2\20\16\0\3\20\1\0\10\20\1\0\7\20\1\0\3\20\1\0\5\20\5\0\4\20"+
+ "\7\0\1\20\12\0\6\20\2\0\2\20\1\0\22\20\3\0\10\20\1\0\11\20\1\0\1\20\2\0\7"+
+ "\20\3\0\1\20\4\0\6\20\1\0\1\20\1\0\10\20\2\0\2\20\14\0\17\20\1\0\12\21\7\0"+
+ "\2\20\1\0\1\20\2\0\2\20\1\0\1\20\2\0\1\20\6\0\4\20\1\0\7\20\1\0\3\20\1\0\1"+
+ "\20\1\0\1\20\2\0\2\20\1\0\15\20\1\0\3\20\2\0\5\20\1\0\1\20\1\0\6\20\2\0\12"+
+ "\21\2\0\4\20\10\0\2\20\13\0\1\20\1\0\1\20\1\0\1\20\4\0\12\20\1\0\24\20\3\0"+
+ "\5\20\1\0\12\20\6\0\1\20\11\0\12\21\4\20\2\0\6\20\1\0\1\20\5\0\1\20\2\0\13"+
+ "\20\1\0\15\20\1\0\4\20\2\0\7\20\1\0\1\20\1\0\4\20\2\0\1\20\1\0\4\20\2\0\7"+
+ "\20\1\0\1\20\1\0\4\20\2\0\16\20\2\0\6\20\2\0\15\20\2\0\14\20\3\0\13\20\7\0"+
+ "\15\20\1\0\7\20\13\0\4\20\14\0\1\20\1\0\2\20\14\0\4\20\3\0\1\20\4\0\2\20\15"+
+ "\0\3\20\2\0\12\20\15\0\1\20\23\0\5\20\12\21\3\0\6\20\1\0\23\20\1\0\2\20\6"+
+ "\0\6\20\5\0\15\20\1\0\1\20\1\0\1\20\1\0\1\20\1\0\6\20\1\0\7\20\1\0\1\20\3"+
+ "\0\3\20\1\0\7\20\3\0\4\20\2\0\6\20\14\0\2\114\25\0\1\20\4\0\1\20\14\0\1\20"+
+ "\15\0\1\20\2\0\1\20\4\0\1\20\2\0\12\20\1\0\1\20\3\0\5\20\6\0\1\20\1\0\1\20"+
+ "\1\0\1\20\1\0\4\20\1\0\13\20\2\0\4\20\5\0\5\20\4\0\1\20\7\0\17\20\6\0\15\20"+
+ "\7\0\10\20\11\0\7\20\1\0\7\20\6\0\3\20\11\0\5\20\2\0\5\20\3\0\7\20\2\0\2\20"+
+ "\2\0\3\20\5\0\13\20\12\21\2\20\4\0\3\20\1\0\12\20\1\0\1\20\7\0\11\20\2\0\27"+
+ "\20\2\0\15\20\3\0\1\20\1\0\1\20\2\0\1\20\16\0\1\20\12\21\5\20\3\0\5\20\12"+
+ "\0\6\20\2\0\6\20\2\0\6\20\11\0\13\20\1\0\2\20\2\0\7\20\4\0\5\20\3\0\5\20\5"+
+ "\0\12\20\1\0\5\20\1\0\1\20\1\0\2\20\1\0\2\20\1\0\12\20\3\0\15\20\3\0\2\20"+
+ "\30\0\16\20\4\0\1\20\2\0\6\20\2\0\6\20\2\0\6\20\2\0\3\20\3\0\14\20\1\0\16"+
+ "\20\1\0\2\20\1\0\1\20\15\0\1\20\2\0\4\20\4\0\10\20\1\0\5\20\12\0\6\20\2\0"+
+ "\1\20\1\0\14\20\1\0\2\20\3\0\1\20\2\0\4\20\1\0\2\20\12\0\10\20\6\0\6\20\1"+
+ "\0\2\20\5\0\10\20\1\0\3\20\1\0\13\20\4\0\3\20\4\0\6\20\1\0\12\21\4\20\2\0"+
+ "\1\20\11\0\5\20\5\0\3\20\3\0\12\21\1\20\1\0\1\20\3\0\10\20\6\0\1\20\1\0\7"+
+ "\20\1\0\1\20\1\0\4\20\1\0\2\20\6\0\1\20\5\0\7\20\2\0\7\20\3\0\6\20\1\0\1\20"+
+ "\10\0\6\20\2\0\10\20\10\0\6\20\2\0\1\20\3\0\1\20\13\0\10\20\5\0\15\20\3\0"+
+ "\2\20\6\0\5\20\3\0\6\20\10\0\10\20\2\0\7\20\16\0\4\20\4\0\3\20\15\0\1\20\2"+
+ "\0\2\20\2\0\4\20\1\0\14\20\1\0\1\20\1\0\7\20\1\0\21\20\1\0\4\20\2\0\10\20"+
+ "\1\0\7\20\1\0\14\20\1\0\4\20\1\0\5\20\1\0\1\20\3\0\11\20\1\0\10\20\2\0\22"+
+ "\21\5\0\1\20\12\0\2\20\1\0\2\20\1\0\5\20\6\0\2\20\1\0\1\20\2\0\1\20\1\0\12"+
+ "\20\1\0\4\20\1\0\1\20\1\0\1\20\6\0\1\20\4\0\1\20\1\0\1\20\1\0\1\20\1\0\3\20"+
+ "\1\0\2\20\1\0\1\20\2\0\1\20\1\0\1\20\1\0\1\20\1\0\1\20\1\0\1\20\1\0\2\20\1"+
+ "\0\1\20\2\0\4\20\1\0\7\20\1\0\4\20\1\0\4\20\1\0\1\20\1\0\12\20\1\0\5\20\1"+
+ "\0\3\20\1\0\5\20\1\0\5\20");
/**
* Translates DFA states to action switch labels.
@@ -184,38 +184,38 @@ class _PythonLexer implements FlexLexerEx {
private static final int [] ZZ_ACTION = zzUnpackAction();
private static final String ZZ_ACTION_PACKED_0 =
- "\6\0\1\1\2\2\2\3\1\4\1\5\1\6\1\7"+
+ "\6\0\1\1\2\2\3\3\1\4\1\5\1\6\1\7"+
"\1\10\1\7\1\3\1\11\1\12\1\13\1\1\1\14"+
"\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24"+
- "\1\25\20\3\1\26\1\27\1\30\1\31\1\32\1\33"+
+ "\1\25\17\3\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\2\43"+
"\1\44\2\45\1\46\1\3\2\47\1\22\3\3\1\50"+
"\1\51\1\50\1\51\1\52\1\53\1\3\2\54\1\3"+
"\1\55\1\56\1\57\1\60\1\61\1\62\1\63\1\64"+
- "\1\65\4\3\2\50\1\52\1\66\1\2\5\0\1\2"+
- "\1\67\1\0\1\70\1\0\1\3\1\67\1\71\1\72"+
+ "\1\65\4\3\2\50\1\52\1\66\1\2\5\0\3\2"+
+ "\1\67\1\0\1\70\1\0\2\3\1\67\1\71\1\72"+
"\3\7\1\73\3\7\1\3\2\74\1\75\1\76\1\77"+
- "\15\3\1\100\1\101\1\102\1\103\10\3\1\104\1\105"+
+ "\14\3\1\100\1\101\1\102\1\103\10\3\1\104\1\105"+
"\1\106\1\107\1\110\1\111\1\112\1\113\1\114\1\115"+
"\1\116\1\117\1\120\1\121\1\122\1\0\3\45\1\123"+
"\3\45\1\3\6\47\2\0\1\124\1\3\2\0\1\51"+
"\1\50\1\51\1\3\6\54\1\3\2\125\1\57\1\126"+
"\2\3\1\0\1\50\1\0\1\2\1\0\1\2\1\0"+
- "\1\2\1\0\1\67\1\0\1\3\1\0\1\7\1\127"+
- "\1\130\1\0\1\127\1\3\2\0\1\131\1\3\1\132"+
- "\1\133\1\134\5\3\1\135\6\3\1\136\5\3\1\137"+
- "\1\140\1\141\1\142\1\0\1\45\1\143\1\144\1\0"+
- "\1\143\1\3\1\47\2\145\1\51\1\3\1\54\2\146"+
- "\1\3\2\0\1\50\1\0\2\147\1\0\1\3\1\74"+
- "\1\3\1\150\1\151\10\3\1\152\1\3\1\153\3\3"+
- "\1\0\2\144\11\0\1\3\1\125\4\0\2\3\1\154"+
- "\1\3\1\155\1\156\4\3\1\157\1\3\1\160\10\0"+
- "\1\127\1\161\1\162\1\163\1\3\1\164\1\165\1\3"+
- "\1\166\1\143\1\145\1\146\1\147\1\0\1\167\1\3"+
- "\1\170\1\171";
+ "\1\2\1\0\4\2\1\67\1\0\2\3\1\0\1\7"+
+ "\1\127\1\130\1\0\1\127\1\3\2\0\1\131\1\3"+
+ "\1\132\1\133\1\134\5\3\1\135\5\3\1\136\5\3"+
+ "\1\137\1\140\1\141\1\142\1\0\1\45\1\143\1\144"+
+ "\1\0\1\143\1\3\1\47\2\145\1\51\1\3\1\54"+
+ "\2\146\1\3\2\0\1\50\1\3\1\0\2\147\1\0"+
+ "\1\3\1\74\1\3\1\150\1\151\7\3\1\152\1\3"+
+ "\1\153\3\3\1\0\2\144\11\0\1\3\1\125\1\3"+
+ "\4\0\2\3\1\154\1\3\1\155\1\156\3\3\1\157"+
+ "\1\3\1\160\10\0\1\161\1\127\1\162\1\163\1\164"+
+ "\1\3\1\165\1\3\1\166\1\143\1\145\1\146\1\147"+
+ "\1\0\1\167\1\3\1\170\1\171";
private static int [] zzUnpackAction() {
- int [] result = new int[354];
+ int [] result = new int[360];
int offset = 0;
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
return result;
@@ -240,54 +240,54 @@ class _PythonLexer implements FlexLexerEx {
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\u01c8"+
- "\0\u0474\0\u04c0\0\u01c8\0\u01c8\0\u01c8\0\u050c\0\u01c8\0\u01c8"+
- "\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u0558\0\u05a4\0\u01c8\0\u01c8"+
- "\0\u05f0\0\u063c\0\u0688\0\u06d4\0\u0720\0\u076c\0\u07b8\0\u0804"+
- "\0\u0850\0\u089c\0\u08e8\0\u0934\0\u0980\0\u09cc\0\u0a18\0\u0a64"+
- "\0\u0ab0\0\u0afc\0\u0b48\0\u0b94\0\u0be0\0\u0c2c\0\u0c78\0\u0cc4"+
- "\0\u0d10\0\u0d5c\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u0da8\0\u0df4"+
- "\0\u0e40\0\u0e8c\0\u01c8\0\u0ed8\0\u0f24\0\u0f70\0\u0fbc\0\u1008"+
- "\0\u1054\0\u10a0\0\u10ec\0\u1138\0\u1184\0\u11d0\0\u121c\0\u01c8"+
- "\0\u1268\0\u12b4\0\u1300\0\u134c\0\u01c8\0\u01c8\0\u1398\0\u01c8"+
- "\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u13e4\0\u1430\0\u147c\0\u14c8"+
- "\0\u1514\0\u1560\0\u15ac\0\u01c8\0\u01c8\0\u15f8\0\u1644\0\u1690"+
- "\0\u16dc\0\u1728\0\u1774\0\u01c8\0\u17c0\0\u180c\0\u01c8\0\u1858"+
- "\0\u18a4\0\u18f0\0\u01c8\0\u01c8\0\u193c\0\u1988\0\u19d4\0\u01c8"+
- "\0\u1a20\0\u1a6c\0\u1ab8\0\u1b04\0\u1b50\0\u1b9c\0\u01c8\0\u01c8"+
- "\0\u01c8\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\u02ac\0\u02ac"+
- "\0\u02ac\0\u02ac\0\u1fc4\0\u2010\0\u205c\0\u20a8\0\u20f4\0\u2140"+
- "\0\u218c\0\u21d8\0\u01c8\0\u01c8\0\u2224\0\u01c8\0\u01c8\0\u2270"+
- "\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u22bc\0\u01c8\0\u01c8"+
- "\0\u2308\0\u2354\0\u23a0\0\u23ec\0\u2438\0\u01c8\0\u2484\0\u24d0"+
- "\0\u251c\0\u2568\0\u25b4\0\u2600\0\u264c\0\u2698\0\u26e4\0\u2730"+
- "\0\u277c\0\u27c8\0\u01c8\0\u2814\0\u1184\0\u121c\0\u2860\0\u28ac"+
- "\0\u28f8\0\u2944\0\u2990\0\u29dc\0\u2a28\0\u2a74\0\u2ac0\0\u2b0c"+
- "\0\u2b58\0\u2ba4\0\u2bf0\0\u2c3c\0\u01c8\0\u2c88\0\u2cd4\0\u15ac"+
- "\0\u2d20\0\u2d6c\0\u2db8\0\u2e04\0\u2e50\0\u2e9c\0\u2ee8\0\u2f34"+
- "\0\u2f80\0\u2fcc\0\u3018\0\u0390\0\u3064\0\u30b0\0\u01c8\0\u3064"+
- "\0\u30fc\0\u3148\0\u3194\0\u31e0\0\u02ac\0\u322c\0\u02ac\0\u02ac"+
- "\0\u02ac\0\u3278\0\u32c4\0\u3310\0\u335c\0\u33a8\0\u02ac\0\u33f4"+
- "\0\u3440\0\u348c\0\u34d8\0\u3524\0\u3570\0\u02ac\0\u35bc\0\u3608"+
- "\0\u3654\0\u36a0\0\u36ec\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u3738"+
- "\0\u3784\0\u37d0\0\u01c8\0\u3784\0\u381c\0\u3868\0\u01c8\0\u38b4"+
- "\0\u3900\0\u01c8\0\u394c\0\u01c8\0\u3998\0\u39e4\0\u3a30\0\u3a7c"+
- "\0\u3ac8\0\u3b14\0\u3b60\0\u3bac\0\u3bf8\0\u3c44\0\u3c90\0\u01c8"+
- "\0\u3cdc\0\u02ac\0\u02ac\0\u3d28\0\u3d74\0\u3dc0\0\u3e0c\0\u3e58"+
- "\0\u3ea4\0\u3ef0\0\u3f3c\0\u02ac\0\u3f88\0\u02ac\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\u43fc\0\u4448\0\u01c8\0\u4494"+
- "\0\u3bac\0\u3bf8\0\u44e0\0\u452c\0\u4578\0\u02ac\0\u45c4\0\u02ac"+
- "\0\u02ac\0\u4610\0\u465c\0\u46a8\0\u46f4\0\u02ac\0\u4740\0\u02ac"+
- "\0\u478c\0\u4104\0\u4150\0\u47d8\0\u4824\0\u4870\0\u48bc\0\u4908"+
- "\0\u4954\0\u02ac\0\u02ac\0\u02ac\0\u49a0\0\u02ac\0\u02ac\0\u49ec"+
- "\0\u02ac\0\u3784\0\u01c8\0\u01c8\0\u01c8\0\u4954\0\u01c8\0\u4a38"+
- "\0\u02ac\0\u02ac";
+ "\0\0\0\115\0\232\0\347\0\u0134\0\u0181\0\u01ce\0\u021b"+
+ "\0\u0268\0\u02b5\0\u0302\0\u034f\0\u039c\0\u03e9\0\u0436\0\u0483"+
+ "\0\u01ce\0\u04d0\0\u051d\0\u01ce\0\u01ce\0\u01ce\0\u056a\0\u01ce"+
+ "\0\u01ce\0\u01ce\0\u01ce\0\u01ce\0\u01ce\0\u05b7\0\u0604\0\u01ce"+
+ "\0\u01ce\0\u0651\0\u069e\0\u06eb\0\u0738\0\u0785\0\u07d2\0\u081f"+
+ "\0\u086c\0\u08b9\0\u0906\0\u0953\0\u09a0\0\u09ed\0\u0a3a\0\u0a87"+
+ "\0\u0ad4\0\u0b21\0\u0b6e\0\u0bbb\0\u0c08\0\u0c55\0\u0ca2\0\u0cef"+
+ "\0\u0d3c\0\u0d89\0\u01ce\0\u01ce\0\u01ce\0\u01ce\0\u0dd6\0\u0e23"+
+ "\0\u0e70\0\u0ebd\0\u01ce\0\u0f0a\0\u0f57\0\u0fa4\0\u0ff1\0\u103e"+
+ "\0\u108b\0\u10d8\0\u1125\0\u1172\0\u11bf\0\u120c\0\u1259\0\u01ce"+
+ "\0\u12a6\0\u12f3\0\u1340\0\u138d\0\u01ce\0\u01ce\0\u13da\0\u01ce"+
+ "\0\u01ce\0\u01ce\0\u01ce\0\u01ce\0\u1427\0\u1474\0\u14c1\0\u150e"+
+ "\0\u155b\0\u15a8\0\u15f5\0\u01ce\0\u01ce\0\u1642\0\u168f\0\u16dc"+
+ "\0\u1729\0\u1776\0\u17c3\0\u1810\0\u185d\0\u18aa\0\u18f7\0\u1944"+
+ "\0\u01ce\0\u1991\0\u19de\0\u1a2b\0\u1a78\0\u01ce\0\u01ce\0\u1ac5"+
+ "\0\u1b12\0\u1b5f\0\u01ce\0\u1bac\0\u1bf9\0\u1c46\0\u1c93\0\u1ce0"+
+ "\0\u1d2d\0\u01ce\0\u01ce\0\u01ce\0\u1d7a\0\u1dc7\0\u1e14\0\u1e61"+
+ "\0\u1eae\0\u1efb\0\u1f48\0\u1f95\0\u1fe2\0\u202f\0\u207c\0\u20c9"+
+ "\0\u02b5\0\u02b5\0\u02b5\0\u02b5\0\u2116\0\u2163\0\u21b0\0\u21fd"+
+ "\0\u224a\0\u2297\0\u22e4\0\u2331\0\u01ce\0\u01ce\0\u237e\0\u01ce"+
+ "\0\u01ce\0\u23cb\0\u01ce\0\u01ce\0\u01ce\0\u01ce\0\u01ce\0\u2418"+
+ "\0\u01ce\0\u01ce\0\u2465\0\u24b2\0\u24ff\0\u254c\0\u2599\0\u01ce"+
+ "\0\u25e6\0\u2633\0\u2680\0\u26cd\0\u271a\0\u2767\0\u27b4\0\u2801"+
+ "\0\u284e\0\u289b\0\u28e8\0\u2935\0\u01ce\0\u2982\0\u11bf\0\u1259"+
+ "\0\u29cf\0\u2a1c\0\u2a69\0\u2ab6\0\u2b03\0\u2b50\0\u2b9d\0\u2bea"+
+ "\0\u2c37\0\u2c84\0\u2cd1\0\u2d1e\0\u2d6b\0\u2db8\0\u01ce\0\u2e05"+
+ "\0\u2e52\0\u15f5\0\u2e9f\0\u2eec\0\u2f39\0\u2f86\0\u2fd3\0\u3020"+
+ "\0\u306d\0\u30ba\0\u3107\0\u3154\0\u01ce\0\u31a1\0\u31ee\0\u323b"+
+ "\0\u3288\0\u32d5\0\u03e9\0\u3322\0\u336f\0\u01ce\0\u3322\0\u33bc"+
+ "\0\u3409\0\u3456\0\u34a3\0\u02b5\0\u34f0\0\u02b5\0\u02b5\0\u02b5"+
+ "\0\u353d\0\u358a\0\u35d7\0\u3624\0\u3671\0\u02b5\0\u36be\0\u370b"+
+ "\0\u3758\0\u37a5\0\u37f2\0\u02b5\0\u383f\0\u388c\0\u38d9\0\u3926"+
+ "\0\u3973\0\u01ce\0\u01ce\0\u01ce\0\u01ce\0\u39c0\0\u3a0d\0\u3a5a"+
+ "\0\u01ce\0\u3a0d\0\u3aa7\0\u3af4\0\u01ce\0\u3b41\0\u3b8e\0\u01ce"+
+ "\0\u3bdb\0\u01ce\0\u3c28\0\u3c75\0\u3cc2\0\u3d0f\0\u3d5c\0\u3da9"+
+ "\0\u3df6\0\u3e43\0\u3e90\0\u3edd\0\u3f2a\0\u3f77\0\u01ce\0\u3fc4"+
+ "\0\u02b5\0\u02b5\0\u4011\0\u405e\0\u40ab\0\u40f8\0\u4145\0\u4192"+
+ "\0\u41df\0\u02b5\0\u422c\0\u02b5\0\u4279\0\u42c6\0\u4313\0\u4360"+
+ "\0\u43ad\0\u43fa\0\u4447\0\u4494\0\u44e1\0\u452e\0\u457b\0\u45c8"+
+ "\0\u4615\0\u4662\0\u46af\0\u46fc\0\u01ce\0\u4749\0\u4796\0\u3e90"+
+ "\0\u3edd\0\u47e3\0\u4830\0\u487d\0\u02b5\0\u48ca\0\u02b5\0\u02b5"+
+ "\0\u4917\0\u4964\0\u49b1\0\u02b5\0\u49fe\0\u02b5\0\u4a4b\0\u43ad"+
+ "\0\u43fa\0\u4a98\0\u4ae5\0\u4b32\0\u4b7f\0\u4bcc\0\u02b5\0\u4c19"+
+ "\0\u02b5\0\u02b5\0\u02b5\0\u4c66\0\u02b5\0\u4cb3\0\u02b5\0\u3a0d"+
+ "\0\u01ce\0\u01ce\0\u01ce\0\u4c19\0\u01ce\0\u4d00\0\u02b5\0\u02b5";
private static int [] zzUnpackRowMap() {
- int [] result = new int[354];
+ int [] result = new int[360];
int offset = 0;
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
return result;
@@ -310,403 +310,408 @@ class _PythonLexer implements FlexLexerEx {
private static final int [] ZZ_TRANS = zzUnpackTrans();
private static final String ZZ_TRANS_PACKED_0 =
- "\1\7\1\10\2\11\1\12\1\11\3\12\1\13\1\12"+
- "\1\14\1\7\1\12\1\7\1\15\1\12\1\16\1\12"+
- "\2\13\1\17\1\20\1\21\1\22\1\23\1\24\1\12"+
- "\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\12"+
- "\1\44\1\45\1\46\1\47\1\12\1\50\1\51\1\52"+
- "\1\53\1\13\1\54\1\12\1\55\1\56\1\12\1\57"+
+ "\1\7\1\10\2\11\1\12\1\11\3\12\2\13\1\14"+
+ "\1\13\1\12\1\15\1\7\1\12\1\7\1\16\1\12"+
+ "\1\17\1\12\2\13\1\20\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\1\42\1\43"+
+ "\1\44\1\12\1\45\1\46\1\47\1\50\1\12\1\51"+
+ "\1\52\1\53\1\54\1\12\1\55\1\56\1\12\1\57"+
"\1\60\1\12\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\7"+
- "\11\76\1\77\1\76\1\100\1\0\6\76\2\77\1\101"+
- "\1\20\1\102\4\76\1\25\1\76\1\27\1\103\6\76"+
- "\1\37\6\76\1\77\1\76\1\77\1\76\1\77\3\76"+
- "\1\77\25\76\1\0\1\7\1\10\2\11\1\12\1\11"+
- "\3\12\1\104\1\12\1\100\1\7\1\12\1\7\1\15"+
- "\1\12\1\16\1\12\2\104\1\105\1\20\1\106\1\22"+
- "\1\23\1\24\1\12\1\25\1\26\1\27\1\103\1\31"+
- "\1\32\1\33\1\34\1\107\1\36\1\37\1\40\1\41"+
- "\1\42\1\43\1\12\1\44\1\110\1\46\1\111\1\12"+
- "\1\112\1\51\1\52\1\53\1\104\1\54\1\12\1\55"+
+ "\11\76\2\77\1\76\1\77\1\76\1\100\1\0\6\76"+
+ "\2\77\1\101\1\21\1\102\4\76\1\26\1\76\1\30"+
+ "\1\103\6\76\1\40\6\76\1\77\1\76\1\77\1\76"+
+ "\1\77\27\76\1\0\1\7\1\10\2\11\1\12\1\11"+
+ "\3\12\2\104\1\14\1\104\1\12\1\100\1\7\1\12"+
+ "\1\7\1\16\1\12\1\17\1\12\2\104\1\105\1\21"+
+ "\1\106\1\23\1\24\1\25\1\12\1\26\1\27\1\30"+
+ "\1\103\1\32\1\33\1\34\1\35\1\107\1\37\1\40"+
+ "\1\41\1\42\1\43\1\44\1\12\1\45\1\110\1\47"+
+ "\1\111\1\12\1\112\1\52\1\53\1\54\1\12\1\55"+
"\1\56\1\12\1\57\1\60\1\12\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\7\14\113\1\7\10\113\1\114\1\115"+
- "\1\116\1\113\1\117\5\113\1\120\54\113\1\7\1\10"+
- "\2\11\1\12\1\11\3\12\1\121\1\12\1\100\1\7"+
- "\1\12\1\7\1\15\1\12\1\16\1\12\2\121\1\122"+
- "\1\20\1\123\1\124\1\125\1\126\1\12\1\25\1\127"+
- "\1\27\1\130\1\131\1\132\1\133\1\134\1\135\1\36"+
- "\1\37\1\40\1\41\1\42\1\43\1\12\1\44\1\136"+
- "\1\46\1\137\1\12\1\140\1\51\1\52\1\53\1\121"+
+ "\1\74\1\75\1\7\17\113\1\7\10\113\1\114\1\115"+
+ "\1\116\1\113\1\117\5\113\1\120\52\113\1\7\1\10"+
+ "\2\11\1\12\1\11\3\12\2\121\1\14\1\121\1\12"+
+ "\1\100\1\7\1\12\1\7\1\16\1\12\1\17\1\12"+
+ "\2\121\1\122\1\21\1\123\1\124\1\125\1\126\1\12"+
+ "\1\26\1\127\1\30\1\130\1\131\1\132\1\133\1\134"+
+ "\1\135\1\37\1\40\1\41\1\42\1\43\1\44\1\12"+
+ "\1\45\1\136\1\47\1\137\1\12\1\140\1\52\1\53"+
"\1\141\1\12\1\55\1\56\1\12\1\57\1\60\1\12"+
"\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\7\14\142\1\7"+
+ "\1\71\1\72\1\73\1\74\1\75\1\7\17\142\1\7"+
"\10\142\1\114\1\143\1\116\1\142\1\144\1\145\4\142"+
- "\1\120\54\142\115\0\1\146\1\147\1\146\1\0\1\146"+
- "\1\150\1\151\1\152\1\153\1\154\4\0\1\155\1\156"+
- "\1\0\1\157\31\0\1\156\2\0\1\153\2\0\1\154"+
- "\1\152\3\0\1\150\25\0\3\11\1\0\1\11\1\0"+
- "\1\160\2\0\1\154\4\0\1\155\1\156\1\0\1\157"+
- "\31\0\1\156\5\0\1\154\32\0\12\12\2\0\2\12"+
- "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
- "\14\0\26\12\17\0\10\12\1\161\1\12\2\0\2\12"+
- "\1\0\1\12\1\0\1\12\2\161\1\17\1\0\1\21"+
- "\1\22\2\0\1\12\14\0\5\12\1\161\1\12\1\161"+
- "\1\12\1\161\3\12\1\161\1\22\7\12\16\0\14\14"+
- "\1\0\22\14\1\0\54\14\1\0\3\162\1\0\1\162"+
- "\153\0\1\163\40\0\1\164\5\0\14\165\1\0\10\165"+
- "\1\166\1\167\10\165\1\170\54\165\14\171\1\0\11\171"+
- "\1\172\1\173\7\171\1\170\54\171\1\0\10\12\1\174"+
- "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\174"+
- "\1\175\1\0\1\176\1\12\2\0\1\12\14\0\5\12"+
- "\1\174\1\12\1\174\1\12\1\174\3\12\1\174\10\12"+
- "\63\0\1\177\113\0\1\200\113\0\1\201\47\0\12\12"+
- "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
- "\2\0\1\12\14\0\1\12\1\202\1\12\1\203\22\12"+
- "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
- "\3\0\1\12\2\0\1\12\14\0\13\12\1\204\12\12"+
- "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
- "\3\0\1\12\2\0\1\12\14\0\4\12\1\205\21\12"+
- "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
- "\3\0\1\12\2\0\1\12\14\0\12\12\1\206\4\12"+
- "\1\207\6\12\17\0\10\12\1\161\1\12\2\0\2\12"+
- "\1\0\1\12\1\0\1\12\2\161\1\17\1\0\1\21"+
- "\1\22\2\0\1\12\14\0\1\210\3\12\1\211\1\161"+
- "\1\12\1\161\1\12\1\161\3\12\1\161\1\22\7\12"+
- "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
- "\3\0\1\12\2\0\1\12\14\0\5\12\1\212\20\12"+
- "\17\0\10\12\1\161\1\12\2\0\2\12\1\0\1\12"+
- "\1\0\1\12\2\161\1\17\1\0\1\21\1\22\2\0"+
- "\1\12\14\0\5\12\1\213\1\12\1\161\1\12\1\161"+
- "\3\12\1\161\1\22\7\12\17\0\10\12\1\161\1\12"+
- "\2\0\2\12\1\0\1\12\1\0\1\12\2\161\1\17"+
- "\1\0\1\21\1\22\2\0\1\12\14\0\5\12\1\161"+
- "\1\12\1\161\1\12\1\161\1\214\1\215\1\12\1\161"+
- "\1\22\7\12\17\0\12\12\2\0\2\12\1\0\1\12"+
- "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\216"+
- "\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\5\12\1\217"+
- "\20\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\1\12\1\220"+
- "\1\12\1\221\12\12\1\222\3\12\1\223\3\12\17\0"+
- "\10\12\1\174\1\12\2\0\2\12\1\0\1\12\1\0"+
- "\1\12\2\174\1\175\1\0\1\176\1\12\2\0\1\12"+
- "\14\0\5\12\1\224\1\12\1\174\1\12\1\174\1\12"+
- "\1\225\1\226\1\174\10\12\17\0\12\12\2\0\2\12"+
- "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
- "\14\0\1\227\25\12\17\0\12\12\2\0\2\12\1\0"+
+ "\1\120\52\142\116\0\1\146\1\147\1\146\1\0\1\146"+
+ "\1\150\1\151\1\152\1\153\1\154\1\155\1\154\1\156"+
+ "\4\0\1\157\1\160\1\0\1\161\31\0\1\160\2\0"+
+ "\1\153\2\0\1\152\2\0\1\150\25\0\3\11\1\0"+
+ "\1\11\1\0\1\162\2\0\1\154\1\155\1\154\1\156"+
+ "\4\0\1\157\1\160\1\0\1\161\31\0\1\160\36\0"+
+ "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
+ "\1\12\2\0\1\12\14\0\24\12\17\0\10\12\2\163"+
+ "\1\12\1\163\1\12\2\0\2\12\1\0\1\12\1\0"+
+ "\1\12\2\163\1\20\1\0\1\22\1\23\2\0\1\12"+
+ "\14\0\5\12\1\163\1\12\1\163\1\12\1\163\2\12"+
+ "\1\23\7\12\17\0\15\12\2\0\2\12\1\0\1\12"+
+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\164"+
+ "\23\12\16\0\17\15\1\0\22\15\1\0\52\15\1\0"+
+ "\3\165\1\0\1\165\157\0\1\166\36\0\1\167\5\0"+
+ "\17\170\1\0\10\170\1\171\1\172\10\170\1\173\52\170"+
+ "\17\174\1\0\11\174\1\175\1\176\7\174\1\173\52\174"+
+ "\1\0\10\12\2\177\1\12\1\177\1\12\2\0\2\12"+
+ "\1\0\1\12\1\0\1\12\2\177\1\200\1\0\1\201"+
+ "\1\12\2\0\1\12\14\0\5\12\1\177\1\12\1\177"+
+ "\1\12\1\177\12\12\66\0\1\202\114\0\1\203\114\0"+
+ "\1\204\45\0\15\12\2\0\2\12\1\0\1\12\1\0"+
+ "\3\12\3\0\1\12\2\0\1\12\14\0\1\12\1\205"+
+ "\1\12\1\206\20\12\17\0\15\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
- "\14\12\1\230\11\12\17\0\12\12\2\0\2\12\1\0"+
+ "\12\12\1\207\11\12\17\0\15\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
- "\12\12\1\231\13\12\17\0\12\12\2\0\2\12\1\0"+
+ "\4\12\1\210\17\12\17\0\12\12\1\211\2\12\2\0"+
+ "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\2\0"+
+ "\1\12\14\0\15\12\1\212\6\12\17\0\10\12\2\163"+
+ "\1\12\1\163\1\12\2\0\2\12\1\0\1\12\1\0"+
+ "\1\12\2\163\1\20\1\0\1\22\1\23\2\0\1\12"+
+ "\14\0\1\213\3\12\1\214\1\163\1\12\1\163\1\12"+
+ "\1\163\2\12\1\23\7\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\5\12\1\215\16\12\17\0\10\12\2\163\1\12"+
+ "\1\163\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+
+ "\2\163\1\20\1\0\1\22\1\23\2\0\1\12\14\0"+
+ "\5\12\1\216\1\12\1\163\1\12\1\163\2\12\1\23"+
+ "\7\12\17\0\10\12\2\163\1\217\1\163\1\12\2\0"+
+ "\2\12\1\0\1\12\1\0\1\12\2\163\1\20\1\0"+
+ "\1\22\1\23\2\0\1\12\14\0\5\12\1\163\1\12"+
+ "\1\163\1\12\1\163\1\220\1\12\1\23\7\12\17\0"+
+ "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
+ "\1\12\2\0\1\12\14\0\5\12\1\221\16\12\17\0"+
+ "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
+ "\1\12\2\0\1\12\14\0\1\12\1\222\1\12\1\223"+
+ "\10\12\1\224\3\12\1\225\3\12\17\0\10\12\2\177"+
+ "\1\12\1\177\1\12\2\0\2\12\1\0\1\12\1\0"+
+ "\1\12\2\177\1\200\1\0\1\201\1\12\2\0\1\12"+
+ "\14\0\5\12\1\226\1\12\1\177\1\12\1\177\1\227"+
+ "\1\230\10\12\17\0\15\12\2\0\2\12\1\0\1\12"+
+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\231"+
+ "\23\12\17\0\15\12\2\0\2\12\1\0\1\12\1\0"+
+ "\3\12\3\0\1\12\2\0\1\12\14\0\13\12\1\232"+
+ "\10\12\17\0\12\12\1\233\2\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
- "\25\12\1\232\63\0\1\233\113\0\1\234\31\0\1\235"+
- "\61\0\1\236\113\0\1\237\33\0\1\240\57\0\1\241"+
- "\113\0\1\242\113\0\1\243\113\0\1\244\113\0\1\245"+
- "\40\0\1\246\52\0\1\247\40\0\1\250\1\251\15\0"+
- "\1\252\11\0\2\252\1\101\1\0\1\102\25\0\1\252"+
- "\1\0\1\252\1\0\1\252\3\0\1\252\26\0\14\100"+
- "\1\0\22\100\1\0\54\100\14\253\1\0\10\253\1\254"+
- "\1\255\10\253\1\256\54\253\14\257\1\0\11\257\1\260"+
- "\1\261\7\257\1\256\54\257\1\0\10\12\1\262\1\12"+
- "\2\0\2\12\1\0\1\12\1\0\1\12\2\262\1\105"+
- "\1\0\1\106\1\22\2\0\1\12\14\0\5\12\1\262"+
- "\1\12\1\262\1\12\1\262\3\12\1\262\1\22\7\12"+
- "\16\0\14\263\1\0\10\263\1\264\1\265\10\263\1\0"+
- "\54\263\14\266\1\0\11\266\1\267\1\270\7\266\1\0"+
- "\54\266\13\0\1\271\20\0\1\272\2\0\1\273\5\0"+
- "\1\200\47\0\10\12\1\262\1\12\2\0\2\12\1\0"+
- "\1\12\1\0\1\12\2\262\1\105\1\0\1\106\1\22"+
- "\2\0\1\12\14\0\1\210\3\12\1\211\1\262\1\12"+
- "\1\262\1\12\1\262\3\12\1\262\1\22\7\12\17\0"+
- "\10\12\1\262\1\12\2\0\2\12\1\0\1\12\1\0"+
- "\1\12\2\262\1\105\1\0\1\106\1\22\2\0\1\12"+
- "\14\0\5\12\1\274\1\12\1\262\1\12\1\262\3\12"+
- "\1\262\1\22\7\12\17\0\10\12\1\262\1\12\2\0"+
- "\2\12\1\0\1\12\1\0\1\12\2\262\1\105\1\0"+
- "\1\106\1\22\2\0\1\12\14\0\5\12\1\262\1\12"+
- "\1\262\1\12\1\262\1\214\1\215\1\12\1\262\1\22"+
- "\7\12\16\0\14\113\1\0\10\113\1\0\1\275\1\0"+
- "\1\113\1\276\5\113\1\0\54\113\25\0\1\277\66\0"+
- "\31\113\2\0\1\300\60\113\27\0\1\301\115\0\1\113"+
- "\63\0\10\12\1\302\1\12\2\0\2\12\1\0\1\12"+
- "\1\0\1\12\2\302\1\122\1\0\1\123\1\124\2\0"+
- "\1\12\14\0\5\12\1\302\1\12\1\302\1\12\1\302"+
- "\3\12\1\302\1\124\7\12\16\0\14\303\1\0\10\303"+
- "\1\304\1\305\10\303\1\0\54\303\14\306\1\0\11\306"+
- "\1\307\1\310\7\306\1\0\54\306\1\0\10\12\1\311"+
- "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\311"+
- "\1\312\1\0\1\313\1\12\2\0\1\12\14\0\5\12"+
- "\1\311\1\12\1\311\1\12\1\311\3\12\1\311\10\12"+
- "\16\0\14\314\1\0\10\314\1\0\1\314\1\0\2\314"+
- "\1\0\1\314\1\0\1\314\2\0\4\314\1\0\1\177"+
- "\46\314\45\0\1\315\47\0\10\12\1\302\1\12\2\0"+
- "\2\12\1\0\1\12\1\0\1\12\2\302\1\122\1\0"+
- "\1\123\1\124\2\0\1\12\14\0\1\210\3\12\1\211"+
- "\1\302\1\12\1\302\1\12\1\302\3\12\1\302\1\124"+
- "\7\12\17\0\10\12\1\302\1\12\2\0\2\12\1\0"+
- "\1\12\1\0\1\12\2\302\1\122\1\0\1\123\1\124"+
- "\2\0\1\12\14\0\5\12\1\316\1\12\1\302\1\12"+
- "\1\302\3\12\1\302\1\124\7\12\17\0\10\12\1\302"+
- "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\302"+
- "\1\122\1\0\1\123\1\124\2\0\1\12\14\0\5\12"+
- "\1\302\1\12\1\302\1\12\1\302\1\214\1\215\1\12"+
- "\1\302\1\124\7\12\17\0\10\12\1\311\1\12\2\0"+
- "\2\12\1\0\1\12\1\0\1\12\2\311\1\312\1\0"+
- "\1\313\1\12\2\0\1\12\14\0\5\12\1\317\1\12"+
- "\1\311\1\12\1\311\1\12\1\225\1\226\1\311\10\12"+
- "\16\0\14\142\1\0\10\142\1\0\1\320\1\0\1\142"+
- "\2\0\4\142\1\0\105\142\2\0\1\321\60\142\1\0"+
- "\1\146\1\147\1\146\1\0\1\146\1\0\1\151\2\0"+
- "\1\154\4\0\1\155\1\156\1\0\1\157\31\0\1\156"+
- "\5\0\1\154\32\0\3\147\1\0\1\147\1\0\1\322"+
- "\7\0\1\155\1\156\1\0\1\157\31\0\1\156\40\0"+
- "\5\323\1\0\1\324\1\0\1\323\6\0\1\323\2\0"+
- "\1\323\4\0\1\323\17\0\1\323\1\0\1\323\1\0"+
- "\1\323\2\0\1\323\1\0\1\323\4\0\1\323\26\0"+
- "\1\146\1\147\1\146\1\0\1\146\107\0\1\325\1\0"+
- "\1\325\1\0\1\325\1\0\1\326\105\0\1\327\3\0"+
- "\1\327\1\0\1\330\105\0\3\162\1\0\1\162\12\0"+
- "\1\156\1\0\1\157\31\0\1\156\40\0\3\331\1\0"+
- "\1\331\13\0\1\332\54\0\1\332\16\0\3\11\1\0"+
- "\1\11\107\0\10\12\1\333\1\12\2\0\2\12\1\0"+
- "\1\12\1\0\1\12\2\333\1\17\1\0\1\21\1\22"+
- "\2\0\1\12\14\0\5\12\1\333\1\12\1\333\1\12"+
- "\1\333\3\12\1\333\1\22\7\12\17\0\3\162\1\0"+
- "\1\162\1\0\1\334\10\0\1\156\1\0\1\157\31\0"+
- "\1\156\37\0\14\165\1\0\10\165\1\335\1\167\10\165"+
- "\1\170\54\165\25\0\1\336\1\337\5\0\1\340\1\0"+
- "\1\340\1\170\7\0\1\170\44\0\114\165\14\171\1\0"+
- "\11\171\1\172\1\335\7\171\1\170\170\171\26\0\1\337"+
- "\1\341\4\0\1\340\1\0\1\340\1\170\7\0\1\170"+
- "\45\0\10\12\1\342\1\12\2\0\2\12\1\0\1\12"+
- "\1\0\1\12\2\342\1\175\1\0\1\176\1\12\2\0"+
- "\1\12\14\0\5\12\1\342\1\12\1\342\1\12\1\342"+
- "\3\12\1\342\10\12\43\0\1\343\115\0\1\344\65\0"+
- "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
- "\1\12\2\0\1\12\14\0\2\12\1\345\23\12\17\0"+
- "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
- "\1\12\2\0\1\12\14\0\3\12\1\346\22\12\17\0"+
- "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
- "\1\12\2\0\1\12\14\0\6\12\1\347\17\12\17\0"+
- "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
- "\1\12\2\0\1\12\14\0\12\12\1\350\3\12\1\351"+
- "\7\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\3\12\1\352"+
- "\10\12\1\353\11\12\17\0\12\12\2\0\2\12\1\0"+
- "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
- "\11\12\1\354\14\12\17\0\12\12\2\0\2\12\1\0"+
- "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
- "\14\12\1\355\11\12\17\0\12\12\2\0\2\12\1\0"+
- "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
- "\6\12\1\356\17\12\17\0\12\12\2\0\2\12\1\0"+
- "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
- "\21\12\1\357\4\12\17\0\10\12\1\333\1\12\2\0"+
- "\2\12\1\0\1\12\1\0\1\12\2\333\1\17\1\0"+
- "\1\21\1\22\2\0\1\12\14\0\4\12\1\360\1\333"+
- "\1\12\1\333\1\12\1\333\3\12\1\333\1\22\7\12"+
- "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
- "\3\0\1\12\2\0\1\12\14\0\1\361\25\12\17\0"+
- "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
- "\1\12\2\0\1\12\14\0\1\12\1\362\24\12\17\0"+
- "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
- "\1\12\2\0\1\12\14\0\22\12\1\363\3\12\17\0"+
- "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
- "\1\12\2\0\1\12\14\0\20\12\1\364\5\12\17\0"+
- "\10\12\1\342\1\12\2\0\2\12\1\0\1\12\1\0"+
- "\1\12\2\342\1\175\1\0\1\176\1\12\2\0\1\12"+
- "\14\0\5\12\1\342\1\12\1\342\1\12\1\342\1\12"+
- "\1\365\1\12\1\342\10\12\17\0\12\12\2\0\2\12"+
- "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
- "\14\0\5\12\1\366\20\12\17\0\12\12\2\0\2\12"+
- "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
- "\14\0\1\12\1\367\24\12\17\0\12\12\2\0\2\12"+
- "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
- "\14\0\3\12\1\370\22\12\17\0\12\12\2\0\2\12"+
- "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
- "\14\0\4\12\1\371\21\12\17\0\12\12\2\0\2\12"+
- "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
- "\14\0\13\12\1\372\12\12\17\0\12\12\2\0\2\12"+
- "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
- "\14\0\14\12\1\373\11\12\63\0\1\374\113\0\1\375"+
- "\113\0\1\376\113\0\1\377\57\0\1\u0100\11\0\2\u0100"+
- "\1\101\1\0\1\102\25\0\1\u0100\1\0\1\u0100\1\0"+
- "\1\u0100\3\0\1\u0100\26\0\14\253\1\0\10\253\1\u0101"+
- "\1\255\10\253\1\256\54\253\25\0\1\u0102\1\u0103\5\0"+
- "\1\u0104\1\0\1\u0104\1\256\7\0\1\256\44\0\114\253"+
- "\14\257\1\0\11\257\1\260\1\u0101\7\257\1\256\170\257"+
- "\26\0\1\u0103\1\u0105\4\0\1\u0104\1\0\1\u0104\1\256"+
- "\7\0\1\256\45\0\10\12\1\u0106\1\12\2\0\2\12"+
- "\1\0\1\12\1\0\1\12\2\u0106\1\105\1\0\1\106"+
- "\1\22\2\0\1\12\14\0\5\12\1\u0106\1\12\1\u0106"+
- "\1\12\1\u0106\3\12\1\u0106\1\22\7\12\16\0\14\263"+
- "\1\0\10\263\1\u0107\1\265\10\263\1\0\54\263\25\0"+
- "\1\u0108\66\0\114\263\14\266\1\0\11\266\1\267\1\u0107"+
- "\7\266\1\0\170\266\27\0\1\u0109\64\0\14\271\1\0"+
- "\22\271\1\273\54\271\13\0\1\271\20\0\1\272\2\0"+
- "\1\273\55\0\10\12\1\u0106\1\12\2\0\2\12\1\0"+
- "\1\12\1\0\1\12\2\u0106\1\105\1\0\1\106\1\22"+
- "\2\0\1\12\14\0\4\12\1\360\1\u0106\1\12\1\u0106"+
- "\1\12\1\u0106\3\12\1\u0106\1\22\7\12\43\0\1\u010a"+
- "\66\0\14\113\1\0\10\113\1\0\1\275\1\0\1\113"+
- "\1\300\5\113\1\0\54\113\27\0\1\u010a\65\0\10\12"+
- "\1\u010b\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+
- "\2\u010b\1\122\1\0\1\123\1\124\2\0\1\12\14\0"+
- "\5\12\1\u010b\1\12\1\u010b\1\12\1\u010b\3\12\1\u010b"+
- "\1\124\7\12\16\0\14\303\1\0\10\303\1\u010c\1\305"+
- "\10\303\1\0\54\303\25\0\1\u010d\66\0\114\303\14\306"+
- "\1\0\11\306\1\307\1\u010c\7\306\1\0\170\306\27\0"+
- "\1\u010e\65\0\10\12\1\u010f\1\12\2\0\2\12\1\0"+
- "\1\12\1\0\1\12\2\u010f\1\312\1\0\1\313\1\12"+
- "\2\0\1\12\14\0\5\12\1\u010f\1\12\1\u010f\1\12"+
- "\1\u010f\3\12\1\u010f\10\12\43\0\1\u0110\115\0\1\u0111"+
- "\64\0\14\314\1\0\10\314\1\0\1\314\1\0\2\314"+
- "\1\0\1\314\1\0\1\314\2\0\4\314\2\0\46\314"+
- "\1\0\10\12\1\u010b\1\12\2\0\2\12\1\0\1\12"+
- "\1\0\1\12\2\u010b\1\122\1\0\1\123\1\124\2\0"+
- "\1\12\14\0\4\12\1\360\1\u010b\1\12\1\u010b\1\12"+
- "\1\u010b\3\12\1\u010b\1\124\7\12\17\0\10\12\1\u010f"+
- "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\u010f"+
- "\1\312\1\0\1\313\1\12\2\0\1\12\14\0\5\12"+
- "\1\u010f\1\12\1\u010f\1\12\1\u010f\1\12\1\365\1\12"+
- "\1\u010f\10\12\16\0\14\142\1\0\10\142\1\0\1\320"+
- "\1\0\1\142\1\u0112\1\0\4\142\1\0\54\142\1\0"+
- "\3\147\1\0\1\147\107\0\5\323\1\0\1\324\1\0"+
- "\1\323\1\154\5\0\1\323\2\0\1\323\4\0\1\323"+
- "\17\0\1\323\1\0\1\323\1\0\1\323\2\0\1\323"+
- "\1\0\1\323\1\154\3\0\1\323\26\0\5\323\3\0"+
- "\1\323\6\0\1\323\2\0\1\323\4\0\1\323\17\0"+
- "\1\323\1\0\1\323\1\0\1\323\2\0\1\323\1\0"+
- "\1\323\4\0\1\323\26\0\1\325\1\0\1\325\1\0"+
- "\1\325\1\0\1\326\2\0\1\154\47\0\1\154\32\0"+
- "\1\325\1\0\1\325\1\0\1\325\107\0\1\327\3\0"+
- "\1\327\1\0\1\330\2\0\1\154\47\0\1\154\32\0"+
- "\1\327\3\0\1\327\107\0\3\331\1\0\1\331\1\0"+
- "\1\332\12\0\1\157\72\0\3\331\1\0\1\331\107\0"+
- "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\1\17"+
- "\1\0\1\21\1\22\2\0\1\12\14\0\16\12\1\22"+
- "\7\12\44\0\1\337\5\0\1\340\1\0\1\340\1\170"+
- "\7\0\1\170\44\0\25\336\1\u0113\1\u0114\65\336\26\341"+
- "\1\u0115\1\u0116\64\341\1\0\10\12\1\u0117\1\12\2\0"+
- "\2\12\1\0\1\12\1\0\1\12\2\u0117\1\175\1\0"+
- "\1\176\1\12\2\0\1\12\14\0\5\12\1\u0117\1\12"+
- "\1\u0117\1\12\1\u0117\3\12\1\u0117\10\12\43\0\1\u0118"+
- "\115\0\1\u0118\65\0\12\12\2\0\2\12\1\0\1\12"+
- "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\4\12"+
- "\1\u0119\21\12\17\0\12\12\2\0\2\12\1\0\1\12"+
- "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\4\12"+
- "\1\u011a\21\12\17\0\12\12\2\0\2\12\1\0\1\12"+
- "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\16\12"+
- "\1\u011b\7\12\17\0\12\12\2\0\2\12\1\0\1\12"+
- "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\4\12"+
- "\1\u011c\21\12\17\0\12\12\2\0\2\12\1\0\1\12"+
+ "\24\12\17\0\15\12\2\0\2\12\1\0\1\12\1\0"+
+ "\3\12\3\0\1\12\2\0\1\12\14\0\23\12\1\234"+
+ "\66\0\1\235\114\0\1\236\27\0\1\237\64\0\1\240"+
+ "\114\0\1\241\31\0\1\242\62\0\1\243\114\0\1\244"+
+ "\114\0\1\245\114\0\1\246\114\0\1\247\36\0\1\250"+
+ "\55\0\1\251\36\0\1\252\1\253\15\0\2\254\1\0"+
+ "\1\254\11\0\2\254\1\101\1\0\1\102\25\0\1\254"+
+ "\1\0\1\254\1\0\1\254\30\0\17\100\1\0\22\100"+
+ "\1\0\52\100\17\255\1\0\10\255\1\256\1\257\10\255"+
+ "\1\260\52\255\17\261\1\0\11\261\1\262\1\263\7\261"+
+ "\1\260\52\261\1\0\10\12\2\264\1\12\1\264\1\12"+
+ "\2\0\2\12\1\0\1\12\1\0\1\12\2\264\1\105"+
+ "\1\0\1\106\1\23\2\0\1\12\14\0\5\12\1\264"+
+ "\1\12\1\264\1\12\1\264\2\12\1\23\7\12\16\0"+
+ "\17\265\1\0\10\265\1\266\1\267\10\265\1\0\52\265"+
+ "\17\270\1\0\11\270\1\271\1\272\7\270\1\0\52\270"+
+ "\16\0\1\273\20\0\1\274\2\0\1\275\5\0\1\203"+
+ "\45\0\10\12\2\264\1\12\1\264\1\12\2\0\2\12"+
+ "\1\0\1\12\1\0\1\12\2\264\1\105\1\0\1\106"+
+ "\1\23\2\0\1\12\14\0\1\213\3\12\1\214\1\264"+
+ "\1\12\1\264\1\12\1\264\2\12\1\23\7\12\17\0"+
+ "\10\12\2\264\1\12\1\264\1\12\2\0\2\12\1\0"+
+ "\1\12\1\0\1\12\2\264\1\105\1\0\1\106\1\23"+
+ "\2\0\1\12\14\0\5\12\1\276\1\12\1\264\1\12"+
+ "\1\264\2\12\1\23\7\12\17\0\10\12\2\264\1\217"+
+ "\1\264\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+
+ "\2\264\1\105\1\0\1\106\1\23\2\0\1\12\14\0"+
+ "\5\12\1\264\1\12\1\264\1\12\1\264\1\220\1\12"+
+ "\1\23\7\12\16\0\17\113\1\0\10\113\1\0\1\277"+
+ "\1\0\1\113\1\300\5\113\1\0\52\113\30\0\1\301"+
+ "\64\0\34\113\2\0\1\302\56\113\32\0\1\303\116\0"+
+ "\1\113\61\0\10\12\2\304\1\12\1\304\1\12\2\0"+
+ "\2\12\1\0\1\12\1\0\1\12\2\304\1\122\1\0"+
+ "\1\123\1\124\2\0\1\12\14\0\5\12\1\304\1\12"+
+ "\1\304\1\12\1\304\2\12\1\124\7\12\16\0\17\305"+
+ "\1\0\10\305\1\306\1\307\10\305\1\0\52\305\17\310"+
+ "\1\0\11\310\1\311\1\312\7\310\1\0\52\310\1\0"+
+ "\10\12\2\313\1\12\1\313\1\12\2\0\2\12\1\0"+
+ "\1\12\1\0\1\12\2\313\1\314\1\0\1\315\1\12"+
+ "\2\0\1\12\14\0\5\12\1\313\1\12\1\313\1\12"+
+ "\1\313\12\12\16\0\17\316\1\0\10\316\1\0\1\316"+
+ "\1\0\2\316\1\0\1\316\1\0\1\316\2\0\4\316"+
+ "\1\0\1\202\44\316\50\0\1\317\45\0\10\12\2\304"+
+ "\1\12\1\304\1\12\2\0\2\12\1\0\1\12\1\0"+
+ "\1\12\2\304\1\122\1\0\1\123\1\124\2\0\1\12"+
+ "\14\0\1\213\3\12\1\214\1\304\1\12\1\304\1\12"+
+ "\1\304\2\12\1\124\7\12\17\0\10\12\2\304\1\12"+
+ "\1\304\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+
+ "\2\304\1\122\1\0\1\123\1\124\2\0\1\12\14\0"+
+ "\5\12\1\320\1\12\1\304\1\12\1\304\2\12\1\124"+
+ "\7\12\17\0\10\12\2\304\1\217\1\304\1\12\2\0"+
+ "\2\12\1\0\1\12\1\0\1\12\2\304\1\122\1\0"+
+ "\1\123\1\124\2\0\1\12\14\0\5\12\1\304\1\12"+
+ "\1\304\1\12\1\304\1\220\1\12\1\124\7\12\17\0"+
+ "\10\12\2\313\1\12\1\313\1\12\2\0\2\12\1\0"+
+ "\1\12\1\0\1\12\2\313\1\314\1\0\1\315\1\12"+
+ "\2\0\1\12\14\0\5\12\1\321\1\12\1\313\1\12"+
+ "\1\313\1\227\1\230\10\12\16\0\17\142\1\0\10\142"+
+ "\1\0\1\322\1\0\1\142\2\0\4\142\1\0\106\142"+
+ "\2\0\1\323\56\142\1\0\1\146\1\147\1\146\1\0"+
+ "\1\146\1\0\1\151\2\0\1\154\1\155\1\154\1\156"+
+ "\4\0\1\157\1\160\1\0\1\161\31\0\1\160\36\0"+
+ "\3\147\1\0\1\147\1\0\1\324\12\0\1\157\1\160"+
+ "\1\0\1\161\31\0\1\160\36\0\5\325\1\0\1\326"+
+ "\1\0\1\325\11\0\1\325\2\0\1\325\4\0\1\325"+
+ "\17\0\1\325\1\0\1\325\1\0\1\325\2\0\1\325"+
+ "\1\0\1\325\2\0\1\325\26\0\1\146\1\147\1\146"+
+ "\1\0\1\146\110\0\1\327\1\0\1\327\1\0\1\327"+
+ "\1\0\1\330\106\0\1\331\3\0\1\331\1\0\1\332"+
+ "\120\0\1\333\1\0\1\334\111\0\1\335\1\336\1\335"+
+ "\112\0\1\335\1\0\1\335\1\336\100\0\3\165\1\0"+
+ "\1\165\15\0\1\160\1\0\1\161\31\0\1\160\36\0"+
+ "\3\337\1\0\1\337\16\0\1\340\52\0\1\340\16\0"+
+ "\3\11\1\0\1\11\110\0\10\12\2\341\1\12\1\341"+
+ "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\341"+
+ "\1\20\1\0\1\22\1\23\2\0\1\12\14\0\5\12"+
+ "\1\341\1\12\1\341\1\12\1\341\2\12\1\23\7\12"+
+ "\17\0\15\12\2\0\2\12\1\0\1\12\1\0\3\12"+
+ "\3\0\1\12\2\0\1\12\14\0\20\12\1\342\3\12"+
+ "\17\0\3\165\1\0\1\165\1\0\1\343\13\0\1\160"+
+ "\1\0\1\161\31\0\1\160\35\0\17\170\1\0\10\170"+
+ "\1\344\1\172\10\170\1\173\52\170\30\0\1\345\1\346"+
+ "\5\0\1\347\1\0\1\347\1\173\7\0\1\173\42\0"+
+ "\115\170\17\174\1\0\11\174\1\175\1\344\7\174\1\173"+
+ "\167\174\31\0\1\346\1\350\4\0\1\347\1\0\1\347"+
+ "\1\173\7\0\1\173\43\0\10\12\2\351\1\12\1\351"+
+ "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\351"+
+ "\1\200\1\0\1\201\1\12\2\0\1\12\14\0\5\12"+
+ "\1\351\1\12\1\351\1\12\1\351\12\12\46\0\1\352"+
+ "\116\0\1\353\63\0\15\12\2\0\2\12\1\0\1\12"+
+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\2\12"+
+ "\1\354\21\12\17\0\15\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\3\12"+
- "\1\u011d\22\12\17\0\12\12\2\0\2\12\1\0\1\12"+
- "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\15\12"+
- "\1\u011e\10\12\17\0\12\12\2\0\2\12\1\0\1\12"+
- "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\u011f"+
- "\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\3\12\1\u0120"+
- "\22\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\6\12\1\u0121"+
- "\17\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\7\12\1\u0122"+
- "\16\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\13\12\1\u0123"+
- "\12\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\22\12\1\u0124"+
- "\3\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\1\u0125\25\12"+
- "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
- "\3\0\1\12\2\0\1\12\14\0\3\12\1\u0126\22\12"+
- "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
- "\3\0\1\12\2\0\1\12\14\0\12\12\1\u0127\13\12"+
- "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
- "\3\0\1\12\2\0\1\12\14\0\7\12\1\u0128\16\12"+
- "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
- "\3\0\1\12\2\0\1\12\14\0\12\12\1\u0129\13\12"+
- "\43\0\1\101\1\0\1\102\112\0\1\u0103\5\0\1\u0104"+
- "\1\0\1\u0104\1\256\7\0\1\256\44\0\25\u0102\1\u012a"+
- "\1\u012b\65\u0102\26\u0105\1\u012c\1\u012d\64\u0105\1\0\12\12"+
- "\2\0\2\12\1\0\1\12\1\0\3\12\1\105\1\0"+
- "\1\106\1\22\2\0\1\12\14\0\16\12\1\22\7\12"+
- "\16\0\25\u0108\1\u012e\1\u012f\65\u0108\26\u0109\1\u0130\1\u0131"+
- "\64\u0109\1\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\1\122\1\0\1\123\1\124\2\0\1\12\14\0"+
- "\16\12\1\124\7\12\16\0\25\u010d\1\u0132\1\u0133\65\u010d"+
- "\26\u010e\1\u0134\1\u0135\64\u010e\1\0\10\12\1\u0136\1\12"+
- "\2\0\2\12\1\0\1\12\1\0\1\12\2\u0136\1\312"+
- "\1\0\1\313\1\12\2\0\1\12\14\0\5\12\1\u0136"+
- "\1\12\1\u0136\1\12\1\u0136\3\12\1\u0136\10\12\43\0"+
- "\1\u0137\115\0\1\u0137\64\0\1\142\12\u0112\1\142\1\0"+
- "\2\u0112\1\142\1\u0112\1\142\3\u0112\1\0\1\320\1\0"+
- "\1\u0112\1\0\1\142\2\u0112\2\142\1\0\10\142\26\u0112"+
- "\16\142\25\336\1\u0138\1\u0139\201\336\142\341\1\u013a\1\u013b"+
- "\64\341\1\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\1\175\1\0\1\176\1\12\2\0\1\12\14\0"+
- "\26\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\5\12\1\u013c"+
- "\20\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\20\12\1\u013d"+
- "\5\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\4\12\1\u013e"+
- "\21\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\5\12\1\u013f"+
- "\20\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\10\12\1\u0140"+
- "\15\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\3\12\1\u0141"+
- "\22\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\14\12\1\u0142"+
- "\11\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\2\12\1\u0143"+
- "\23\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\5\12\1\u0144"+
- "\20\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\12\12\1\u0145"+
- "\13\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\2\12\1\u0146"+
- "\23\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\1\u0147\25\12"+
- "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
- "\3\0\1\12\2\0\1\12\14\0\4\12\1\u0148\21\12"+
- "\16\0\25\u0102\1\u0149\1\u014a\201\u0102\142\u0105\1\u014b\1\u014c"+
- "\64\u0105\25\u0108\1\u014d\1\u012f\201\u0108\142\u0109\1\u0130\1\u014e"+
- "\64\u0109\25\u010d\1\u014f\1\u0133\201\u010d\142\u010e\1\u0134\1\u0150"+
- "\64\u010e\1\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\1\312\1\0\1\313\1\12\2\0\1\12\14\0"+
- "\26\12\16\0\25\336\1\u0151\1\u0139\65\336\26\341\1\u013a"+
- "\1\u0151\64\341\1\0\12\12\2\0\2\12\1\0\1\12"+
+ "\1\355\20\12\17\0\15\12\2\0\2\12\1\0\1\12"+
"\1\0\3\12\3\0\1\12\2\0\1\12\14\0\6\12"+
- "\1\u0152\17\12\17\0\12\12\2\0\2\12\1\0\1\12"+
- "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\6\12"+
- "\1\u0153\17\12\17\0\12\12\2\0\2\12\1\0\1\12"+
- "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\12"+
- "\1\u0154\24\12\17\0\12\12\2\0\2\12\1\0\1\12"+
- "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\12"+
- "\1\u0155\24\12\17\0\12\12\2\0\2\12\1\0\1\12"+
- "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\u0156"+
- "\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\6\12\1\u0157"+
- "\17\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\12\12\1\u0158"+
- "\13\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+
- "\3\12\3\0\1\12\2\0\1\12\14\0\12\12\1\u0159"+
- "\13\12\16\0\25\u0102\1\u015a\1\u014a\65\u0102\26\u0105\1\u014b"+
- "\1\u015a\64\u0105\25\u0108\1\u015b\1\u012f\65\u0108\26\u0109\1\u0130"+
- "\1\u015b\64\u0109\25\u010d\1\u015c\1\u0133\65\u010d\26\u010e\1\u0134"+
- "\1\u015c\64\u010e\26\0\1\u015d\5\0\1\u015e\1\0\1\u015e"+
- "\1\u015f\7\0\1\u015f\45\0\12\12\2\0\2\12\1\0"+
+ "\1\356\15\12\17\0\12\12\1\357\2\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\14\12\1\360\7\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\3\12\1\361\7\12\1\362\10\12\17\0\15\12"+
+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
+ "\2\0\1\12\14\0\11\12\1\363\12\12\17\0\15\12"+
+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
+ "\2\0\1\12\14\0\13\12\1\364\10\12\17\0\15\12"+
+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
+ "\2\0\1\12\14\0\6\12\1\365\15\12\17\0\15\12"+
+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
+ "\2\0\1\12\14\0\17\12\1\366\4\12\17\0\10\12"+
+ "\2\341\1\12\1\341\1\12\2\0\2\12\1\0\1\12"+
+ "\1\0\1\12\2\341\1\20\1\0\1\22\1\23\2\0"+
+ "\1\12\14\0\4\12\1\367\1\341\1\12\1\341\1\12"+
+ "\1\341\2\12\1\23\7\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\1\370\23\12\17\0\15\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
- "\15\12\1\u0160\10\12\17\0\12\12\2\0\2\12\1\0"+
+ "\1\12\1\371\22\12\17\0\15\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
- "\21\12\1\u0161\4\12\17\0\12\12\2\0\2\12\1\0"+
+ "\16\12\1\372\5\12\17\0\10\12\2\351\1\12\1\351"+
+ "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\351"+
+ "\1\200\1\0\1\201\1\12\2\0\1\12\14\0\5\12"+
+ "\1\351\1\12\1\351\1\12\1\351\1\373\11\12\17\0"+
+ "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
+ "\1\12\2\0\1\12\14\0\5\12\1\374\16\12\17\0"+
+ "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
+ "\1\12\2\0\1\12\14\0\1\12\1\375\22\12\17\0"+
+ "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
+ "\1\12\2\0\1\12\14\0\3\12\1\376\20\12\17\0"+
+ "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
+ "\1\12\2\0\1\12\14\0\4\12\1\377\17\12\17\0"+
+ "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
+ "\1\12\2\0\1\12\14\0\12\12\1\u0100\11\12\17\0"+
+ "\15\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+
+ "\1\12\2\0\1\12\14\0\13\12\1\u0101\10\12\66\0"+
+ "\1\u0102\114\0\1\u0103\114\0\1\u0104\114\0\1\u0105\55\0"+
+ "\2\u0106\1\0\1\u0106\11\0\2\u0106\1\101\1\0\1\102"+
+ "\25\0\1\u0106\1\0\1\u0106\1\0\1\u0106\30\0\17\255"+
+ "\1\0\10\255\1\u0107\1\257\10\255\1\260\52\255\30\0"+
+ "\1\u0108\1\u0109\5\0\1\u010a\1\0\1\u010a\1\260\7\0"+
+ "\1\260\42\0\115\255\17\261\1\0\11\261\1\262\1\u0107"+
+ "\7\261\1\260\167\261\31\0\1\u0109\1\u010b\4\0\1\u010a"+
+ "\1\0\1\u010a\1\260\7\0\1\260\43\0\10\12\2\u010c"+
+ "\1\12\1\u010c\1\12\2\0\2\12\1\0\1\12\1\0"+
+ "\1\12\2\u010c\1\105\1\0\1\106\1\23\2\0\1\12"+
+ "\14\0\5\12\1\u010c\1\12\1\u010c\1\12\1\u010c\2\12"+
+ "\1\23\7\12\16\0\17\265\1\0\10\265\1\u010d\1\267"+
+ "\10\265\1\0\52\265\30\0\1\u010e\64\0\115\265\17\270"+
+ "\1\0\11\270\1\271\1\u010d\7\270\1\0\167\270\32\0"+
+ "\1\u010f\62\0\17\273\1\0\22\273\1\275\52\273\16\0"+
+ "\1\273\20\0\1\274\2\0\1\275\53\0\10\12\2\u010c"+
+ "\1\12\1\u010c\1\12\2\0\2\12\1\0\1\12\1\0"+
+ "\1\12\2\u010c\1\105\1\0\1\106\1\23\2\0\1\12"+
+ "\14\0\4\12\1\367\1\u010c\1\12\1\u010c\1\12\1\u010c"+
+ "\2\12\1\23\7\12\46\0\1\u0110\64\0\17\113\1\0"+
+ "\10\113\1\0\1\277\1\0\1\113\1\302\5\113\1\0"+
+ "\52\113\32\0\1\u0110\63\0\10\12\2\u0111\1\12\1\u0111"+
+ "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\u0111"+
+ "\1\122\1\0\1\123\1\124\2\0\1\12\14\0\5\12"+
+ "\1\u0111\1\12\1\u0111\1\12\1\u0111\2\12\1\124\7\12"+
+ "\16\0\17\305\1\0\10\305\1\u0112\1\307\10\305\1\0"+
+ "\52\305\30\0\1\u0113\64\0\115\305\17\310\1\0\11\310"+
+ "\1\311\1\u0112\7\310\1\0\167\310\32\0\1\u0114\63\0"+
+ "\10\12\2\u0115\1\12\1\u0115\1\12\2\0\2\12\1\0"+
+ "\1\12\1\0\1\12\2\u0115\1\314\1\0\1\315\1\12"+
+ "\2\0\1\12\14\0\5\12\1\u0115\1\12\1\u0115\1\12"+
+ "\1\u0115\12\12\46\0\1\u0116\116\0\1\u0117\62\0\17\316"+
+ "\1\0\10\316\1\0\1\316\1\0\2\316\1\0\1\316"+
+ "\1\0\1\316\2\0\4\316\2\0\44\316\1\0\10\12"+
+ "\2\u0111\1\12\1\u0111\1\12\2\0\2\12\1\0\1\12"+
+ "\1\0\1\12\2\u0111\1\122\1\0\1\123\1\124\2\0"+
+ "\1\12\14\0\4\12\1\367\1\u0111\1\12\1\u0111\1\12"+
+ "\1\u0111\2\12\1\124\7\12\17\0\10\12\2\u0115\1\12"+
+ "\1\u0115\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+
+ "\2\u0115\1\314\1\0\1\315\1\12\2\0\1\12\14\0"+
+ "\5\12\1\u0115\1\12\1\u0115\1\12\1\u0115\1\373\11\12"+
+ "\16\0\17\142\1\0\10\142\1\0\1\322\1\0\1\142"+
+ "\1\u0118\1\0\4\142\1\0\52\142\1\0\3\147\1\0"+
+ "\1\147\110\0\5\325\1\0\1\326\1\0\1\325\1\154"+
+ "\1\155\1\154\1\156\5\0\1\325\2\0\1\325\4\0"+
+ "\1\325\17\0\1\325\1\0\1\325\1\0\1\325\2\0"+
+ "\1\325\1\0\1\325\2\0\1\325\26\0\5\325\3\0"+
+ "\1\325\11\0\1\325\2\0\1\325\4\0\1\325\17\0"+
+ "\1\325\1\0\1\325\1\0\1\325\2\0\1\325\1\0"+
+ "\1\325\2\0\1\325\26\0\1\327\1\0\1\327\1\0"+
+ "\1\327\1\0\1\330\2\0\1\154\1\155\1\154\1\156"+
+ "\100\0\1\327\1\0\1\327\1\0\1\327\110\0\1\331"+
+ "\3\0\1\331\1\0\1\332\2\0\1\154\1\155\1\154"+
+ "\1\156\100\0\1\331\3\0\1\331\122\0\1\335\116\0"+
+ "\1\335\111\0\1\335\1\0\1\335\101\0\3\337\1\0"+
+ "\1\337\1\0\1\340\15\0\1\161\70\0\3\337\1\0"+
+ "\1\337\110\0\15\12\2\0\2\12\1\0\1\12\1\0"+
+ "\3\12\1\20\1\0\1\22\1\23\2\0\1\12\14\0"+
+ "\14\12\1\23\7\12\17\0\15\12\2\0\2\12\1\0"+
"\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
- "\4\12\1\u0162\21\12\16\0";
+ "\7\12\1\u0119\14\12\47\0\1\346\5\0\1\347\1\0"+
+ "\1\347\1\173\7\0\1\173\42\0\30\345\1\u011a\1\u011b"+
+ "\63\345\31\350\1\u011c\1\u011d\62\350\1\0\10\12\2\u011e"+
+ "\1\12\1\u011e\1\12\2\0\2\12\1\0\1\12\1\0"+
+ "\1\12\2\u011e\1\200\1\0\1\201\1\12\2\0\1\12"+
+ "\14\0\5\12\1\u011e\1\12\1\u011e\1\12\1\u011e\12\12"+
+ "\46\0\1\u011f\116\0\1\u011f\63\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\4\12\1\u0120\17\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\4\12\1\u0121\17\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\14\12\1\u0122\7\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\4\12\1\u0123\17\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\3\12\1\u0124\20\12\17\0\11\12\1\u0125\3\12"+
+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
+ "\2\0\1\12\14\0\24\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\1\u0126\23\12\17\0\15\12\2\0\2\12\1\0"+
+ "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
+ "\3\12\1\u0127\20\12\17\0\15\12\2\0\2\12\1\0"+
+ "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
+ "\6\12\1\u0128\15\12\17\0\15\12\2\0\2\12\1\0"+
+ "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
+ "\12\12\1\u0129\11\12\17\0\15\12\2\0\2\12\1\0"+
+ "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
+ "\20\12\1\u012a\3\12\17\0\15\12\2\0\2\12\1\0"+
+ "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
+ "\1\u012b\23\12\17\0\15\12\2\0\2\12\1\0\1\12"+
+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\3\12"+
+ "\1\u012c\20\12\17\0\12\12\1\u012d\2\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\24\12\17\0\15\12\2\0\2\12\1\0\1\12"+
+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\7\12"+
+ "\1\u012e\14\12\17\0\12\12\1\u012f\2\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\24\12\46\0\1\101\1\0\1\102\113\0\1\u0109"+
+ "\5\0\1\u010a\1\0\1\u010a\1\260\7\0\1\260\42\0"+
+ "\30\u0108\1\u0130\1\u0131\63\u0108\31\u010b\1\u0132\1\u0133\62\u010b"+
+ "\1\0\15\12\2\0\2\12\1\0\1\12\1\0\3\12"+
+ "\1\105\1\0\1\106\1\23\2\0\1\12\14\0\14\12"+
+ "\1\23\7\12\16\0\30\u010e\1\u0134\1\u0135\63\u010e\31\u010f"+
+ "\1\u0136\1\u0137\62\u010f\1\0\15\12\2\0\2\12\1\0"+
+ "\1\12\1\0\3\12\1\122\1\0\1\123\1\124\2\0"+
+ "\1\12\14\0\14\12\1\124\7\12\16\0\30\u0113\1\u0138"+
+ "\1\u0139\63\u0113\31\u0114\1\u013a\1\u013b\62\u0114\1\0\10\12"+
+ "\2\u013c\1\12\1\u013c\1\12\2\0\2\12\1\0\1\12"+
+ "\1\0\1\12\2\u013c\1\314\1\0\1\315\1\12\2\0"+
+ "\1\12\14\0\5\12\1\u013c\1\12\1\u013c\1\12\1\u013c"+
+ "\12\12\46\0\1\u013d\116\0\1\u013d\62\0\1\142\15\u0118"+
+ "\1\142\1\0\2\u0118\1\142\1\u0118\1\142\3\u0118\1\0"+
+ "\1\322\1\0\1\u0118\1\0\1\142\2\u0118\2\142\1\0"+
+ "\10\142\24\u0118\16\142\1\0\15\12\2\0\2\12\1\0"+
+ "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
+ "\2\12\1\u013e\21\12\16\0\30\345\1\u013f\1\u0140\200\345"+
+ "\146\350\1\u0141\1\u0142\62\350\1\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\1\200\1\0\1\201\1\12"+
+ "\2\0\1\12\14\0\24\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\5\12\1\u0143\16\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\16\12\1\u0144\5\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\4\12\1\u0145\17\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\5\12\1\u0146\16\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\10\12\1\u0147\13\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\3\12\1\u0148\20\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\13\12\1\u0149\10\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\5\12\1\u014a\16\12\17\0\12\12\1\u014b\2\12"+
+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
+ "\2\0\1\12\14\0\24\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\2\12\1\u014c\21\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\1\u014d\23\12\17\0\15\12\2\0\2\12\1\0"+
+ "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+
+ "\4\12\1\u014e\17\12\16\0\30\u0108\1\u014f\1\u0150\200\u0108"+
+ "\146\u010b\1\u0151\1\u0152\62\u010b\30\u010e\1\u0153\1\u0135\200\u010e"+
+ "\146\u010f\1\u0136\1\u0154\62\u010f\30\u0113\1\u0155\1\u0139\200\u0113"+
+ "\146\u0114\1\u013a\1\u0156\62\u0114\1\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\1\314\1\0\1\315\1\12"+
+ "\2\0\1\12\14\0\24\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\1\u0157\23\12\16\0\30\345\1\u0158\1\u0140\63\345"+
+ "\31\350\1\u0141\1\u0158\62\350\1\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\6\12\1\u0159\15\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\6\12\1\u015a\15\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\1\12\1\u015b\22\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\1\12\1\u015c\22\12\17\0\15\12\2\0\2\12"+
+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+
+ "\14\0\6\12\1\u015d\15\12\17\0\12\12\1\u015e\2\12"+
+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
+ "\2\0\1\12\14\0\24\12\17\0\12\12\1\u015f\2\12"+
+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
+ "\2\0\1\12\14\0\24\12\16\0\30\u0108\1\u0160\1\u0150"+
+ "\63\u0108\31\u010b\1\u0151\1\u0160\62\u010b\30\u010e\1\u0161\1\u0135"+
+ "\63\u010e\31\u010f\1\u0136\1\u0161\62\u010f\30\u0113\1\u0162\1\u0139"+
+ "\63\u0113\31\u0114\1\u013a\1\u0162\62\u0114\31\0\1\u0163\5\0"+
+ "\1\u0164\1\0\1\u0164\1\u0165\7\0\1\u0165\43\0\11\12"+
+ "\1\u0166\3\12\2\0\2\12\1\0\1\12\1\0\3\12"+
+ "\3\0\1\12\2\0\1\12\14\0\24\12\17\0\15\12"+
+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
+ "\2\0\1\12\14\0\17\12\1\u0167\4\12\17\0\15\12"+
+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
+ "\2\0\1\12\14\0\4\12\1\u0168\17\12\16\0";
private static int [] zzUnpackTrans() {
- int [] result = new int[19076];
+ int [] result = new int[19789];
int offset = 0;
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
return result;
@@ -744,23 +749,23 @@ class _PythonLexer implements FlexLexerEx {
private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
private static final String ZZ_ATTRIBUTE_PACKED_0 =
- "\6\0\1\11\10\1\1\11\2\1\3\11\1\1\6\11"+
- "\2\1\2\11\32\1\4\11\4\1\1\11\14\1\1\11"+
+ "\6\0\1\11\11\1\1\11\2\1\3\11\1\1\6\11"+
+ "\2\1\2\11\31\1\4\11\4\1\1\11\14\1\1\11"+
"\4\1\2\11\1\1\5\11\7\1\2\11\1\1\5\0"+
- "\1\11\1\1\1\0\1\11\1\0\2\1\2\11\3\1"+
- "\1\11\6\1\3\11\31\1\2\11\1\1\2\11\1\1"+
- "\5\11\1\1\2\11\1\1\1\0\3\1\1\11\12\1"+
- "\2\0\1\11\1\1\2\0\16\1\1\11\2\1\1\0"+
- "\1\1\1\0\1\1\1\0\1\1\1\0\1\1\1\0"+
- "\1\1\1\0\1\1\1\0\2\1\1\11\1\0\2\1"+
- "\2\0\27\1\4\11\1\0\2\1\1\11\1\0\2\1"+
- "\1\11\2\1\1\11\1\1\1\11\3\1\2\0\1\1"+
- "\1\0\2\1\1\0\1\1\1\11\21\1\1\0\2\1"+
- "\11\0\1\1\1\11\4\0\15\1\10\0\12\1\3\11"+
- "\1\0\1\11\3\1";
+ "\4\1\1\0\1\11\1\0\3\1\2\11\3\1\1\11"+
+ "\6\1\3\11\30\1\2\11\1\1\2\11\1\1\5\11"+
+ "\1\1\2\11\1\1\1\0\3\1\1\11\12\1\2\0"+
+ "\1\11\1\1\2\0\16\1\1\11\2\1\1\0\1\1"+
+ "\1\0\1\1\1\0\1\1\1\0\1\1\1\0\2\1"+
+ "\1\11\2\1\1\0\2\1\1\0\2\1\1\11\1\0"+
+ "\2\1\2\0\26\1\4\11\1\0\2\1\1\11\1\0"+
+ "\2\1\1\11\2\1\1\11\1\1\1\11\3\1\2\0"+
+ "\2\1\1\0\2\1\1\0\1\1\1\11\20\1\1\0"+
+ "\2\1\11\0\1\1\1\11\1\1\4\0\14\1\10\0"+
+ "\12\1\3\11\1\0\1\11\3\1";
private static int [] zzUnpackAttribute() {
- int [] result = new int[354];
+ int [] result = new int[360];
int offset = 0;
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
return result;
@@ -1641,22 +1646,22 @@ return PyTokenTypes.DOCSTRING;
// fall through
case 233: break;
case 113:
- { return PyTokenTypes.ASSERT_KEYWORD;
+ { return PyTokenTypes.LAMBDA_KEYWORD;
}
// fall through
case 234: break;
case 114:
- { return PyTokenTypes.EXCEPT_KEYWORD;
+ { return PyTokenTypes.ASSERT_KEYWORD;
}
// fall through
case 235: break;
case 115:
- { return PyTokenTypes.RETURN_KEYWORD;
+ { return PyTokenTypes.EXCEPT_KEYWORD;
}
// fall through
case 236: break;
case 116:
- { return PyTokenTypes.LAMBDA_KEYWORD;
+ { return PyTokenTypes.RETURN_KEYWORD;
}
// fall through
case 237: break;
diff --git a/python/python-psi-impl/src/com/jetbrains/python/lexer/Python.flex b/python/python-psi-impl/src/com/jetbrains/python/lexer/Python.flex
index 00ec89f230cf..b16e8328e433 100644
--- a/python/python-psi-impl/src/com/jetbrains/python/lexer/Python.flex
+++ b/python/python-psi-impl/src/com/jetbrains/python/lexer/Python.flex
@@ -24,7 +24,8 @@ OCTINTEGER = 0[Oo]?("_"?{OCTDIGIT})+
BININTEGER = 0[Bb]("_"?{BINDIGIT})+
DECIMALINTEGER = (({NONZERODIGIT}("_"?{DIGIT})*)|0)
INTEGER = {DECIMALINTEGER}|{OCTINTEGER}|{HEXINTEGER}|{BININTEGER}
-LONGINTEGER = {INTEGER}[Ll]
+INTEGER_SUFFIX = u|l|ll|U|L|LL|ul|ull|lu|llu|uL|Ul|UL|uLL|Ull|ULL|lU|Lu|LU|llU|LLu|LLU
+LONGINTEGER = {INTEGER}{INTEGER_SUFFIX}
END_OF_LINE_COMMENT="#"[^\r\n]*
diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyNumericLiteralExpressionImpl.java b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyNumericLiteralExpressionImpl.java
index 4e912bf823cb..2a0f749c1160 100644
--- a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyNumericLiteralExpressionImpl.java
+++ b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyNumericLiteralExpressionImpl.java
@@ -87,6 +87,12 @@ public class PyNumericLiteralExpressionImpl extends PyElementImpl implements PyN
return getNode().getElementType() == PyElementTypes.INTEGER_LITERAL_EXPRESSION;
}
+ @Nullable
+ @Override
+ public String getIntegerLiteralSuffix() {
+ return isIntegerLiteral() ? StringUtil.nullize(retrieveSuffix(getText())) : null;
+ }
+
@Override
@Nullable
public PyType getType(@NotNull TypeEvalContext context, @NotNull TypeEvalContext.Key key) {
@@ -107,7 +113,7 @@ public class PyNumericLiteralExpressionImpl extends PyElementImpl implements PyN
@Nullable
private static BigInteger getBigIntegerValue(@NotNull String text) {
- if (text.equals("0") || text.equalsIgnoreCase("0l")) {
+ if (text.equalsIgnoreCase("0" + retrieveSuffix(text))) {
return BigInteger.ZERO;
}
@@ -141,9 +147,18 @@ public class PyNumericLiteralExpressionImpl extends PyElementImpl implements PyN
@NotNull
private static String prepareLiteralForJava(@NotNull String text, int beginIndex) {
- final int endIndex =
- StringUtil.endsWithIgnoreCase(text, "l") || StringUtil.endsWithIgnoreCase(text, "j") ? text.length() - 1 : text.length();
-
+ int endIndex = text.length() - retrieveSuffix(text).length();
return text.substring(beginIndex, endIndex).replaceAll("_", "");
}
+
+ @NotNull
+ private static String retrieveSuffix(@NotNull String text) {
+ int lastIndex = text.length();
+ while (lastIndex > 0) {
+ char last = text.charAt(lastIndex - 1);
+ if (last != 'u' && last != 'U' && last != 'l' && last != 'L' && last != 'j' && last != 'J') break;
+ --lastIndex;
+ }
+ return text.substring(lastIndex);
+ }
}
diff --git a/python/src/com/jetbrains/python/inspections/quickfix/RemoveTrailingLQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/RemoveTrailingSuffixQuickFix.java
similarity index 71%
rename from python/src/com/jetbrains/python/inspections/quickfix/RemoveTrailingLQuickFix.java
rename to python/src/com/jetbrains/python/inspections/quickfix/RemoveTrailingSuffixQuickFix.java
index 17b8061cec97..38b355d3fcef 100644
--- a/python/src/com/jetbrains/python/inspections/quickfix/RemoveTrailingLQuickFix.java
+++ b/python/src/com/jetbrains/python/inspections/quickfix/RemoveTrailingSuffixQuickFix.java
@@ -29,21 +29,25 @@ import org.jetbrains.annotations.NotNull;
* Created by IntelliJ IDEA.
* Author: Alexey.Ivanov
*/
-public class RemoveTrailingLQuickFix implements LocalQuickFix {
+public class RemoveTrailingSuffixQuickFix implements LocalQuickFix {
+
@NotNull
@Override
public String getFamilyName() {
- return PyBundle.message("INTN.remove.trailing.l");
+ return PyBundle.message("INTN.remove.trailing.suffix");
}
@Override
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
PsiElement numericLiteralExpression = descriptor.getPsiElement();
if (numericLiteralExpression instanceof PyNumericLiteralExpression) {
- PyElementGenerator elementGenerator = PyElementGenerator.getInstance(project);
- String text = numericLiteralExpression.getText();
- final LanguageLevel level = LanguageLevel.forElement(numericLiteralExpression);
- numericLiteralExpression.replace(elementGenerator.createExpressionFromText(level, text.substring(0, text.length() - 1)));
+ PyNumericLiteralExpression numeric = (PyNumericLiteralExpression)numericLiteralExpression;
+ String suffix = numeric.getIntegerLiteralSuffix();
+ if (suffix == null) return;
+ String text = numeric.getText();
+ String newText = text.substring(0, text.length() - suffix.length());
+ numeric.replace(
+ PyElementGenerator.getInstance(project).createExpressionFromText(LanguageLevel.forElement(numeric), newText));
}
}
}
diff --git a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java
index 71c8ae5e9c5e..f98d50cdbed5 100644
--- a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java
+++ b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java
@@ -216,11 +216,12 @@ public abstract class CompatibilityVisitor extends PyAnnotator {
final String text = node.getText();
if (node.isIntegerLiteral()) {
- if (text.endsWith("l") || text.endsWith("L")) {
+ String suffix = node.getIntegerLiteralSuffix();
+ if ("l".equalsIgnoreCase(suffix)) {
registerForAllMatchingVersions(level -> level.isPy3K() && registerForLanguageLevel(level),
- " not support a trailing \'l\' or \'L\'.",
+ " not support a trailing '" + suffix + "'.",
node,
- new RemoveTrailingLQuickFix());
+ new RemoveTrailingSuffixQuickFix());
}
if (text.length() > 1 && text.charAt(0) == '0') {
diff --git a/python/src/com/jetbrains/python/validation/PyHighlightingAnnotator.java b/python/src/com/jetbrains/python/validation/PyHighlightingAnnotator.java
index 080104a111c7..1c1432841477 100644
--- a/python/src/com/jetbrains/python/validation/PyHighlightingAnnotator.java
+++ b/python/src/com/jetbrains/python/validation/PyHighlightingAnnotator.java
@@ -23,6 +23,7 @@ import com.intellij.psi.PsiFile;
import com.intellij.psi.tree.TokenSet;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyTokenTypes;
+import com.jetbrains.python.PythonLanguage;
import com.jetbrains.python.highlighting.PyHighlighter;
import com.jetbrains.python.psi.*;
import org.jetbrains.annotations.NotNull;
@@ -49,6 +50,15 @@ public class PyHighlightingAnnotator extends PyAnnotator implements HighlightRan
}
}
+ @Override
+ public void visitPyNumericLiteralExpression(PyNumericLiteralExpression node) {
+ String suffix = node.getIntegerLiteralSuffix();
+ if (suffix == null || "l".equalsIgnoreCase(suffix)) return;
+ if (node.getContainingFile().getLanguage() != PythonLanguage.getInstance()) return;
+ getHolder().newAnnotation(HighlightSeverity.ERROR, PyBundle.message("INSP.python.trailing.suffix.not.support", suffix))
+ .range(node).create();
+ }
+
@Override
public void visitPyForStatement(PyForStatement node) {
highlightKeyword(node, PyTokenTypes.ASYNC_KEYWORD);
diff --git a/python/testData/highlighting/implicitOctLongInteger.py b/python/testData/highlighting/implicitOctLongInteger.py
index e581d3f59128..5466dfd85add 100644
--- a/python/testData/highlighting/implicitOctLongInteger.py
+++ b/python/testData/highlighting/implicitOctLongInteger.py
@@ -1 +1 @@
-01234L
\ No newline at end of file
+01234L
\ No newline at end of file
diff --git a/python/testData/highlighting/unsupportedFeaturesInPython3.py b/python/testData/highlighting/unsupportedFeaturesInPython3.py
index fb471df41212..b04973039ef7 100644
--- a/python/testData/highlighting/unsupportedFeaturesInPython3.py
+++ b/python/testData/highlighting/unsupportedFeaturesInPython3.py
@@ -1,8 +1,13 @@
print(a <> 3)
`foo()`
-a = 123l
+a = 123l
a = 043
a = 0X43
+a = 0X43
+a = 0x43
+a = 0O43
+a = 0o43
+a = 0B1
a = 0b1
a = 0.0
s = u"text"
diff --git a/python/testData/inspections/PyCompatibilityInspection/numericLiteralExpression.py b/python/testData/inspections/PyCompatibilityInspection/numericLiteralExpression.py
index 9481e754892a..1c479ce23370 100644
--- a/python/testData/inspections/PyCompatibilityInspection/numericLiteralExpression.py
+++ b/python/testData/inspections/PyCompatibilityInspection/numericLiteralExpression.py
@@ -1,2 +1,23 @@
-a = 12l
-v = 048
\ No newline at end of file
+a = 12u
+b = 12l
+c = 12ll
+d = 12U
+e = 12L
+f = 12LL
+g = 0x12ful
+h = 0X12fuL
+i = 12Ul
+j = 12UL
+k = 0o12ull
+l = 0O12uLL
+m = 0b1Ull
+n = 0B1ULL
+o = 12lu
+p = 12lU
+q = 12Lu
+r = 12LU
+s = 12llu
+t = 12llU
+u = 12LLu
+v = 12LLU
+w = 048
\ No newline at end of file
diff --git a/python/testData/quickFixes/PyRemoveTrailingSuffixQuickFixTest/fixl.py b/python/testData/quickFixes/PyRemoveTrailingSuffixQuickFixTest/fixl.py
new file mode 100644
index 000000000000..f61ec245ccb7
--- /dev/null
+++ b/python/testData/quickFixes/PyRemoveTrailingSuffixQuickFixTest/fixl.py
@@ -0,0 +1 @@
+1000l
\ No newline at end of file
diff --git a/python/testData/quickFixes/PyRemoveTrailingSuffixQuickFixTest/fixl_after.py b/python/testData/quickFixes/PyRemoveTrailingSuffixQuickFixTest/fixl_after.py
new file mode 100644
index 000000000000..e37d32abba42
--- /dev/null
+++ b/python/testData/quickFixes/PyRemoveTrailingSuffixQuickFixTest/fixl_after.py
@@ -0,0 +1 @@
+1000
\ No newline at end of file
diff --git a/python/testSrc/com/jetbrains/python/PyNumericLiteralTest.java b/python/testSrc/com/jetbrains/python/PyNumericLiteralTest.java
index e8fd29363680..7fd71f9c6691 100644
--- a/python/testSrc/com/jetbrains/python/PyNumericLiteralTest.java
+++ b/python/testSrc/com/jetbrains/python/PyNumericLiteralTest.java
@@ -369,6 +369,33 @@ public class PyNumericLiteralTest extends PyTestCase {
doTestMoreThanLongComplexLiteral("9_22_337_2036_85477_5808J", expectedInt2, new BigDecimal("9223372036854775808"));
}
+ // PY-14844
+ public void testIntegerLiteralSuffix() {
+ doTestSuffix("1000", "u");
+ doTestSuffix("1000", "l");
+ doTestSuffix("1000", "ll");
+ doTestSuffix("1000", "U");
+ doTestSuffix("1000", "L");
+ doTestSuffix("1000", "LL");
+ doTestSuffix("1000", "ul");
+ doTestSuffix("1000", "Ul");
+ doTestSuffix("1000", "uL");
+ doTestSuffix("1000", "UL");
+ doTestSuffix("1000", "lu");
+ doTestSuffix("1000", "Lu");
+ doTestSuffix("1000", "lU");
+ doTestSuffix("1000", "LU");
+ doTestSuffix("1000", "ull");
+ doTestSuffix("1000", "Ull");
+ doTestSuffix("1000", "uLL");
+ doTestSuffix("1000", "ULL");
+ doTestSuffix("1000", "llu");
+ doTestSuffix("1000", "LLu");
+ doTestSuffix("1000", "llU");
+ doTestSuffix("1000", "LLU");
+ doTestSuffix("1000", null);
+ }
+
private void doTestIntegerLiteral(@NotNull String text, int expected) {
doTestLiteral(text, true, Long.valueOf(expected), BigInteger.valueOf(expected), BigDecimal.valueOf(expected), "int");
}
@@ -411,6 +438,11 @@ public class PyNumericLiteralTest extends PyTestCase {
assertEquals(expectedType, type.getName());
}
+ private void doTestSuffix(@NotNull String text, @Nullable String suffix) {
+ final PyNumericLiteralExpression literal = configureByText(text + (suffix == null ? "" : suffix));
+ assertEquals(suffix, literal.getIntegerLiteralSuffix());
+ }
+
@NotNull
private PyNumericLiteralExpression configureByText(@NotNull String text) {
final PsiElement element = myFixture.configureByText(PythonFileType.INSTANCE, text).findElementAt(0);
diff --git a/python/testSrc/com/jetbrains/python/PyQuickFixTestCase.java b/python/testSrc/com/jetbrains/python/PyQuickFixTestCase.java
index e533bc0891d3..4368f3ed6ad6 100644
--- a/python/testSrc/com/jetbrains/python/PyQuickFixTestCase.java
+++ b/python/testSrc/com/jetbrains/python/PyQuickFixTestCase.java
@@ -37,6 +37,20 @@ public abstract class PyQuickFixTestCase extends PyTestCase {
myFixture.checkResultByFile(testFileName + "_after.py", true);
}
+ protected void doQuickFixTest(final String hint, LanguageLevel languageLevel) {
+ runWithLanguageLevel(languageLevel, () -> doQuickFixTest(hint));
+ }
+
+ protected void doQuickFixTest(final String hint) {
+ String testName = getTestName(true);
+ myFixture.configureByFile(testName + ".py");
+ myFixture.checkHighlighting(true, false, false);
+ final IntentionAction intentionAction = myFixture.findSingleIntention(hint);
+ assertNotNull(intentionAction);
+ myFixture.launchAction(intentionAction);
+ myFixture.checkResultByFile(testName + "_after.py");
+ }
+
protected void doInspectionTest(final Class inspectionClass) {
final String testFileName = getTestName(true);
myFixture.enableInspections(inspectionClass);
diff --git a/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java b/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java
index 3fed825cbb61..eb1445aca559 100644
--- a/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java
+++ b/python/testSrc/com/jetbrains/python/intentions/PyIntentionTest.java
@@ -93,7 +93,7 @@ public class PyIntentionTest extends PyTestCase {
// PY-18972
public void testRemoveTrailingL() {
- doTest(PyBundle.message("INTN.remove.trailing.l"), LanguageLevel.PYTHON34);
+ doTest(PyBundle.message("INTN.remove.trailing.suffix"), LanguageLevel.PYTHON34);
}
public void testReplaceOctalNumericLiteral() {
diff --git a/python/testSrc/com/jetbrains/python/quickFixes/PyRemoveTrailingSuffixQuickFixTest.java b/python/testSrc/com/jetbrains/python/quickFixes/PyRemoveTrailingSuffixQuickFixTest.java
new file mode 100644
index 000000000000..690dd8ae858c
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/quickFixes/PyRemoveTrailingSuffixQuickFixTest.java
@@ -0,0 +1,31 @@
+// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+package com.jetbrains.python.quickFixes;
+
+import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl;
+import com.jetbrains.python.PyBundle;
+import com.jetbrains.python.PyQuickFixTestCase;
+import com.jetbrains.python.psi.LanguageLevel;
+
+import java.util.ListResourceBundle;
+
+public class PyRemoveTrailingSuffixQuickFixTest extends PyQuickFixTestCase {
+
+ private static final ListResourceBundle MESSAGE_BUNDLE = new ListResourceBundle() {
+ @Override
+ protected Object[][] getContents() {
+ return new Object[][] {
+ new Object[] { "bad-trail", "Python version " + LanguageLevel.getLatest() + " does not support a trailing ''{0}''." }
+ };
+ }
+ };
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ ((CodeInsightTestFixtureImpl)myFixture).setMessageBundles(MESSAGE_BUNDLE);
+ }
+
+ public void testFixl() {
+ doQuickFixTest(PyBundle.message("INTN.remove.trailing.suffix"), LanguageLevel.getLatest());
+ }
+}